微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在条件下启用 JButton?

如何解决如何在条件下启用 JButton?

我正在尝试创建一个在满足特定条件时启用的 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()) 时启用按钮吗?

解决方法

似乎您需要监听池对象的 occupied 属性状态的变化,最好的方法是给它一个某种监听器。这可以像 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());
    }
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。