0

我该如何PropertyChangeListener使用JComboBox?当我在 editable 中写入时JComboBox,我会立即写入文本,因为我更改了组合框箭头按钮的图标;关键听众不再工作。这是我尝试过的,但我不知道如何完成:

editor = (JTextComponent) jComboBox1.getEditor().getEditorComponent();

editor.addPropertyChangeListener(new PropertyChangeListener()
{
    @Override
    public void propertyChange(PropertyChangeEvent evt) 
    {

    }       

});
4

1 回答 1

3

从帖子中理解您想要实现的目标有点困难,但如果您有兴趣了解编辑器内容何时更改,您可以尝试

final JComboBox combo = new JComboBox();
combo.setEditable(true);
((JTextComponent) combo.getEditor().getEditorComponent()).getDocument().addDocumentListener(new DocumentListener() {
    protected void updatePopup() {

        if (combo.isDisplayable()) {

            if (!combo.isPopupVisible()) {

                combo.showPopup();

            }

        }

    }

    @Override
    public void insertUpdate(DocumentEvent e) {
        updatePopup();
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        updatePopup();
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
        updatePopup();
    }
});

通常,我会创建一个“DocumentHandler”作为具体类并使用它,但该示例演示了基本思想

更新了一个 UI 示例

public class TestComboBox extends JFrame {

    public TestComboBox() {

        setTitle("Test");
        setSize(200, 200);
        setLayout(new GridBagLayout());
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        final JComboBox combo = new JComboBox();

        /**** You have to do this first
         **** Doing this invalidates any previous listeners
         ****/
        combo.setUI(ColorArrowUI.createUI(combo));

        combo.setEditable(true);
        ((JTextComponent) combo.getEditor().getEditorComponent()).getDocument().addDocumentListener(new DocumentListener() {
            protected void updatePopup() {

                if (combo.isDisplayable()) {

                    if (!combo.isPopupVisible()) {

                        combo.showPopup();

                    }

                }

            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                updatePopup();
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                updatePopup();
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                updatePopup();
            }
        });

        combo.setModel(createComboBoxModel());

        add(combo);

        setVisible(true);

    }

    protected ComboBoxModel createComboBoxModel() {

        DefaultComboBoxModel model = new DefaultComboBoxModel();

        File file = new File("../TestWords/Words.txt");
        BufferedReader reader = null;

        try {

            reader = new BufferedReader(new FileReader(file));
            String text = null;
            while ((text = reader.readLine()) != null) {

                model.addElement(text);

            }

        } catch (Exception e) {
        } finally {

            try {
                reader.close();
            } catch (Exception e) {
            }

        }

        return model;

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
        } catch (InstantiationException ex) {
        } catch (IllegalAccessException ex) {
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        }
        new TestComboBox();
    }

    public static class ColorArrowUI extends BasicComboBoxUI {

        public static ComboBoxUI createUI(JComponent c) {
            return new ColorArrowUI();
        }

        @Override
        protected JButton createArrowButton() {
            return new BasicArrowButton(
                            BasicArrowButton.SOUTH,
                            Color.cyan, Color.magenta,
                            Color.yellow, Color.blue);
        }
    }
}

使用 UI 设置

由用户界面设置

使用画家设置

由画家设置

更新

这是 kleopatra 向您展示的代码

Painter painter = new Painter<JComponent>() {

    @Override
    public void paint(Graphics2D g, JComponent object, int width, int height) {

        g.setColor(Color.WHITE);
        g.fillRect(0, 0, width, height);

    }

};

JButton org = null;
for (int i = 0; i < combo.getComponentCount(); i++) {
    if (combo.getComponent(i) instanceof JButton) {
        org = (JButton) combo.getComponent(i);
        UIDefaults buttonDefaults = new UIDefaults();
        buttonDefaults.put("ComboBox:\"ComboBox.arrowButton\"[Enabled].foregroundPainter", painter);
        org.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
        org.putClientProperty("Nimbus.Overrides", buttonDefaults);
        break;
    }
}
于 2012-08-25T01:18:22.243 回答