两次单击以执行操作?

时间:2020-07-02 19:50:52

标签: java swing jtable jbutton

我正在尝试创建默认情况下禁用的JButton。当用户单击JTable中的一行时,我希望按钮变为启用状态。问题是我有多个JTables,单击另一个表选项卡后,我需要再次禁用该按钮。 出于某些原因,需要点击Jtable标签两次才能禁用Jbutton

以下是我的动作监听器的两个示例,它们启用了按钮:

jtblSunLessons.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
    @Override
    public void valueChanged(ListSelectionEvent event) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                btnDelLesson.setEnabled(true);
            }
        });
    }
});

jtblMonLessons.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
    @Override
    public void valueChanged(ListSelectionEvent event) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                btnDelLesson.setEnabled(true);
            }
        });
    }
});

这是我在单击另一个选项卡时禁用按钮的方法:

private void jTabbedPane1MouseClicked(java.awt.event.MouseEvent evt) {                                          
    btnDelLesson.setEnabled(false);
    jtblSunLessons.getSelectionModel().clearSelection();
    jtblMonLessons.getSelectionModel().clearSelection();
}

我试图找出问题所在,但找不到任何解决方案。我该如何解决?

1 个答案:

答案 0 :(得分:0)

侦听器的代码不正确。同时也不需要invokeLater()(感谢camickr)。这是我的更正代码:

        ListSelectionModel model2 = jtblSunLessons.getSelectionModel();
        model2.addListSelectionListener(new ListSelectionListener(){
            @Override
            public void valueChanged(ListSelectionEvent e){
                if(e.getValueIsAdjusting()){
                    return;
                }
                ListSelectionModel lsm = (ListSelectionModel) e.getSource();
                
                if(lsm.isSelectionEmpty()){
                    btnDelLesson.setEnabled(false);
                }
                else{
                    btnDelLesson.setEnabled(true);
                }
            
            }
        });```

I disabled the button at the beginning of the code and reset the button to disabled inside the tabbed panes' actionPerformed. Also make sure to clearSelection for each table in the actionPerformed.