2017-11-04 14 views
1

JAVA Netbeansを使用しています。私が欲しいmenuItemを押したときにjFrameにjPanelを表示する方法

enter image description here

:私は私のメニューアイテムのいずれかを押すと、それはこのようなものが含まれている新しい使って、JDialogを開き

enter image description here

:私はすでに最初の写真は私のメニューを持っています私がメニュー項目を押すと、jDialog上にあるすべてのコンポーネントがjFrameで開き、プリンシパルフレームに調整できるようになります。これは私が持っているすべてのmenuItemに起こりたいので、別のmenuItemを押すと、現時点でjFrameにあるすべての情報が置き換えられるか、可能であればタブが開きます。

+0

まず、ダイアログを気にする必要はありません。始めて、私にとっては不必要なステップのようです。次に、[アクションの使用方法](https://docs.oracle.com/javase/tutorial/uiswing/misc/action.html)を参照すると、プロセスの簡素化に役立ちます。第三に、アプリケーション全体の複雑さにもよるが、私は 'CardLayout'の使用を検討するかもしれない。 [CardLayoutの使い方](https://docs.oracle.com/javase/tutorial/uiswing/layout/card.html) – MadProgrammer

+0

を参照してください。別のオプションとして、 'JTabbedPane' – MadProgrammer

答えて

0

どのような解決策には、何らかの形のモデルビューコントローラが必要です。これにより、APIをデカップリングしながら機能を容易にするのに役立ちます。

まず、How to use Actionsを見ることから始めます。これらは、ボタンやキーバインディングに簡単に適用できる自己完結型の作業単位であり、コードの再利用可能なスニペットのベースを提供します。例えば

、我々は単に管理コントローラへのビューの相互作用をビューの切り替えを容易にするための非常にシンプルなActionを定義することができます:Actionは「どのように」Controllerを気にしない

public abstract class AbstractManagerAction extends AbstractAction { 

    private Controller controller; 
    private JPanel panel; 

    public AbstractManagerAction(Controller manager, JPanel panel) { 
     this.controller = manager; 
     this.panel = panel; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     controller.show(panel); 
    } 

} 

それがビューに渡されるときだけビューが画面に表示されるので、コントローラーの基本的な実装は変更されますが、APIによって確立されたコントラクトのため、Actionは変更する必要はありません。

ここでは、JDialogとを管理するControllerを作成し、必要に応じてそれらを連鎖させることができます。

これは実際にどのようにあなたの人生をよりシンプルにするのですか?まあ

、あなたは、このようなビューの何かを持っていると仮定しましょう...

public class SomeOptionsPane extends JPanel { 

    public SomeOptionsPane() { 
     setLayout(new GridBagLayout()); 
     add(new JLabel("Some options")); 
    } 

} 

画面上にそれを提示するために、我々はそれが自分のActionだ定義することによって開始する必要があります...

public class SomeOptionsAction extends AbstractManagerAction { 
    public SomeOptionsAction(Controller controller) { 
     super(controller, new SomeOptionsPane()); 
     putValue(NAME, "Some options"); 
    } 
} 

これにより、共通の機能を抽象化することができますが、カスタマイズすることができます(この場合、表示するテキストのみを定義しました)。また、他のプロパティを定義することもできますが、簡潔にするために、私はそのステップをスキップしました。私はJMenuBar/JMenuにオプションを追加したいとき

は今、私はちょうどAction ...

JMenu options = new JMenu("Options"); 
options.add(new SomeOptionsAction(controller)); 

シンプルのインスタンスを作成する必要があります。ここでActionがトリガーされると、Controllershowメソッドが呼び出され、ビューのインスタンスが渡されます。マジック!

全体として、UIの一般的な複雑さに応じて、ユーザーエクスペリエンスをさらに向上させるために、CardLayoutまたはJTabbedPaneを使用することもできます。詳細は、How to use CardLayoutおよびHow to Use Tabbed Panesを参照してください。

そして、私はあなたはそれが、私がアイデアをテストするために使用される基本的なコードを実行している表示されるまで満足するつもりはない知っているので...今

import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       Controller manager = new Controller() { 
        @Override 
        public void show(JPanel pane) { 
         frame.getContentPane().removeAll(); 
         frame.getContentPane().add(pane); 
         frame.getContentPane().revalidate(); 
         frame.getContentPane().repaint(); 
        } 
       }; 

       JMenuBar menuBar = new JMenuBar(); 
       JMenu options = new JMenu("Options"); 
       menuBar.add(options); 
       options.add(new SomeOptionsAction(manager)); 
       options.add(new SomeOtherOptionsAction(manager)); 
       frame.setJMenuBar(menuBar); 

       frame.setSize(200, 200); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public interface Controller { 

     public void show(JPanel pane); 
    } 

    public abstract class AbstractManagerAction extends AbstractAction { 

     private Controller controller; 
     private JPanel panel; 

     public AbstractManagerAction(Controller controller, JPanel panel) { 
      this.controller = controller; 
      this.panel = panel; 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      controller.show(panel); 
     } 

    } 

    public class SomeOptionsAction extends AbstractManagerAction { 

     public SomeOptionsAction(Controller controller) { 
      super(controller, new SomeOptionsPane()); 
      putValue(NAME, "Some options"); 
     } 
    } 

    public class SomeOptionsPane extends JPanel { 

     public SomeOptionsPane() { 
      setLayout(new GridBagLayout()); 
      add(new JLabel("Some options")); 
     } 

    } 

    public class SomeOtherOptionsAction extends AbstractManagerAction { 

     public SomeOtherOptionsAction(Controller manager) { 
      super(manager, new SomeOtherOptionsPane()); 
      putValue(NAME, "Some other options"); 
     } 
    } 

    public class SomeOtherOptionsPane extends JPanel { 

     public SomeOtherOptionsPane() { 
      setLayout(new GridBagLayout()); 
      add(new JLabel("Some other options")); 
     } 

    } 
} 

、私はローストを取得する前に、私が知っていますこれは「伝統的な」MVCではありませんが、どちらもSwingなので、デカップルされたソリューションを提供することに重点を置いてきました。

関連する問題