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クラスにはtLabel変数への参照がありません。

コンストラクターを介して設定するか、 へのMyPanel参照を渡して、 で必要な処理を実行し、から呼び出すことができるMyListenerメソッドを用意することができます。MyPanelJLabelMyListener

于 2012-09-17T15:06:33.690 に答える
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

回答を編集していただきありがとうございます:)

新しいリスナーから変数にアクセスしようとしているようですが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」を追加します。慣習として、たとえば、フィールドがStringで名前myFieldが の場合、ゲッターの名前はgetMyFieldです。このように、セッターを追加してその変数を設定することもできます。ゲッターとセッターの詳細については、この質問を参照してください。

于 2012-09-17T15:14:33.213 に答える