JButton setText()ERROR

时间:2014-11-12 16:03:34

标签: java user-interface

我正在尝试按下按钮时将新文本设置为按钮。然而它似乎没有用,我做错了什么,我不知道是什么......

编辑-----我附上代码以便更容易理解我的意思

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

public class GrowAndShrinkSquareGUItest {
JFrame frame;
SquareDrawPanel bigGreen;
SquareDrawPanel smallGreen;
JButton button;
growAndShrinkListener listener;

public class SquareDrawPanel extends JPanel {

    int width;
    int height;

    SquareDrawPanel(int w, int h) {

        width = w;
        height = h;
    }

    public void paintComponent(Graphics g) {

        g.setColor(Color.green);
        g.fillRect(frame.getWidth() / 2 - (width / 2), frame.getHeight()
                / 2 - (height / 2) - 15, width, height);

    }

}

public class growAndShrinkListener implements ActionListener {

    // JButton button;

    growAndShrinkListener(JButton button) {

        button = new JButton("Click me to grow the Square");
        frame.add(button, BorderLayout.NORTH);
        button.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        button.setText("Unselect all");

    }
}

public static void main(String[] args) {
    GrowAndShrinkSquareGUItest test = new GrowAndShrinkSquareGUItest();
    test.go();
}

private void createPanels() {

    bigGreen = new SquareDrawPanel(400, 400);
    smallGreen = new SquareDrawPanel(100, 100);

}

private void drawPanel(JPanel panel) {

    frame.add(panel);
    panel.setVisible(true);
    frame.add(panel, BorderLayout.CENTER);

}

private void createListenerButton() {
    listener = new growAndShrinkListener(button);
}

private void loop(){}

public void go() {
    frame = new JFrame();
    frame.setSize(500, 500);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    createPanels();
    drawPanel(smallGreen);
    createListenerButton();
    frame.setVisible(true);


}

}

3 个答案:

答案 0 :(得分:0)

这是因为您使用的button变量未在actionPerformed方法范围内定义。 Java变量具有范围,它们在花括号中可用,它们被定义。 actionPerformed方法超出了growAndShrinkListener方法的大括号。固定代码:

public class growAndShrinkListener implements ActionListener {



    growAndShrinkListener(JButton button) {

        button = new JButton("Click me to grow the Square");
        frame.add(button, BorderLayout.NORTH);
        button.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();

        if(source instanceof JButton) {
            button = (JButton) source;
            button.setText("Click to shrink square");
        }
    }
}

或者,您可以使用私有变量:

public class growAndShrinkListener implements ActionListener {

    private JButton button;

    growAndShrinkListener() {

        button = new JButton("Click me to grow the Square");
        frame.add(button, BorderLayout.NORTH);
        button.addActionListener(this);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        button.setText("Click to shrink square");
    }
}

注意:您不应该覆盖构造函数中参数的内容。你得到的论点不是"指针"到被调用者的变量,但只是一个简单的参考。如果你覆盖,那么你的内容就会丢失,而calle也不知道。

答案 1 :(得分:0)

像这样改变..

public class YourSuperClass{
    private JButton button;
    public YourSuperClass(){
         // your logics 
         button = new JButton();
         button.addActionListener(new GrowAndShrinkListener(button));
         frame.add(button, BorderLayout.NORTH);
    }
    class GrowAndShrinkListener implements ActionListener {
        GrowAndShrinkListener(JButton button) {

        }

        @Override
        public void actionPerformed(ActionEvent e) {
            if(e.getSource() == button){
                button.setText("Click to shrink square");
            }

        }
    }
}

答案 2 :(得分:0)

试试这个:

        import javax.swing.*;
        import java.awt.*;
        import java.awt.event.*;
        class frame extends JFrame 
       { 
       JButton b;
       public frame()
        {
           setLayout(new BorderLayout());
           b=new JButton("Press");
           add(b,BorderLayout.SOUTH);
           b.addActionListener(new ActionListener(){
           public void actionPerformed(ActionEvent e)
            {
             b.setText("Clicked");
            }
          });
        }

        public static void main (String[] args) {
            frame f=new frame();
            f.setExtendedState(MAXIMIZED_BOTH);
            f.setVisible(true);
        }
      }