单击 JButton 时删除父 JPanel
Remove parent JPanel when JButton is clicked
我有一个 JPanel 的 ArrayList。此列表的每个项目都有一个 JButton。
现在,当单击 JButton 时,我想从 ArrayList 中删除它的父 JPanel。那么如何让 JButton 从 ArrayList 中删除它的父级?
提前致谢。
public class TestingArrayList extends JFrame {
JPanel grandPanel; // a JPanel for all the panels
ArrayList<JPanel> panelParent = new ArrayList<>(); // JPanel ArrayList
public TestingArrayList() {
super("Test");
setLayout(new FlowLayout());
grandPanel = new JPanel();
add(grandPanel);
for (int i = 0; i < 10; i++) { // adding 10 JPanel into grandPanel
panelParent.add(new JPanel());
grandPanel.add(panelParent.get(i));
// adding JButton in all panels
JButton btnParent = new JButton("X");
panelParent.get(i).add(btnParent);
// add new task button action
btnParent.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
System.out.println(getParent());
//What to do!!!
}
});
}
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(1000, 100);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
new TestingArrayList();
}
}
btnParent.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
System.out.println(getParent());
panelParent.remove((JPanel)(event.getSource().getParent()));
}
});
您的代码中拥有您需要的一切。您只需要对感兴趣的 JPanel 的 final
引用,因为这将允许您在匿名内部 ActionListener class:
中使用它
for (int i = 0; i < 10; i++) {
// make it final so that it is accessible from inner anon class
final JPanel myPanel = new JPanel();
panelParent.add(myPanel);
grandPanel.add(myPanel);
JButton btnParent = new JButton("X");
myPanel.add(btnParent);
btnParent.addActionListener(event -> panelParent.remove(myPanel));
}
如果您还想将其从 grandPanel 中删除,那么您将需要更多...
btnParent.addActionListener(event -> {
panelParent.remove(myPanel);
grandPanel.remove(myPanel);
grandPanel.revalidate();
grandPanel.repaint();
});
注意,如果要使用Seymore的方法去除JPanel,首先要明白在ActionEvent参数上调用getSource()
得到的源对象就是添加了监听器的对象-- 这里是 JButton
而不是 JPanel
,而且返回的对象类型是 Object
,因此如果不进行强制转换,就无法调用任何 Swing 组件方法。因此,您需要将所有内容括在括号中,以便您可以调用该类型的方法。例如:
parentPanel.remove((JPanel) ((JButton) event.getSource()).getParent());
或
parentPanel.remove((JPanel) ((JComponent) event.getSource()).getParent());
我发现当代码变得如此复杂时,分隔行更容易:
// since a JButton extends from JComponent
JComponent source = (JComponent) event.getSource();
JPanel parent = (JPanel) source.getParent();
parentPanel.remove(parent);
我有一个 JPanel 的 ArrayList。此列表的每个项目都有一个 JButton。 现在,当单击 JButton 时,我想从 ArrayList 中删除它的父 JPanel。那么如何让 JButton 从 ArrayList 中删除它的父级?
提前致谢。
public class TestingArrayList extends JFrame {
JPanel grandPanel; // a JPanel for all the panels
ArrayList<JPanel> panelParent = new ArrayList<>(); // JPanel ArrayList
public TestingArrayList() {
super("Test");
setLayout(new FlowLayout());
grandPanel = new JPanel();
add(grandPanel);
for (int i = 0; i < 10; i++) { // adding 10 JPanel into grandPanel
panelParent.add(new JPanel());
grandPanel.add(panelParent.get(i));
// adding JButton in all panels
JButton btnParent = new JButton("X");
panelParent.get(i).add(btnParent);
// add new task button action
btnParent.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
System.out.println(getParent());
//What to do!!!
}
});
}
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(1000, 100);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
new TestingArrayList();
}
}
btnParent.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
System.out.println(getParent());
panelParent.remove((JPanel)(event.getSource().getParent()));
}
});
您的代码中拥有您需要的一切。您只需要对感兴趣的 JPanel 的 final
引用,因为这将允许您在匿名内部 ActionListener class:
for (int i = 0; i < 10; i++) {
// make it final so that it is accessible from inner anon class
final JPanel myPanel = new JPanel();
panelParent.add(myPanel);
grandPanel.add(myPanel);
JButton btnParent = new JButton("X");
myPanel.add(btnParent);
btnParent.addActionListener(event -> panelParent.remove(myPanel));
}
如果您还想将其从 grandPanel 中删除,那么您将需要更多...
btnParent.addActionListener(event -> {
panelParent.remove(myPanel);
grandPanel.remove(myPanel);
grandPanel.revalidate();
grandPanel.repaint();
});
注意,如果要使用Seymore的方法去除JPanel,首先要明白在ActionEvent参数上调用getSource()
得到的源对象就是添加了监听器的对象-- 这里是 JButton
而不是 JPanel
,而且返回的对象类型是 Object
,因此如果不进行强制转换,就无法调用任何 Swing 组件方法。因此,您需要将所有内容括在括号中,以便您可以调用该类型的方法。例如:
parentPanel.remove((JPanel) ((JButton) event.getSource()).getParent());
或
parentPanel.remove((JPanel) ((JComponent) event.getSource()).getParent());
我发现当代码变得如此复杂时,分隔行更容易:
// since a JButton extends from JComponent
JComponent source = (JComponent) event.getSource();
JPanel parent = (JPanel) source.getParent();
parentPanel.remove(parent);