Java Swing,JComboBox下拉列表更改侦听器,然后单击

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

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

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

FocusListener可能是个好主意。 这里有一些关于如何实现的信息。

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