どのような解決策には、何らかの形のモデルビューコントローラが必要です。これにより、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
がトリガーされると、Controller
のshow
メソッドが呼び出され、ビューのインスタンスが渡されます。マジック!
全体として、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なので、デカップルされたソリューションを提供することに重点を置いてきました。
まず、ダイアログを気にする必要はありません。始めて、私にとっては不必要なステップのようです。次に、[アクションの使用方法](https://docs.oracle.com/javase/tutorial/uiswing/misc/action.html)を参照すると、プロセスの簡素化に役立ちます。第三に、アプリケーション全体の複雑さにもよるが、私は 'CardLayout'の使用を検討するかもしれない。 [CardLayoutの使い方](https://docs.oracle.com/javase/tutorial/uiswing/layout/card.html) – MadProgrammer
を参照してください。別のオプションとして、 'JTabbedPane' – MadProgrammer