如何在应用程序窗口之间切换并与控制器通信?

时间:2011-06-05 09:37:32

标签: java model-view-controller user-interface

使用Java编写图形界面时,在单击按钮时,在应用程序的不同窗口之间切换的适当方法是什么? I.E.窗户应该是什么,JPanelsJFrames ......?所有组件如何看到“域控制器”(将图形包链接到应用程序逻辑包的类)?

任何指南或参考将不胜感激。

4 个答案:

答案 0 :(得分:2)

您使用Controller启动应用程序。在控制器的构造函数中,您将初始化要打开的第一个GUI,让我们说GUI_A

private GUI_A gui_a = null;

Controller() {
    gui_a = new GUI_A(this);
}

您可能会注意到,我使用一个参数GUI_A调用this的构造函数。 this引用了当前类的实例,因此this的类型为ControllerGUI_A的构造函数必须看起来像这样:

private Controller controller = null;

GUI_A(Controller ctrl) {
    controller = ctrl;
}

这是一种让Controller知道GUI的简单方法。

接下来你要做的就是显示GUI_A

gui_a.setVisible(true);

如果你现在想要处理按钮点击,你可以这样做:

首先,将动作执行的方法添加到按钮。而且,由于它是MVC中的最佳实践,您不希望在视图/ GUI中执行逻辑。因此,您还可以在Controller中为执行的操作创建相应的方法,并从GUI中调用它:

// Controller
GUI_A_button1_actionPerformed(ActionEvent evt) {
    // Add your button logic here
}

// GUI_A
button1_actionPerformed(ActionEvent evt) {
    controller.GUI_A_button1_actionPerformed(evt);
}

通常您不需要将ActionEvent-var传递给Controller,因为您不需要经常使用它。通常,您会从TextField中读取文本并将其传递给Controller:

// Controller
GUI_A_button1_actionPerformed(String text) {
    // Add logic for the text here
}

// GUI_A
button1_actionPerformed(ActionEvent evt) {
    controller.GUI_A_button1_actionPerformed(textField1.getText());
}

如果您现在想要从GUI_A访问Controller上的某些字段,请确保不要在GUI中将字段标记为公共字段,而是创建处理如何显示值。

答案 1 :(得分:1)

最好的方法是使用Actions。您可以将操作附加到每个控件。当用户操作发生时(例如,单击按钮),将调用相应的Action。动作可以将调用更深入地委托给应用程序逻辑并调用图形组件(JFrams等)。

答案 2 :(得分:1)

建议:使用tabbed-panel应该这样做,JPanel只是一个Java容器,而JFrame应该是外部窗口,它们是不同的东西。 One JFrame上应该有几个JPanel。您的应用可以有多个JFrame。

答案 3 :(得分:1)

  

使用Java编写图形界面时,在单击按钮时,在应用程序的不同窗口之间切换的适当方法是什么?

在按钮上添加ActionListener。在actionPerformed(ActionEvent)方法中,执行需要完成的任务。

  

即。应该是什么样的窗户,JPanels,JFrames ......?

我建议将主窗口设为JFrame,并为大多数其他元素使用JDialogJOptionPane。或者,可以通过多种方式将多个GUI元素添加到单个空间中 - CardLayoutJTabbedPaneJSplitPaneJDesktopPane/JInternalFrame,..

  

所有组件如何看到“域控制器”(将图形包链接到应用程序逻辑包的类)?

一种方法是在UI之间传递对象的引用。