2012-05-12 61 views
2

在Swing项目时,我使用了一个JFrame,把它分成三个部分:菜单窗格,一个情景窗格状态窗格添加监听到的JFrame和所有子

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

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

这有两种解决方法,我能想到的:

  1. 明确几秒钟后的状态。
  2. 向所有组件(JPanelsJTextFields,...)添加鼠标或键盘动作侦听器,以便在来自鼠标或键盘的活动时它们调用状态面板来清除状态。

尽管实施第一个选项相对简单,但还不够。我想我需要两者的结合。然而,问题在于,如果我想将这些动作侦听器添加到所有组件,它将是一个非常肮脏的方法。也许我可以将它添加到主框架。我做了(代码在下面给出),但是如果只在鼠标在框架自己的面板上移动时才起作用(例如,不在上下文窗格上)

您有什么建议吗?

JFrame.this.addMouseMotionListener(new MouseMotionListener() { 

     @Override 
     public void mouseDragged(MouseEvent me) { 
     } 

     @Override 
     public void mouseMoved(MouseEvent me) { 
      Config.statusPanel.clearStatus(); 
     } 
    }); 

回答

2

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

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

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

+1

或者,您的模型可以将更改推送给某个状态管理器,而不是侦听模型上的更改,然后更新UI中的状态。但基本原则仍然相同 – Robin

+1

@Robin:只要模型不必担心知道任何视图的任何内容,就可以拉或推数据。 –