【问题标题】:Java Swing, JComboBox drop down list change listener before clickingJava Swing,JComboBox下拉列表更改监听器点击前
【发布时间】:2011-12-20 12:59:35
【问题描述】:

我有一个 JComboBox,它有一个 midi 文件列表,我想知道以下是否可行: 当我单击 JComboBox 时,会打开一个下拉列表,当我将鼠标移到一个 MIDI 文件上时,它会播放 10 秒的样本声音,所以我知道文件包含什么在我单击并选择该文件之前,所以如果我有50个midi文件,我可以打开列表并在列表中上下移动鼠标而不点击它,但仍然播放鼠标指向的文件中的10秒样本,然后在我决定哪一个,点击它,那个就是JComboBox中选中的那个。

如何从 JComboBox 获得鼠标位置更改/指向事件的通知?

【问题讨论】:

    标签: java swing listener jcombobox


    【解决方案1】:
    How to get notified for the mouse position change/pointing events 
    from the JComboBox ?
    
    • 通过实现ItemListener,触发了两次(SELECTEDDESELECTED

    • 在那里添加CustomRenderer

    或者...

    例如,JComboBox 的三个可能事件

    import java.awt.Component;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.plaf.basic.BasicComboBoxRenderer;
    
    
    public class ComboBoxHoverOver {
    
        private JComboBox combo = new JComboBox();
    
        public ComboBoxHoverOver() {
            combo.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXXXXX");
            combo.setRenderer(new ComboToolTipRenderer(combo));
            combo.addItemListener(new ItemListener() {
    
                @Override
                public void itemStateChanged(ItemEvent e) {
                    System.out.println(combo.getSelectedItem().toString());
                }
            });
            combo.addItem("");
            combo.addItem("Long text 4");
            combo.addItem("Long text 3");
            combo.addItem("Long text 2");
            combo.addItem("Long text 1");
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(combo);
            f.pack();
            f.setVisible(true);
        }
    
        private class ComboToolTipRenderer extends BasicComboBoxRenderer {
    
            private static final long serialVersionUID = 1L;
            private JComboBox combo;
            private JList comboList;
    
            ComboToolTipRenderer(JComboBox combo) {
                this.combo = combo;
            }
    
            @Override
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                if (comboList == null) {
                    comboList = list;
                    KeyAdapter listener = new KeyAdapter() {
    
                        @Override
                        public void keyReleased(KeyEvent e) {
                            if (e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_UP) {
                                int x = 5;
                                int y = comboList.indexToLocation(comboList.getSelectedIndex()).y;
                                System.out.println(comboList.getSelectedIndex());
                            }
                        }
                    };
                    combo.addKeyListener(listener);
                    combo.getEditor().getEditorComponent().addKeyListener(listener);
                }
                if (isSelected) {
                    System.out.println(value.toString());
                }
                return this;
            }
        }
    
        public static void main(String[] args) {
    
            java.awt.EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    ComboBoxHoverOver comboBoxHoverOver = new ComboBoxHoverOver();
                }
            });
        }
    }
    

    【讨论】:

    • 优秀!这就是我一直在寻找的答案,干得好,谢谢!
    【解决方案2】:

    FocusListener 可能是个好主意。以下是有关如何实施的一些有用信息。

    http://download.oracle.com/javase/tutorial/uiswing/events/focuslistener.html

    【讨论】:

      猜你喜欢
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多