- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
有没有办法让 JComponent
获取其后代组件层次结构中添加/删除更改的通知?
例如,在下面的代码中,有一个 addChild
按钮,它将向根或最后添加的面板添加一个新的子 JPanel
。我希望根面板能够收到此通知。有点像 HierarchyListener
但相反,或者是 ContainerListener
,它不仅仅监听直接子级。
public class DecendantHierarchyListening extends JFrame {
private final JPanel root = createChildPanel(null);
public JPanel leafComponent = root;
public DecendantHierarchyListening() {
super("title");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComponent buttons = new JPanel();
JPanel panel = new JPanel(new BorderLayout());
panel.add(createAddChildButton(buttons), BorderLayout.NORTH);
panel.add(root, BorderLayout.CENTER);
getContentPane().add(panel);
}
private Button createAddChildButton(JComponent buttons) {
Button button = new Button("AddChild");
buttons.add(button);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
leafComponent = (JPanel) leafComponent
.add(createChildPanel(leafComponent));
DecendantHierarchyListening.this.invalidate();
DecendantHierarchyListening.this.validate();
DecendantHierarchyListening.this.repaint();
}
});
return button;
}
public static JPanel createChildPanel(Container parent) {
Color[] colors = new Color[] { Color.RED, Color.BLUE, Color.GREEN };
JPanel panel = new JPanel(new BorderLayout());
panel.setPreferredSize(new Dimension(200, 200));
Color color;
if (parent == null) {
color = Color.GREEN;
} else {
int distance = 1;
parent = parent.getParent();
while (parent != null) {
distance++;
parent = parent.getParent();
}
color = colors[distance % colors.length];
}
panel.setBorder(BorderFactory.createLineBorder(color, 2));
return panel;
}
public static void runDemo() {
JFrame f = new DecendantHeirarchyListening();
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
DecendantHierarchyListening.runDemo();
}
}
最佳答案
一种可能的解决方案是使用单个ContainerListener
,它将自身添加到添加到“根”容器的容器中(并且,为了完整起见,还会将其自身从已删除的容器中删除,如果这是必要的)。
所以你基本上可以创建一个ContainerListener
并将其添加到根容器中。每当此监听器收到有关添加的新子组件的通知时,它也会将自身添加到此组件(如果它是容器)。稍后,当将组件添加到子组件时,监听器将收到通知,并可能再次将其自身添加到孙组件,依此类推。
我在这里举了一个例子:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ContainerEvent;
import java.awt.event.ContainerListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class DescendantHierarchyListening extends JPanel
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
createAndShowGUI();
}
});
}
public static void createAndShowGUI()
{
JFrame f = new JFrame();
f.add(new DescendantHierarchyListening());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(400, 400);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
ContainerListener containerListener = new ContainerListener()
{
@Override
public void componentAdded(ContainerEvent e)
{
Component child = e.getChild();
System.out.println("Added " + child);
System.out.println(" to " + e.getContainer());
if (child instanceof Container)
{
Container container = (Container)child;
container.addContainerListener(this);
}
}
@Override
public void componentRemoved(ContainerEvent e)
{
Component child = e.getChild();
System.out.println("Removed " + child);
System.out.println(" from " + e.getContainer());
if (child instanceof Container)
{
Container container = (Container)child;
container.removeContainerListener(this);
}
}
};
private final JPanel root;
public JPanel leafComponent;
public DescendantHierarchyListening()
{
super(new BorderLayout());
JButton button = createAddChildButton();
add(button, BorderLayout.NORTH);
root = createChildPanel(null);
root.addContainerListener(containerListener);
add(root, BorderLayout.CENTER);
leafComponent = root;
}
private JButton createAddChildButton()
{
JButton button = new JButton("AddChild");
button.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
JPanel child = createChildPanel(leafComponent);
leafComponent.add(child);
leafComponent = child;
revalidate();
}
});
return button;
}
public JPanel createChildPanel(final Container parent)
{
JPanel panel = new JPanel(new BorderLayout())
{
@Override
public String toString()
{
return "Child of " + parent;
}
};
Color color = getColor(parent);
panel.setBorder(BorderFactory.createLineBorder(color, 2));
return panel;
}
private static Color getColor(Component c)
{
if (c == null)
{
return Color.GREEN;
}
Color[] colors = new Color[]
{ Color.RED, Color.BLUE, Color.GREEN };
int d = getDepth(c);
return colors[d % colors.length];
}
private static int getDepth(Component c)
{
if (c == null)
{
return 0;
}
return 1 + getDepth(c.getParent());
}
}
关于java - 监听后代组件层次结构的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25571162/
我目前正在尝试基于哈希表构建字典。逻辑是:有一个名为 HashTable 的结构,其中包含以下内容: HashFunc HashFunc; PrintFunc PrintEntry; CompareF
如果我有一个指向结构/对象的指针,并且该结构/对象包含另外两个指向其他对象的指针,并且我想删除“包含这两个指针的对象而不破坏它所持有的指针”——我该怎么做这样做吗? 指向对象 A 的指针(包含指向对象
像这样的代码 package main import "fmt" type Hello struct { ID int Raw string } type World []*Hell
我有一个采用以下格式的 CSV: Module, Topic, Sub-topic 它需要能够导入到具有以下格式的 MySQL 数据库中: CREATE TABLE `modules` ( `id
通常我使用类似的东西 copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData)); copy((uint8_t*)&PODV
错误 : 联合只能在具有兼容列类型的表上执行。 结构(层:字符串,skyward_number:字符串,skyward_points:字符串)<> 结构(skyward_number:字符串,层:字符
我有一个指向结构的指针数组,我正在尝试使用它们进行 while 循环。我对如何准确初始化它并不完全有信心,但我一直这样做: Entry *newEntry = malloc(sizeof(Entry)
我正在学习 C,我的问题可能很愚蠢,但我很困惑。在这样的函数中: int afunction(somevariables) { if (someconditions)
我现在正在做一项编程作业,我并没有真正完全掌握链接,因为我们还没有涉及它。但是我觉得我需要它来做我想做的事情,因为数组还不够 我创建了一个结构,如下 struct node { float coef;
给定以下代码片段: #include #include #define MAX_SIZE 15 typedef struct{ int touchdowns; int intercepti
struct contact list[3]; int checknullarray() { for(int x=0;x<10;x++) { if(strlen(con
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Empty “for” loop in Facebook ajax what does AJAX call
我刚刚在反射器中浏览了一个文件,并在结构构造函数中看到了这个: this = new Binder.SyntaxNodeOrToken(); 我以前从未见过该术语。有人能解释一下这个赋值在 C# 中的
我经常使用字符串常量,例如: DICT_KEY1 = 'DICT_KEY1' DICT_KEY2 = 'DICT_KEY2' ... 很多时候我不介意实际的文字是什么,只要它们是独一无二的并且对人类读
我是 C 的新手,我不明白为什么下面的代码不起作用: typedef struct{ uint8_t a; uint8_t* b; } test_struct; test_struct
您能否制作一个行为类似于内置类之一的结构,您可以在其中直接分配值而无需调用属性? 前任: RoundedDouble count; count = 5; 而不是使用 RoundedDouble cou
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
在创建嵌套列表时,我认为 R 具有对列表元素有用的命名结构。我有一个列表列表,并希望应用包含在任何列表中的每个向量的函数。 lapply这样做但随后剥离了列表的命名结构。我该怎么办 lapply嵌套列
我正在做一个用于学习目的的个人组织者,我从来没有使用过 XML,所以我不确定我的解决方案是否是最好的。这是我附带的 XML 文件的基本结构:
我是新来的 nosql概念,所以当我开始学习时 PouchDB ,我找到了这个转换表。我的困惑是,如何PouchDB如果可以说我有多个表,是否意味着我需要创建多个数据库?因为根据我在 pouchdb
我是一名优秀的程序员,十分优秀!