按menuItem

时间:2017-11-04 22:56:44

标签: java netbeans jframe jpanel jdialog

我正在使用JAVA Netbeans。我已经有了我的菜单,这是第一张照片:

enter image description here

当我按下其中一个menuItem时,会打开一个新的jDialog,其中包含以下内容:

enter image description here

我希望当我按下菜单项时,我在jDialog上的所有组件都会在jFrame中打开...所以他们可以调整到主框架。我希望这发生在我拥有的每个menuItem上,所以当我按下另一个menuItem时,它会替换我现在在jFrame上的所有信息,或者如果可能的话打开某种标签?

1 个答案:

答案 0 :(得分:0)

任何解决方案都需要某种形式的模型 - 视图 - 控制器。这将有助于在解耦API时实现功能。

首先,我先来看看How to use Actions。这些是独立的工作单元,可以轻松应用于按钮和键绑定,并为可重复使用的代码片段提供基础。

例如,我们可以定义一个非常简单的Action,它只是简单地管理视图与控制器的交互,以便于切换视图:

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);
    }

}

Action并不关心"如何" Controller工作,只有当它将视图传递给它时,视图才会显示在屏幕上,因此控制器的底层实现会改变,但是,由于API建立的合同,{ {1}}不需要更改。

现在,您可以使用Action来处理创建Controller和管理JDialog的{​​{1}},并根据需要将它们链接在一起。

好的,但是这实际上是如何让你的生活变得更简单我听到你的问题?

好吧,让我们假设您有这样的观点...

Controller

为了在屏幕上显示它,我们需要首先定义它自己的JFrame ...

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)); s Action方法并将视图实例传递给它!魔术!

总体而言,您还可以考虑使用Controllershow来进一步改善用户体验,具体取决于用户界面的复杂程度。有关详细信息,请参阅How to use CardLayoutHow to Use Tabbed Panes

而且,因为我知道你在看到它运行之前不会满意,我用来测试这个想法的基本代码......

CardLayout

现在,在我被烤之前,我知道这不是传统的" MVC,但Swing都不是,所以我专注于提供解耦的解决方案