2017-05-11 8 views
0

この質問はヒープに返されている可能性がありますが、他の質問のボタンと違って、私のメニューバーを私のCardLayoutで操作しようとしています。私はこれに非常に長い間立ち往生してきました。枠を設定し、フレームに必要なパネルを追加 -CardLayoutを使って別のカードを表示するには?

私は現在

  1. CardLayoutクラスには、3つの別々のクラスが一緒に仕事を取得しようとしています。このクラスは、異なるカードを表示することも目的としています。
  2. MenuBarクラス - このクラスは、非常に最小限のメニューバーを設定します。これは、自分のCardLayoutクラスのフレームに追加します。私はここからメニュー項目を選んで、3番目のクラスのアクションリスナーを追加します。
  3. MenuActionListener - このクラスは、メニューバーからメニュー項目を選択したときに作成されるアクションイベントをリッスンする役割を果たします。特定のアイテムが選択されると、対応するカードが表示され、カードを切り替えるためにCardLayoutクラスに戻されます。

マイCardLayoutクラス:

public class CardLayoutExample { 
    private CardLayout cardLayout = new CardLayout(20, 20); 
    private JPanel contentPane = new JPanel(cardLayout); 

    private MyPanel panel1; 
    private MyPanel panel2; 
    private MyPanel panel3; 

    private void displayGUI() 
    {   
     MenuBar menuBar = new MenuBar(); 
     JFrame frame = new JFrame("Card Layout Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     contentPane.add(createPanel(Color.BLACK), "Panel 1"); 
     contentPane.add(createPanel(Color.RED), "Panel 2"); 

     frame.setContentPane(contentPane); 
     frame.setJMenuBar(menuBar.getMenuBar()); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public JPanel createPanel(Color color) { 
     JPanel panel = new JPanel(); 
     panel.setBackground(color); 

     return panel; 
    } 

    public void redCard() { 
     System.out.println("Selected Red Item"); 
     cardLayout.show(contentPane, "Panel 2"); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new CardLayoutExample().displayGUI(); 
      } 
     }); 
    } 

} 

MenuBarクラス:

public class MenuBar { 

    private JMenuBar menuBar; 
    private MenuActionListener mal; 

    public MenuBar() { 
     mal = new MenuActionListener(); 
     System.out.println("menuBar"); 

     //Creates a menubar for a JFrame 
     menuBar = new JMenuBar(); 

     //Define and add drop down menu to the menubar 
     JMenu mainMenu = new JMenu("Main Menu"); 
     menuBar.add(mainMenu); 

     //Define addMenu items 
     JMenuItem addRedItem = new JMenuItem("Red"); 
     addRedItem.addActionListener(mal); 

     //Add main menu items/menu 
     mainMenu.add(addRedItem); 
    } 

    public JMenuBar getMenuBar() 
    { 
     return menuBar; 
    } 
} 

そして、私のMenuActionListenerクラス:

public class MenuActionListener implements ActionListener { 

    public void redActionPerformed() { 
     new CardLayoutExample().redCard(); 
    } 
    @Override 
    public void actionPerformed(final ActionEvent e) { 
     String command = e.getActionCommand(); 
     System.out.println(command); 

     switch (command) { 

      case "Red": 
       redActionPerformed(); 
       break; 

      default: 
     } 
    } 
} 

私は私のメニューバーから赤のアイテムを選択し、次のコード行がトリガーされます。System.out.println("Selected Red Item")、私の赤いパネルを表示するコードが実行されますが、カードはまったく変更されません。

私はカードを交換してメニューバーを手に入れようとしてきました。私が望むカードを適切に表示できるように、コードを修正するにはどうしたらいいですか?

ありがとうございます。

答えて

1

問題はMenuActionListener.redActionPerformedメソッドにあります。全く新しいCardLayoutExampleオブジェクトを作成し、実際のUIを表す既存のオブジェクトの代わりにそれを使用しています。これを修正する最も簡単な方法は、Menuクラスをネストされたものにして、外側のCardLayoutExampleクラスへの暗黙の参照を取得することです。次にredActionPerformedredCard()と直接電話することができます。それ以外の場合は、CardLayoutExampleオブジェクトへの参照をMenuActionListenerクラスに渡す必要があります。完全な例は下記を参照してください。

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class CardLayoutExample { 
    private CardLayout cardLayout = new CardLayout(20, 20); 
    private JPanel contentPane = new JPanel(cardLayout); 

    private final static String p1 = "Panel 1"; 
    private final static String p2 = "Panel 2"; 

    private void displayGUI() 
    {   
     MenuBar menuBar = new MenuBar(); 
     JFrame frame = new JFrame("Card Layout Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     contentPane.add(createPanel(Color.BLACK), p1); 
     contentPane.add(createPanel(Color.RED), p2); 

     frame.setContentPane(contentPane); 
     frame.setJMenuBar(menuBar.getMenuBar()); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public JPanel createPanel(Color color) { 
     JPanel panel = new JPanel(); 
     panel.setBackground(color); 

     return panel; 
    } 

    public void redCard() { 
     System.out.println("Selected Red Item "); 
     ((CardLayout)contentPane.getLayout()).show(contentPane, p2); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new CardLayoutExample().displayGUI(); 
      } 
     }); 
    } 

    // Inner Menu Bar class 
    class MenuBar { 

     private JMenuBar menuBar; 
     private MenuActionListener mal; 

     public MenuBar() { 
      mal = new MenuActionListener(); 
      System.out.println("menuBar"); 

      //Creates a menubar for a JFrame 
      menuBar = new JMenuBar(); 

      //Define and add drop down menu to the menubar 
      JMenu mainMenu = new JMenu("Main Menu"); 
      menuBar.add(mainMenu); 

      //Define addMenu items 
      JMenuItem addRedItem = new JMenuItem("Red"); 
      addRedItem.addActionListener(mal); 

      //Add main menu items/menu 
      mainMenu.add(addRedItem); 
     } 

     public JMenuBar getMenuBar() 
     { 
      return menuBar; 
     } 

    } 

    //Inner MenuActionListener class 
    class MenuActionListener implements ActionListener { 

     public void redActionPerformed() { 
     // Call the redCard() method in outer object. 
      redCard(); 
     } 
     @Override 
     public void actionPerformed(final ActionEvent e) { 
      String command = e.getActionCommand(); 
      System.out.println(command); 

      switch (command) { 

       case "Red": 
        redActionPerformed(); 
        break; 

       default: 
      } 
     } 
    } 

} 
+0

ああ、私は今見ています。この種のクラス統合を避けながら、クラスを利用してそれらを広げたいと思っていました。すべてのクラスを1つのメインクラスに入れ子にするのはちょっと面倒ですが、ネストされたクラスのドキュメントについて読むと、クラスが他のクラスと一緒に作業しているのは論理的な理由ですここに。 啓発をありがとう、私はこれを必ず取ることになります。 – juiceb0xk

関連する問題