Ваш код содержал несколько «пробелов», то есть отсутствующий код, который я заполнил, следующим образом:
- Добавлены вызовы для [
JFrame
] методов setDefaultCloseOperation()
и pack()
иsetLocationByPlatform()
. Я предлагаю вам обратиться к javadoc для этих методов, чтобы понять, что они делают. - Я установил менеджер компоновки для
jp
переменной члена класса в вашем Window
классе.
Да, вам нужно зарегистрировать ActionListener
с JButton
в классе CustomPanel
, и этот слушатель должен находиться в вашем классе Window
- тот, который расширяет JFrame
.
Вот мое переписывание вашего кода. Обратите внимание, что я изменил имя класса Window
на CusPanel
, чтобы различать ваш класс и java.awt.Window
класс. Не то чтобы это имело значение, я просто предпочитаю не использовать имена классов из JDK.
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public class CusPanel extends JFrame implements ActionListener {
private static final int COUNT = 5;
private ArrayList<CustomPanel> aLCustomPanel = new ArrayList<>();
private JPanel jp = new JPanel(new GridLayout(0, COUNT));
public CusPanel() {
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
for (int i = 0; i < COUNT; i++) {
aLCustomPanel.add(new CustomPanel(this));
// here I could put the code from the 1 edit - see below
jp.add(aLCustomPanel.get(i));
}
this.add(jp);
pack();
setLocationByPlatform(true);
}
public void actionPerformed(ActionEvent actionEvent) {
Object source = actionEvent.getSource();
if (source instanceof JButton) {
JButton button = (JButton) source;
Container parent = button.getParent();
jp.remove(parent);
jp.invalidate();
jp.repaint();
pack();
// aLCustomPanel.remove(parent); <- optional
}
}
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new CusPanel().setVisible(true);
}
});
}
}
class CustomPanel extends JPanel {
private JButton button;
public CustomPanel(ActionListener parent) {
button = new JButton("button");
button.addActionListener(parent);
this.add(button);
}
public JButton getButton() {
return this.button;
}
}
Обратите внимание, что после удаления CustomPanel
компоненты GUI должны быть размечены снова, а JFrame
также должен быть соответственно изменен. Следовательно, в методе actionPerformed()
я вызываю invalidate()
, затем repaint()
и затем pack()
. Я также думаю, что если вы удалите CustomPanel
из GUI, вы также должны удалить его из ArrayList
, но, эй, я все еще не понимаю, почему вы хотите это сделать, хотя я, очевидно, не знаю весьИстория того, что вы хотели сделать это в первую очередь.
Конечно, поскольку каждая кнопка (и каждая CustomPanel
) выглядит одинаково, вы не можете точно знать, какая кнопка была удалена. Опять же, я полагаю, вы видите общую картину, а я нет.