3

我刚刚在java中制作了我的第一个基于事件的GUI,但我不明白我错在哪里。当没有应用事件处理时,代码运行良好..

这是代码。

package javaapplication1;

import javax.swing.*;
import java.awt.event.*;

 class Elem implements ActionListener{

    void perform(){
        JFrame frame = new JFrame();
        JButton button;
        button = new JButton("Button");
        frame.getContentPane().add(button) ;
        frame.setSize(300,300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        button.addActionListener(this);
     }

    public void actionPerformed(ActionEvent ev){
        button.setText("Clicked");
    }
}

 public class JavaApplication1 {

  public static void main(String[] args) {
   Elem obj = new Elem();
   obj.perform();
  }  
}
4

2 回答 2

2

正如您button在方法中使用对象一样actionPerformed。所以button全局声明。

class Elem implements ActionListener{
     JButton button;// Declare JButton here.
    void perform(){
        JFrame frame = new JFrame();

        button = new JButton("Button");
        frame.getContentPane().add(button) ;
        frame.setSize(300,300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        button.addActionListener(this);
     }

    public void actionPerformed(ActionEvent ev){
        button.setText("Clicked");
    }
}

 public class JavaApplication1 {

  public static void main(String[] args) {
   Elem obj = new Elem();
   obj.perform();
  }  
}
于 2013-11-12T10:49:59.213 回答
2

变量范围存在问题。将JButton button;定义移到perform()方法之外,以便actionPerformed()可以访问它。

JButton button;

void perform(){
    JFrame frame = new JFrame();
    button = new JButton("Button");
    frame.getContentPane().add(button) ;
    frame.setSize(300,300);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    button.addActionListener(this);
 }

当您在方法内部定义对象时(例如perform()),其范围仅限于该方法(在花括号内)。这意味着您的类中的其他方法无法访问该变量。

通过将对象定义移到方法之外,它现在具有类级别范围。这意味着该类中的任何方法都可以访问该变量。您仍在 内部定义它的值perform(),但现在可以通过其他方法访问它,包括actionPerformed().

有关更多说明,请参见此处

于 2013-11-12T10:50:13.027 回答