-1

我想使用 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,但它移动了其他按钮并填充了空间。索引只是在按钮中有一些东西以使更改可见。谢谢!

4

3 回答 3

2

因此,根据上一个问题中提出的概念,您需要知道要删除的组件在容器中的位置。

幸运的是,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);
            }
        }
    }
}

例如,请参阅您之前的问题

于 2013-11-13T22:33:15.897 回答
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();
}
于 2013-11-13T19:48:33.120 回答
0

GridLayout您可以将JPanel具有 a 的 a添加到单元格中,而不是将按钮直接添加CardLayout到 。这将允许您将多个“卡片”添加到单元格并在它们之间切换。如果你想让单元格看起来是空白的,一张“卡片”甚至可以是空白的。

于 2013-11-13T19:46:47.523 回答