我正在使用JAVA Netbeans。我已经有了我的菜单,这是第一张照片:
当我按下其中一个menuItem时,会打开一个新的jDialog,其中包含以下内容:
我希望当我按下菜单项时,我在jDialog上的所有组件都会在jFrame中打开...所以他们可以调整到主框架。我希望这发生在我拥有的每个menuItem上,所以当我按下另一个menuItem时,它会替换我现在在jFrame上的所有信息,或者如果可能的话打开某种标签?
答案 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
方法并将视图实例传递给它!魔术!
总体而言,您还可以考虑使用Controller
或show
来进一步改善用户体验,具体取决于用户界面的复杂程度。有关详细信息,请参阅How to use CardLayout和How to Use Tabbed Panes。
而且,因为我知道你在看到它运行之前不会满意,我用来测试这个想法的基本代码......
CardLayout
现在,在我被烤之前,我知道这不是传统的" MVC,但Swing都不是,所以我专注于提供解耦的解决方案