0

我认为在同一个类中编写侦听器不是 OOP 方式。所以,我尝试在另一个文件中编写监听器。

有效的代码是:

class MyPanel extends JPanel{
 private String tString = "Test String";
 private JLabel tLabel;
 public MyPanel(){
    tLabel = new JLabel("Label");
    JButton tButton = new JButton("Click me");

    tButton.addActionListener(new ActionListener(){   
    public void ActionPerformed(ActionEvent e){
     tLabel.setText(tString);
    }
   });
}

但是当我在单独的文件中写监听器时:

public class MyListener implements ActionListener{
 copy code here
}

和改变

tButton.addActionListener(new ActionListener(){

tButton.addActionListener(new MyListener());

它不起作用。当然,我尝试过不同的组合。

例如,将“this”发送到侦听器的构造函数,并从侦听器类中接收到的对象调用方法。

错误:

MyListener: cannot find symbol "tLabel"
4

3 回答 3

1

你的MyListener类必须有一个构造函数。MyListener您在类构造函数中传递“this”和您需要的任何其他参数。

这是我的一个项目的一个例子。

package com.ggl.project.planner.controller;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import com.ggl.project.planner.model.Planner;
import com.ggl.project.planner.model.Project;
import com.ggl.project.planner.view.CreateUpdateProjectDialog;
import com.ggl.project.planner.view.ProjectPlannerFrame;

public class CreateProjectActionListener implements ActionListener {

    protected Planner planner;

    protected Project project;

    protected ProjectPlannerFrame frame;

    public CreateProjectActionListener(ProjectPlannerFrame frame,
            Planner planner, Project project) {
        this.frame = frame;
        this.planner = planner;
        this.project = project;
    }

    @Override
    public void actionPerformed(ActionEvent event) {
        CreateUpdateProjectDialog dialog = 
                new CreateUpdateProjectDialog(frame, project, true);
        if (dialog.isOkPressed()) {
            planner.setProjectOpen(true);
        }
    }

}
于 2012-09-17T15:00:57.100 回答
1

您的MyListener类没有对tLabel变量的引用。

您可以通过构造函数设置它,也可以将MyPanel引用传递给MyListenerand 有一个方法可以在 andMyPanel上执行所需的操作,JLabel并且可以从MyListener.

于 2012-09-17T15:06:33.690 回答
1

感谢您编辑您的答案:)

您似乎正在尝试tLabel从新侦听器访问该变量,但它可能已声明为不可访问private。同样的事情也可能发生在tString. 试试这个:

public class MyListener implements ActionListener{

    private MyPanel myPanel;

    public MyListener(MyPanel myPanel) {
        this.myPanel = myPanel;
    }

    public void ActionPerformed(ActionEvent e) {
        myPanel.getTLabel().setText(myPanel.getTString());
    }
}

并为每个和添加一个tString吸气tLabelMyPanel

public class MyPanel extends JPanel {

    // ...

    public String getTString() {
        return tString;
    }

    public JLabel getTLabel() {
        return tLabel;
    }
}

当您无法访问私有字段时,通常会添加一个public“getter”来返回该字段,而不是更改字段本身的访问权限。约定是,例如,如果字段是 aString并且是 named myField,则 getter 是 named getMyField。像这样,您还可以添加设置器来设置该变量。有关 getter 和 setter 的更多信息,请参阅此问题

于 2012-09-17T15:14:33.213 回答