gpt4 book ai didi

java - 当 Component 不再可见时有没有办法获得通知,因为 parent 已从集合中删除?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:57:44 25 4
gpt4 key购买 nike

假设我有一个简单的 JFrame 和一个包含 3 个面板的 JTabbedPane,第二个面板包含一个 JComponent。当“Tab 2”面板从其容器中移除时,有没有办法通知 JComponent?我的问题是 JComponent 可能在层次结构中很深。

显然,我在这里寻找 SWING 解决方案...:)

 ,'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''`.
| |
| ,----------Y....................... |
| | Tab 1 | Tab 2 | Tab 3 | |
| :..........: :..................................... |
| | | |
| | | |
| | | |
| | +--------------------+ | |
| | |Some JComponent here| | |
| | +--------------------+ | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| `-----------------------------------------------------------' |
`-----------------------------------------------------------------

我试着用 ancestorRemoved 来做到这一点(), 但没有运气......我显然做错了什么......

附言。 ASCII 艺术是用 JavE 制作的.

最佳答案

我将使用 ComponentListener 来完成这项工作(CardLayout 非常接近,与 JTabbedPane 相比类似),代码示例包含所有相关的监听器(免责声明 --> 注意阻止 EDT 仅作为代码示例并且仅以这种形式起作用)

Ancesor 和 HierarchyListener 有点异步,也许您无法从 AncestorListener

捕获正确的事件

my question about similar issue

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.HierarchyEvent;
import java.awt.event.HierarchyListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;

public class CardlayoutTest extends JFrame {

private static final long serialVersionUID = 1L;
public CardLayout card = new CardLayout();

public CardlayoutTest() {
JPanel pnlA = new JPanel(new BorderLayout());
pnlA.add(new JButton("A"), BorderLayout.CENTER);
JPanel pnlB = new JPanel(new BorderLayout());
pnlB.add(new JButton("B"), BorderLayout.CENTER);
JPanel pnlC = new JPanel(new BorderLayout());
pnlC.add(new JButton("C"), BorderLayout.CENTER);

setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(card);
add(pnlA, "A");
add(pnlB, "B");
add(pnlC, "C");

pnlA.addAncestorListener(new EventHandler());
pnlB.addAncestorListener(new EventHandler());
pnlC.addAncestorListener(new EventHandler());

pnlA.addHierarchyListener(new EventHandler());
pnlB.addHierarchyListener(new EventHandler());
pnlB.addHierarchyListener(new EventHandler());

pnlA.addComponentListener(new EventHandler());
pnlB.addComponentListener(new EventHandler());
pnlB.addComponentListener(new EventHandler());
}

class EventHandler implements AncestorListener, ComponentListener, HierarchyListener {

@Override
public void ancestorAdded(AncestorEvent event) {
System.out.println("CardlayoutTest.EventHandler.ancestorAdded()");
}

@Override
public void ancestorMoved(AncestorEvent event) {
System.out.println("CardlayoutTest.EventHandler.ancestorMoved()");
}

@Override
public void ancestorRemoved(AncestorEvent event) {
System.out.println("CardlayoutTest.EventHandler.ancestorRemoved()");
}

@Override
public void hierarchyChanged(HierarchyEvent e) {
System.out.println("Components Change: " + e.getChanged());
if ((e.getChangeFlags() & HierarchyEvent.DISPLAYABILITY_CHANGED) != 0) {
if (e.getComponent().isDisplayable()) {
System.out.println("Components DISPLAYABILITY_CHANGED : " + e.getChanged());
} else {
System.out.println("Components DISPLAYABILITY_CHANGED : " + e.getChanged());
}
}
if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0) {
if (e.getComponent().isDisplayable()) {
System.out.println("Components SHOWING_CHANGED : " + e.getChanged());
} else {
System.out.println("Components SHOWING_CHANGED : " + e.getChanged());
}
}
}

public void componentHidden(ComponentEvent e) {
System.out.println(e.getComponent().getClass().getName() + " --- Hidden");
}

public void componentMoved(ComponentEvent e) {
System.out.println(e.getComponent().getClass().getName() + " --- Moved");
}

public void componentResized(ComponentEvent e) {
System.out.println(e.getComponent().getClass().getName() + " --- Resized ");
}

public void componentShown(ComponentEvent e) {
System.out.println(e.getComponent().getClass().getName() + " --- Shown");
}
}

public static void main(String[] args) {
CardlayoutTest t = new CardlayoutTest();
t.setSize(500, 500);
System.out.println("CardlayoutTest.main()------------------------ FIRST");
t.card.show(t.getContentPane(), "A");
t.setVisible(true);
System.out.print("\n");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
System.out.println("CardlayoutTest.main()------------------------ SECOND");
t.card.show(t.getContentPane(), "B");
System.out.print("\n");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
System.out.println("CardlayoutTest.main()------------------------ THIRD");
t.card.show(t.getContentPane(), "C");
System.out.print("\n");
}
}

关于java - 当 Component 不再可见时有没有办法获得通知,因为 parent 已从集合中删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14833368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com