答案 0 :(得分:1)
答案 1 :(得分:1)
因此,根据您的代码,每个菜单项都会创建相同的组件并将其添加到新的JInternalFrame
,这显然不是您想要的,而是您希望每个菜单项都创建它根据需要自己观点。
有几种方法可以实现这一点,但由于所有这些方法的基本机制相同,因此您可以减少需要执行的复制粘贴操作的数量。
首先,首先定义您需要的实际视图/组件
public class AddOwnerPane extends JPanel {
//...
}
public class AddResidentialPropertyPane extends JPanel {
//...
}
public class AddCommercialPropertyPane extends JPanel {
//...
}
我试图确定是否有任何可以在视图之间共享的公共属性,但是无法确定,但如果可以,您可以从其他视图中继承或定义“常见的“视图可以添加到其他视图中,以进一步减少代码重复。
当谈到这类问题时,你有两个基本的选择,你可以使用继承,你可以定义一个基类,其他所有人都可以从中扩展...
或作文......
“共同”部分(实际上)是一个独立的类,但是你在另一个类中使用它。
在GUI中使用继承是棘手的,因为你需要处理布局(特别是)。这是有问题的,因为基础类布局可能具有非常特定的要求,如果搞砸了,则很快就会崩溃,使得添加新组件变得困难。基类可能也有自己定义的生命周期和管理期望,这也会使你的新需求变得棘手
在这些情况下,我通常会发现易于设计和管理的作品。
关于这个问题有很多讨论,例如:
因此,丢失有关该主题的信息,我将继续研究它
接下来,我们需要定义一个共同的动作,它可以完成大部分繁重的工作
public class ViewAction extends AbstractAction {
private JDesktopPane desktop;
private Class<? extends JComponent> view;
public ViewAction(JDesktopPane desktop, Class<? extends JComponent> view) {
this.desktop = desktop;
this.view = view;
}
@Override
public void actionPerformed(ActionEvent e) {
try {
countFrames++;
JInternalFrame jf = new JInternalFrame("Add Owner", true, true, true, true);
JComponent viewComponent = view.newInstance();
jf.add(viewComponent);
jf.pack();
jf.setLocation(countFrames * 10, countFrames * 20);
jf.setVisible(true);
desktop.add(jf);
} catch (InstantiationException | IllegalAccessException ex) {
ex.printStackTrace();
}
}
}
这是基本Action
,在触发时会创建JInternalFrame
,初始化指定视图的新实例,将其添加到JInternalFrame
并添加JInternalFrame
到桌面窗格。
稍微不同的方法可能会让这个类成为abstract
类,其abstract
方法称为getViewComponent
,它负责创建实际组件而不是Class#newInstance
1}},但是什么对你有用。
接下来,我们定义生成我们想要的视图所需的Action
public class AddOwnerAction extends ViewAction {
public AddOwnerAction(JDesktopPane desktopPane) {
super(desktopPane, AddOwnerPane.class);
putValue(NAME, "Add Owner");
}
}
public class AddResidentialPropertyAction extends ViewAction {
public AddResidentialPropertyAction(JDesktopPane desktopPane) {
super(desktopPane, AddResidentialPropertyPane.class);
putValue(NAME, "Add Residential Property");
}
}
public class AddCommercialPropertyAction extends ViewAction {
public AddCommercialPropertyAction(JDesktopPane desktopPane) {
super(desktopPane, AddCommercialPropertyPane.class);
putValue(NAME, "Add Commercial Property");
}
}
这些Action
中的每一个都从ViewAction
延伸,只是提供Class
将创建并在其中设置各个属性的视图组件所需的Action
引用。
最后,我们为每个动作创建JMenuItem
...
addMenu.add(new JMenuItem(new AddOwnerAction(theDesktop)));
addMenu.add(new JMenuItem(new AddResidentialPropertyAction(theDesktop)));
addMenu.add(new JMenuItem(new AddCommercialPropertyAction(theDesktop)));
基本上,我们定义了一系列自包含的工作单元,这减少了为每个操作添加不同视图组件所需的代码重复数量
有关详细信息,请查看How to Use Actions
答案 2 :(得分:0)