2

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

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

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

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

  1. 几秒钟后清除状态。
  2. JPanels为所有组件( 、和 ...)添加鼠标或键盘操作侦听器,JTextFields以便它们在鼠标或键盘的活动时调用状态面板以清除状态。

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

你有什么建议吗?

    JFrame.this.addMouseMotionListener(new MouseMotionListener() {

        @Override
        public void mouseDragged(MouseEvent me) {
        }

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

1 回答 1

2

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

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

为了使其正常工作,您的程序应该基于模型-视图-控制器模式的变体之一,但无论如何它都应该这样做。

于 2012-05-12T19:58:33.190 回答