邻居类中的ActionListener实现

时间:2012-09-17 14:54:45

标签: java swing class listener actionlistener

我认为在同一个类中编写监听器不是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"

3 个答案:

答案 0 :(得分: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);
        }
    }

}

答案 1 :(得分:1)

您的MyListener课程没有提及tLabel变量。

您可以通过构造函数进行设置,也可以将MyPanel引用传递给MyListener,并在MyPanel中设置一个方法,在JLabel上执行所需的操作可以从MyListener调用。

答案 2 :(得分:1)

感谢您编辑答案:)

您似乎正在尝试从新的侦听器访问tLabel变量,但它无法访问,因为它可能被声明为privatetString也可能发生同样的事情。试试这个:

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());
    }
}

为每个tStringtLabel添加一个getter到MyPanel

public class MyPanel extends JPanel {

    // ...

    public String getTString() {
        return tString;
    }

    public JLabel getTLabel() {
        return tLabel;
    }
}

如果您无法访问私人字段,通常会添加public" getter"返回该字段而不是更改字段本身的访问权限。惯例是,例如,如果字段是String并且名为myField,则getter名为getMyField。像这样,您还可以添加setter来设置该变量。有关getter和setter的更多信息,请参阅this question