单击 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);