JButton不返回正确的文本值

时间:2014-12-19 23:09:13

标签: java swing user-interface

我有关于JButton的问题。我有一个20x20 JButtons的GridLayout。我想点击它时获得单个按钮的值。 (x.getText())。

sout 仅打印右下角值,无论我点击什么按钮。

如果我点击左上角按钮,则会打印19.我想在这种情况下返回的值为0.

enter image description here

我的代码如下。

public class MainFrame extends Frame implements MouseListener{

JButton button;

public MainFrame() {

    setSize(new Dimension(1000, 1000));
    addComponents();

}

private void addComponents(){

    JPanel mainPanel = new JPanel(new BorderLayout());

    JPanel top = new JPanel(new GridLayout(1,1));
    JPanel center = new JPanel(new GridLayout(20, 20));

    JLabel label = new JLabel("test");
    top.add(label);

    for (int i = 0; i < 20; i ++){
        for (int j = 0; j < 20; j ++){
            button = new JButton(String.valueOf(i));
            button.addMouseListener(this);
            center.add(button);
        }
    }

    mainPanel.add(top, BorderLayout.NORTH);
    mainPanel.add(center, BorderLayout.CENTER);

    add(mainPanel);

}

@Override
public void mouseClicked(MouseEvent e) {

    System.out.println(button.getText());

} 
// Also implements multiple other methods from the interface, but irrelevant for my question.

新代码(工作代码):

public class MainFrame extends Frame {

public MainFrame() {

    setSize(new Dimension(1000, 1000));
    addComponents();

}



private void addComponents(){

    JPanel mainPanel = new JPanel(new BorderLayout());

    JPanel top = new JPanel(new GridLayout(1,1));
    JPanel center = new JPanel(new GridLayout(20, 20));

    JLabel label = new JLabel("test");
    top.add(label);

    ActionListener listener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            String text = e.getActionCommand();
            System.out.println(text);
        }
    };


    for (int i = 0; i < 20; i ++){
        for (int j = 0; j < 20; j ++){
            JButton button = new JButton(String.valueOf(i));
            button.addActionListener(listener);
            center.add(button);
        }
    }

    mainPanel.add(top, BorderLayout.NORTH);
    mainPanel.add(center, BorderLayout.CENTER);

    add(mainPanel);

3 个答案:

答案 0 :(得分:6)

不要在JButton上使用MouseListener,因为这样做,如果按钮有焦点,你的按钮就不会响应空格键,如果你禁用了按钮,你的MouseListener仍会工作,这是不正确的行为。

使用ActionListener,只需要一个,一个添加到每个按钮,然后从ActionEvent参数中获取动作命令。

ActionListener actionListener = new ActionListener() {

    public void actionPerformed(ActionEvent e) {
        String text = e.getActionCommand();
    }

}

// add listener to all buttons in a for loop

答案 1 :(得分:4)

查看您的代码,您只有一个属性button,该值会在mouseClicked方法中打印出来,所以这里没什么可惊讶的。

每个按钮都必须有自己的监听器,因此请删除您的属性并使用以下代码:

for (int i = 0; i < 20; i ++){
     for (int j = 0; j < 20; j ++){
         final JButton button = new JButton(String.valueOf(i));
         button.addMouseListener(new MouseAdapter() {
             @Override
             public void mouseClicked(MouseEvent e) {
                System.out.println(button.getText());
             }
         });
         center.add(button);
     }
 }

您还可以使用ActionListener代替MouseAdapter

答案 2 :(得分:0)

你必须声明一个按钮数组然后循环它以声明所有按钮并添加动作监听器