向JFrame和所有子组件添加侦听器

时间:2012-05-12 19:42:36

标签: java swing

在Swing项目中,我使用了JFrame并将其分为三个部分: 菜单窗格 上下文窗格 ,以及 状态窗格

状态窗格在执行操作时向用户显示其操作是否成功,以及用户可能想要了解的其他信息。例如,如果用户单击上下文菜单中的删除按钮,状态面板将指示操作是否成功完成。

状态面板的问题是它需要在一段时间后更新其状态。例如,如果用户单击另一个按钮或浏览上下文窗格中的其他页面,则状态窗格不应仍显示上次删除操作的结果。

有两种解决方法,我可以想到:

  1. 几秒后清除状态。
  2. 为所有组件(JPanelsJTextFields和...)添加鼠标或键盘操作侦听器,以便他们调用状态面板以清除状态,鼠标或键盘。
  3. 虽然实现第一个选项相对简单,但还不够。我想我需要两者的结合。但问题是,如果我想将这些动作侦听器添加到所有组件,那将是一种非常脏的方法。也许我可以把它添加到主框架。我做了(代码在下面给出),但是如果鼠标在框架自己的面板上移动(例如,不在上下文窗格中),则只能起作用

    你有什么建议吗?

        JFrame.this.addMouseMotionListener(new MouseMotionListener() {
    
            @Override
            public void mouseDragged(MouseEvent me) {
            }
    
            @Override
            public void mouseMoved(MouseEvent me) {
                Config.statusPanel.clearStatus();
            }
        });
    

1 个答案:

答案 0 :(得分:2)

不,使用MouseListener是有点疯狂,你自己说这是一个肮脏的解决方案。相反,我认为使用PropertyChangeListener监听类的状态(很可能是Model类,而不是视图类)会更好。

例如,用户按下JButton(视图类中的一个组件),控件类对此按钮的响应做出反应,并告诉模型更改其状态。然后,状态窗格的PropertyChangeListener将响应模型的状态更改并更新其自己的视图。这是解决这个问题的最干净的OOP方法。

为了使其运行良好,您的程序应基于模型 - 视图 - 控制器模式的一种变体,但无论如何它应该这样做。