5

FrontGUIと呼ばれるメインフレームにサイドパネルが追加されています。このサイドパネルは、JPanelを拡張するFrontGUILinkerと呼ばれるクラスであり、ボタンがあります。プログラムを実行すると、ボタンは何もしません。ActionListenerが呼び出されていないようです。私は他にも同様の設定のコンポーネントをいくつか持っていますが、ボタンはすべてそれらで機能します-私が見ることができる唯一の違いは、それらがJFrameの拡張であり、FrontGUIの直接フィールドではなく、以下のコードで言及されているmainguiの代わりであるということです。このmainguiには、FrontGUIControllerを含む各フレームのControllerクラスを持つフィールドが含まれていますが、FrontGUILinkerControllerはFrontGUIControllerのフィールドです。これが私のクラスの概要ですが、うまくいけば、無関係なものだけが省略されています。メインのJFrameクラス:

public class FrontGUI extends JFrame {
    public FrontGUILinker linkerPanel;
    public JButton btnShowhideLinker;

    public FrontGUI() {
      linkerPanel = new FrontGUILinker();
      contentPane.add(linkerPanel, BorderLayout.EAST);

      btnShowhideLinker = new JButton("Show/Hide Linker");
      contentPane.add(btnShowhideLinker);
    }
}

これが「コントローラー」クラスです。サイドパネルは表示することも表示しないこともできます。これはこのアクションリスナーが行うことであり、これは問題なく機能しているようです。

public class FrontGUIController {
    public MAINGUI maingui;
    private FrontGUI frame;
    public FrontGUILinkerController linkerController;

    public FrontGUIController(MAINGUI parent) {
       maingui = parent;
       frame = new FrontGUI();
       linkerController = new FrontGUILinkerController(maingui);

       //Button: Show/Hide linkerPanel
       frame.btnShowhideLinker.addActionListener( new ActionListener() {
       @Override
       public void actionPerformed(ActionEvent arg0) {
           frame.linkerPanel.setVisible(!frame.linkerPanel.isVisible());
       }});

    }

}

FrontGUILinkerクラスは次のとおりです。

public class FrontGUILinker extends JPanel {
   public btnCreateLink;

   public FrontGUILinker() {
       btnCreateLink = new JButton("Create Link");
       add(btnCreateLink);
   }
}

そのクラスのコントローラーは次のとおりです。

public class FrontGUILinkerController {
   public MAINGUI maingui;
   private FrontGUILinker frame;

   public FrontGUILinkerController(MAINGUI parent) {
      maingui = parent;
      frame = new FrontGUILinker();

      // Add listener to Create Link button
      frame.btnCreateLink.addActionListener( new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent arg0) {
             System.out.println("Create Link button has been clicked");
         }});
   }
}

なぜこれが機能しないのか誰かが知っていますか?

4

1 に答える 1

4

FrontGUILinkerインスタンスを2回作成しています。1つは表示しており、もう1つはActionListenerを追加しています。そうしないでください。このオブジェクトを一度作成し、両方に同じ参照を使用します。私が正しいことを示すために、上記の質問のコードを見て、どこに電話をかけているかを検索するとnew FrontGUILinker()、ここで2回実行していることがわかります。

public FrontGUI() {
  linkerPanel = new FrontGUILinker();

そして再びここに:

public FrontGUILinkerController(MAINGUI parent) {
  maingui = parent;
  frame = new FrontGUILinker();

各インスタンスは他のインスタンスとは完全に異なるため、一方にActionListenerを追加しても、もう一方(表示されているインスタンス)には影響しません。これを解決するには、必要な場所への有効な参照を渡します。

すなわち、

public class FrontGUILinkerController {
   public MAINGUI maingui;
   private FrontGUILinker frame;

   // **** note change
   public FrontGUILinkerController(MAINGUI parent, FrontGUILiner frame) {
      maingui = parent;
      this.frame = frame;  // **** added
      // frame = new FrontGUILinker(); // **** commented out

      // Add listener to Create Link button
      frame.btnCreateLink.addActionListener( new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent arg0) {
             System.out.println("Create Link button has been clicked");
         }});
   }
}

public FrontGUIController(MAINGUI parent) {
   maingui = parent;
   frame = new FrontGUI();
   linkerController = new FrontGUILinkerController(maingui, frame); // **** changed
于 2012-11-24T01:11:09.343 に答える