Java秋千编程结构:听众是否应该是几乎所有秋千组件的来源?
题
我的问题归结为这一点:是否在摇摆编程中是标准结构,以使听众对新组件(例如新的jpanel)进行控制和输入,并让新组件的听众控制新组件以进行显示和输入,等等到无限?还是Java需要恢复到以程序顺序将所有摇摆组件联系在一起的某种统一类?
目前,在我的应用程序中,仅在我的听众中使用一个Jframe,我的初始Jframe对象作为参数传递给了我所有的Jpanels,因此他们的听众可以致电removeAll()清除新的jpanel的框架。例如,简短代码如下
public class MainFrame {
JFrame jfrm;
public MainFrame() {
jfrm = new JFrame("Main Frame");
JPanel mainPanel = new MainPanel(jfrm);
}
}
public class MainPanel extends JPanel {
public MainPanel(final JFrame mainFrame) {
JButton example = new JButton("Example");
example.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent le) {
mainFrame.removeall();
JPanel 2ndPanel = new 2ndPanel(mainFrame);
mainFrame.add(2ndPanel);
mainFrame.validate();
}
});
}
}
这是正确的结构吗?是听众生成新面板而不是某些统一类的地方?但是,如果是这样,那么Java的编译器如何到达Mainfame.validate()如果有层叠的听众无限?我是一个老式的程序员程序员,试图在Java中编程Swing应用程序,我认为我可能没有掌握Swing编程的基本概念。期待任何有用的答案,并提前感谢!
解决方案
我不会那样做。这 观察者模式 通常是由于用户操作而用于发送通知的。
以您的示例:用户在按钮上“单击”,因为他想要大型机中的新面板。但是该按钮不知道该如何单击。他所能做的就是通知 活动听众, ,已被选中。
因此,我们需要一些对通知感兴趣的组件。该组件可以用按钮注册侦听器并接收通知。听众是其他组件“耳朵”(或它是“眼”)。但是耳朵(或眼睛)不会采取行动。它只是其他组件传感器。
这使我们回到了主要问题: 谁 想通知,如果单击按钮, 谁 必须采取行动。这是一个主要的设计问题。绝对是 不是 为主框架创建和添加面板的侦听器。它可能是创建和添加子面板或第三个组件的角色的主要框架角色,这是由子面板创建框架的原因。
但是Listner是此代码的不好地方。
其他提示
而不是破坏和创建面板,您可能需要考虑隐藏/显示它们。有一个可以执行此操作的纸牌层布局管理器: http://journals.ecs.soton.ac.uk/java/tutorial/ui/layout/card.html
基本上,这个想法是构建并在ProG开始时添加所有面板,然后使用布局管理器在视图之间翻转。
正如其他人所说的那样,您可能需要在设计中添加某种模型,该模型负责维护系统状态。
首先,您不应该让听众直接操纵框架,请使用嵌套 JPanel
或者是 ContentPane
.
您的问题取决于听众的位置。您应该只添加组件 JFrame
从班级本身。就您而言,这是可以的,因为逻辑仅限于类本身。
我认为没有无限的听众。它们在列表中,并顺序执行。您的听众应该使用 SwingUtilities.invokeLater
用于操纵主框架。
我发现 JFrame
作为论点有些多余。为什么不从构造函数外部创建听众?
final JPanel mainPanel = new MainPanel();
JButton example = new JButton("Example");
example.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent le) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
MainFrame.this.removeAll();
MainFrame.this.add(mainPanel);
}
});;
}
});
add(example);
这不是最好的例子,但我注意到您要做什么。
最重要的是您应该创建组件 外部 侦听器,然后使用侦听器添加。
您组织了代码的方式,而不是罕见的方式存在一些混乱。作为Java的一般规则,不要在没有理由的地方子类。子类很少有意义 JPanel
或者 JFrame
.
将组件分配给创建它们的类中的字段也很少有意义。实际上,在构造函数中少做。
在匿名内部类中也要少做。缠绕事件数据并调用一种方法,该方法对于封闭类作为操作的方法很有意义。