我希望能够细分 JComboBox 中的选项(这是一个相当广泛的列表,可能有 14 个元素左右),并呈现选项菜单样式。
例如,我希望 JComboBox 的下拉菜单是 Dog、Cat 和 Bird。当用户将鼠标移到“狗”选项上时,我希望在下拉菜单的右侧弹出一个菜单,其中包含“比格犬”、“贵宾犬”和“拉布拉多犬”选项。这样,用户就不会同时看到庞大的列表。这应该像一个菜单。
我可以这样做吗?如果不是通过一些 API,通过某种 hack?
在这种情况下,通常的方法是将狗、猫和鸟放在一个组合中,然后再组合一个组合。对于根据第一个组合中的选择填充的子类型。例如
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;
class PetSelector {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
JPanel gui = new JPanel(new GridLayout(0,1,5,5));
String[] speciesName = { "Dog", "Cat", "Bird"};
final String[][] breedName = {
{"Basenji", "Pomeranian", "Alsation"},
{"Burmese", "Persian", "Siamese"},
{"DoDo", "Archeopteryx", "Pheonix"}
};
final JComboBox petSpecies = new JComboBox(speciesName);
final JComboBox petBreed = new JComboBox();
ItemListener speciesListener = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
int ii = petSpecies.getSelectedIndex();
ComboBoxModel cbm = new DefaultComboBoxModel(breedName[ii]);
petBreed.setModel(cbm);
petBreed.requestFocusInWindow();
}
};
petSpecies.addItemListener(speciesListener);
gui.add(petSpecies);
gui.add(petBreed);
JOptionPane.showMessageDialog(null, gui);
}
};
// Swing GUIs should be created and updated on the EDT
// http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
SwingUtilities.invokeLater(r);
}
}