Java Swing,JComboBox在单击之前下拉列表更改侦听器

时间:2011-11-02 17:22:27

标签: java swing listener jcombobox

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

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

2 个答案:

答案 0 :(得分:4)

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();
            }
        });
    }
}

答案 1 :(得分:0)

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

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