Swing中是否有一个监听器可以监听启用/禁用事件?

6

我能为 Swing 组合框添加一个监听器,以便在组合框启用或禁用时触发吗?

我尝试过不同的监听器,如 ComponentListener、ItemListener 和 PropertyChangeListener,但都没有成功。我正在使用 JDK 1.6。


Swing组件支持的监听器,投票关闭也是如此。 - mKorbel
我同意你的看法,@Duncan。他需要一个解决方案,提问并没有什么不对。mKorbel应该尽力回答它。 - afzalex
2
请考虑提供一个可运行的示例,展示您遇到的问题。这将减少混乱并获得更好的回复。 - MadProgrammer
1个回答

11

PropertyChangeListener 看起来对我来说运行得很好...

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class EnabledTest {

    public static void main(String[] args) {
        new EnabledTest();
    }

    public EnabledTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;

            final JComboBox cb = new JComboBox(new Object[]{"One", "Two", "Three"});
            add(cb, gbc);
            cb.addPropertyChangeListener("enabled", new PropertyChangeListener() {
                @Override
                public void propertyChange(PropertyChangeEvent evt) {
                    System.out.println("State changed for " + evt.getPropertyName() + " to " + evt.getNewValue());
                }
            });

            JButton btn = new JButton("Switch");
            add(btn, gbc);
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    cb.setEnabled(!cb.isEnabled());
                }
            });
        }

    }

}

这对大多数用例来说可能是一个小问题,但我认为值得注意的是,只有通过JComponent.setEnabled(boolean)设置启用/禁用状态时,此实现才能正常工作。我进行了一些测试,如果使用已弃用的方法JComponent.enable()JComponent.disable()JComponent.enable(boolean)调用启用状态,则不会触发属性更改。对于扩展Component而不是JComponent的组件,如Component.setEnabled(boolean),它似乎也无法正常工作。 - NateW
@NateW 既然我们特别谈论 Swing,那么你对 java.awt.Component 和已弃用的功能都有问题,我并不感到惊讶。 - MadProgrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接