如何在条件下启用 JButton?

Posted

技术标签:

【中文标题】如何在条件下启用 JButton?【英文标题】:How to enable a JButton on a condition? 【发布时间】:2021-08-25 20:48:47 【问题描述】:

我正在尝试创建一个在满足某些条件时启用的 JButton。程序将setEnabled(false)设置为初始值,但更新后应该是setEnabled(true)

我尝试了几件事。这里有一些代码:

public class SwimAction extends AbstractAction 
    private final PoolModel poolModel;
    private final Swimmer swimmer;

    public SwimAction(PoolModel poolModel, Swimmer swimmer) 
        super("GO!");
        this.poolModel = poolModel;
        this.swimmer = swimmer;
        // default
        setEnabled(false);
    

我尝试了以下方法:

// Replaced the setEnabled(false) by setEnabled(checkGo())
public boolean checkGo()
        return(pool.isNotOccupied());
    
// Overwrite setEnabled
@Overwrite
public void setEnabled(boolean bool)
        boolean oldBool = this.enabled;
        if (oldBool != bool && pool.isNotOccupied()) 
            this.enabled = bool;
            this.firePropertyChange("enabled", oldBool, bool);
        
    

但是,它们都不起作用。任何人都知道如何在满足特定条件(pool.isNotOccupied())时启用按钮?

【问题讨论】:

是什么触发了条件的变化? 这个是你需要连接你的监听器的地方 所以你建议我应该将监听器附加到pool.isNotOccupied() 更改的点? 不,给setOccupied(boolean occupied)方法添加一个监听器 @HovercraftFullOfEels 谢谢!我会试试的! 【参考方案1】:

似乎您需要侦听池对象的占用属性状态的变化,最好的方法是给它一个某种类型的侦听器。这可以像 ChangeListener 一样简单,或者更好的是 PropertyChangeListener。最佳解决方案的细节可能在很大程度上取决于您的程序结构,以及我们看不到的其余代码,但是,如果 PoolModel 是您正在听的,如果您给出它会怎样......

public class PoolModel 
    public static final String OCCUPIED = "occupied";
    private PropertyChangeSupport propChangeSupport = new PropertyChangeSupport(this);
    private boolean occupied;
    
    public void addPropertyChangeListener(PropertyChangeListener l) 
        propChangeSupport.addPropertyChangeListener(l);
    
    
    // also have a remove listener
    
    public boolean isOccupied() 
        return occupied;
    
    
    public void setOccupied(boolean occupied) 
        boolean oldValue = this.occupied;
        boolean newValue = occupied;
        this.occupied = occupied;
        propChangeSupport.firePropertyChange(OCCUPIED, oldValue, newValue);
    
    
    // ......
    
    

然后在使用它的代码中:

poolModel.addPropertyChangeListener(pcEvent -> 
    if (pcEvent.getPropertyName().equals(OCCUPIED)) 
        setEnabled((boolean) pcEvent.getNewValue());
    
);

【讨论】:

这正是我错过的!谢谢!

以上是关于如何在条件下启用 JButton?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中的某些布尔条件下启用按钮?

如何启用/禁用提交按钮,仅在提供两个条件的情况下:检查输入单选和填充输入文本

如何编写 jButton 以将笔记本电脑或设备切换到省电模式

如何在不使用 JButton 的情况下触发 Java 应用程序上的链接

如何通过单击 JButton 添加 JPanel?

如何在 WPF 中的删除操作之前启用文本框并等待输入条件