如何在gridlayout中的特定位置添加或删除JButton?

时间:2013-11-13 19:35:27

标签: java swing jframe actionlistener grid-layout

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

3 个答案:

答案 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();
}