2010-08-09 62 views
1

我试图创建一个子类JButton组件的,这将使或者基于条件禁用本身(这看起来像下面)的JButton更新了自己的IsEnabled值

public interface Condition { 
    public static final Condition TRUE = new Condition() { 
              public boolean test() { 
               return true; 
              } }; 
    public static final Condition FALSE = new Condition() { 
              public boolean test() { 
               return false; 
              } }; 
    public boolean test(); 
} 

然而,将JButton代码全部基于在JButton类中私有存储的实际布尔值。我的问题是:可以重写JButton的哪个方法来更新其存储的isEnabled布尔值(通过setEnabled(boolean))?它会更新(图形)?或repaint()?或者其他一些功能?

编辑:意识到我正在尝试创建的东西实际上是不可能的,除非您有一个单独的线程等待短时间并强制按钮检查其状态(这是严重的,我不想去做)。事实是,按钮只是被动的。使用按钮类的人可能会花费一些开销来完成这个任务,但是在那个时候,只要在实际上正在改变的任何事物上编写监听器并且在那一点上切换按钮会更容易。 Woops。

回答

1

例如,DefaultButtonModel保持stateMask,其包括用于启用状态的位。您可以相应地实施ButtonModel界面。

附录:作为替代方案,并作为制品Key Bindings中所指出的,“的Actions另一个优点是,它们具有使能状态,这提供了一种简单的方法来禁用动作,而无需跟踪哪些组件它连接到。 “有关更多信息,请参阅How to Use Actions

+0

我结束了实现ButtonModel接口。这里的目标是在我正在处理的库中创建一个新的按钮类,它可以使其“isEnabled”标志成为条件语句,以便它自动打开和关闭。它现在正在工作,但它看起来并不正确。当文本禁用时,文本会变灰,但该按钮仍然显示其主图标(即不是“禁用”图标) – Isaac 2010-08-09 20:25:42

+0

@Isaac:我必须同意@eugener,“Action”是更简单的方法。如果您使用'ButtonModel',则需要管理'EventListenerList'并在启用状态更改时执行'fireStateChanged()':http://download-llnw.oracle.com/javase/6/docs/api /javax/swing/event/EventListenerList.html – trashgod 2010-08-10 03:13:39

1

我强烈建议使用Actions来实现这样的功能。

您应该启用/禁用附加到您的按钮的动作。在Swing中,同样的动作可以与许多类型的组件相关联,例如按钮,菜单项等。通过禁用特定动作,您将自动禁用所有关联的组件。

当你有相同的一组动作的工具栏,上下文菜单等,这变得非常方便。