我想使用actionListener删除gridLayout的JButton。我想把空白的JButton空间留下来,然后用JLabel或其他东西填充那个空间。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class bottons extends JFrame implements ActionListener{
private JPanel test;
private JButton[][] buttons;
private JuegoBuca(){
setVisible(true);
setSize(500,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Test");
setResizable(false);
buttons = new JButton[5][5];
test = new JPanel();
test.setLayout(new GridLayout(5,5));
for(int i = 0 ; i<5 ; i++){
for(int j = 0; j<5 ; j++){
test.add(buttons[i][j] = new JButton(Integer.toString(index++)));
buttons[i][j].addActionListener(this);
}
}
add(test, BorderLayout.CENTER);
}
public void actionPerformed(ActionEvent e) {
Object o = e.getSource();
for(int i = 0; i<5 ; i++){
for(int j = 0 ; j<5; j++){
if(buttons[i][j] == o){
test.remove(buttons[i][j]);
}
}
}
}
在actionListener的方法中,它取出了JButton,但它会移动其他按钮并填充空格。索引只是在按钮中有一些东西可以使变化可见。 谢谢!
答案 0 :(得分:2)
因此,根据您previous question中提供的概念,您需要知道要移除的组件位于容器中的哪个位置。
幸运的是,GridLayout
根据添加的顺序列出了每个组件。这意味着您只需要在删除容器之前确定当前组件在容器中的位置,并将新组件添加到容器中。
public void actionPerformed(ActionEvent e) {
Object o = e.getSource();
for(int i = 0; i<5 ; i++){
for(int j = 0 ; j<5; j++){
if(buttons[i][j] == o){
// Find the position of the component within the container
int index = getComponentZOrder(buttons[i][j]);
// Remove the old component
test.remove(buttons[i][j]);
// Replace it with a new component at the same position
add(new JLabel("I was here"), index);
}
}
}
}
例如,请参阅previous question
答案 1 :(得分:0)
您可以改为将GridLayout
添加到单元格,而不是将按钮直接添加到JPanel
。这将允许您向单元格添加多个“卡片”并在它们之间切换。如果你想让单元格的外观为空白,那么一张'卡'甚至可能是空白的。
答案 2 :(得分:0)
@Override
public void actionPerformed(ActionEvent e) {
Object o = e.getSource();
Component[] components = test.getComponents();
for (int i = 0; i < components.length; i++) {
if (components[i] == o) {
// Remove the button that was clicked.
test.remove(i);
// Add a blank label in place of the button.
test.add(new JLabel(), i);
}
}
// Force Swing to repaint the panel.
test.repaint();
}