按钮不返回动作

时间:2019-01-29 16:34:53

标签: java

我想知道为什么我的按钮在点击时不反应。要指出的是,一旦我单击该按钮,它应该更改背景色。

当我在一个类中设置Button的属性时,它按预期方式工作,但是当我尝试将Button的属性移至另一个类以使代码更清晰时,它只返回了我一个按钮,而没有更改颜色并且没有按钮的签名

我在哪里出错?

面板:

public class ObrazPanel extends JPanel implements ActionListener {

    public static final int HEIGHT = 200;
    public static final int WIDTH = 200;

    public ObrazPanel() {

    FirstButton FirstButtonTlo = new FirstButton();
    FirstButtonTlo.FirstButton2();
    add(FirstButtonTlo);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub

    }
    }

按钮:

public class FirstButton extends JButton implements ActionListener {

    public JButton backgroundButton;

    public void FirstButton2() {
        backgroundButton = new JButton ("guzikTlo");
        backgroundButton.addActionListener(this);
        setPreferredSize( new Dimension (ObrazPanel.HEIGHT, ObrazPanel.WIDTH));

    }   
    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
        if (source == backgroundButton)
            setBackground(Color.GREEN);

    }   
    }

1 个答案:

答案 0 :(得分:1)

问题是您在面板中添加了按钮FirstButtonTlo。但是,您将侦听器添加到另一个未显示在GUI上的按钮:backgroundButton

而不是在类FirstButton中创建另一个无用的按钮,而是重写构造函数或添加方法来设置其属性:

public class FirstButton extends JButton implements ActionListener {

    public FirstButton () {
        super();
        this.setText("guzikTlo");
        this.addActionListener(this);
        this.setPreferredSize( new Dimension (ObrazPanel.HEIGHT, ObrazPanel.WIDTH));
    }

// same thing but with a method to initialize the button
//    public void myInitMethod() {
//        this.setText("guzikTlo");
//        this.addActionListener(this);
//        this.setPreferredSize( new Dimension (ObrazPanel.HEIGHT, ObrazPanel.WIDTH));
//    }   

    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
        if (source == this)
            JPanel parentContainer = (JPanel) ((JButton)source).getParent();
            parentContainer.setBackground(Color.GREEN);
        }   
    }
}

然后您可以将其添加到面板中:

public ObrazPanel() {

    FirstButton firstButtonTlo = new FirstButton();
    // uncomment if you want to use the method, else do nothing
    // firstButtonTlo.myInitMethod();
    add(FirstButtonTlo);

}

请注意,您可以使用MouseListener

来代替ActionListener。

旁注:

请尝试使用Java命名约定:变量名不应以大写字母开头。乍一看,我虽然FirstButtonTlo是一个类而不是变量。在此处阅读更多信息:https://www.oracle.com/technetwork/java/codeconventions-135099.html