我认为在同一个类中编写监听器不是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"
答案 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
变量,但它无法访问,因为它可能被声明为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
和tLabel
添加一个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。