我最近实施了一个 Action
切换业务功能的启用状态。每当用户调用该操作时,我设置一个布尔标志:“willenable”来确定下一次调用是启用还是禁用该函数。同样地,我更新动作名称、简短描述和图标以反映新的状态。然后在我的 actionPerformed(...)
方法我会根据 willEnable
.
这是正确的方法还是有人能推荐一个更好的方法(我怀疑这是一个常见的问题)(我看得出来 JToggleButton
作为一个两态按钮,但我希望这个行动是在一个可见的 JMenuBar
以及 JButton
,因此不认为这是合适的)。
编辑
具体来说,像idea这样的应用程序如何处理这个问题?他们会使用多状态操作(如上所述)还是交换不同的 Action
变成一个给定的 JButton
使用 setAction(Action)
? 也许这种方法更好?
当更新一个动作的属性时,我可以依赖用它初始化的gui组件吗 Action
(例如。 JButton
)自动重新绘制自己?如果 JButton
尺寸会因此改变吗?我应该重新验证 JPanel
我自己?
更改动作名称是件坏事吗?这是我唯一可以更改jbutton文本的方法,但是我很清楚,如果操作被放置在 ActionMap
.
提前谢谢。
2条答案
按热度按时间jgzswidk1#
我希望任何用数据“模型”创建的gui组件(我将包括
Action
(作为数据模型)应该将自己注册为该模型的侦听器。它必须采取适当的行动PropertyChangeEvent
被解雇:在我看来,任何其他行为都将构成一个错误。这里值得怀疑的是,改变行为名称是否合法;我认为这是不合法的。您的操作在逻辑上是toggleenabledstatus,并且不会因为已调用该操作而更改。任何需要显示任何其他文本的组件都应该将自己注册为
Action
然后检查你的willEnable
标志以采取适当的,呃,行动。或者,您可以编写自己的实现
ToggleButtonModel
以及Action
同时从内部控制变更事件。然而,这是很多代码,几乎没有什么好处nbnkbykc2#
您可能需要查看状态模式。
基本上,为每个状态创建一个接口和两个(或更多)接口实现。举个简单的例子,disable状态可能只是实现接口,使其不做任何事情,而enabled状态执行一些操作。要切换状态,只需执行以下操作
虽然对于单个方法来说这是一点开销,但是只要您有几个方法根据单个状态改变它的行为,就一定会有回报。