我的问题归结为这一点:是否在摇摆编程中是标准结构,以使听众对新组件(例如新的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.

将组件分配给创建它们的类中的字段也很少有意义。实际上,在构造函数中少做。

在匿名内部类中也要少做。缠绕事件数据并调用一种方法,该方法对于封闭类作为操作的方法很有意义。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top