Java 使JComboBox的行为类似于带有细分的菜单

Java 使JComboBox的行为类似于带有细分的菜单,java,swing,menu,jcombobox,Java,Swing,Menu,Jcombobox,我希望能够细分JComboBox中的选项(这是一个相当广泛的列表,可能有14个元素左右),并呈现选项菜单样式 例如,我希望JComboBox中的下拉菜单为Dog、Cat和Bird。当用户将鼠标移到选项“Dog”上时,我希望在下拉列表的右侧弹出一个菜单,其中包含选项“Beagle”、“Poodle”和“Labrador”。这样,用户就不会同时看到庞大的列表。这应该像菜单一样 我能做这个吗?如果不是通过某种API,通过某种黑客?在这种情况下,通常的方法是将狗、猫和鸟放在一个组合中,然后再放在另一个组

我希望能够细分JComboBox中的选项(这是一个相当广泛的列表,可能有14个元素左右),并呈现选项菜单样式

例如,我希望JComboBox中的下拉菜单为Dog、Cat和Bird。当用户将鼠标移到选项“Dog”上时,我希望在下拉列表的右侧弹出一个菜单,其中包含选项“Beagle”、“Poodle”和“Labrador”。这样,用户就不会同时看到庞大的列表。这应该像菜单一样


我能做这个吗?如果不是通过某种API,通过某种黑客?

在这种情况下,通常的方法是将狗、猫和鸟放在一个组合中,然后再放在另一个组合中。对于根据第一个组合中的选择填充的子类型。例如

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


在这种情况下,通常的方法是将狗、猫和鸟放在一个组合中,然后再放在另一个组合中。对于根据第一个组合中的选择填充的子类型。例如

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


啊,谢谢@Andrew Thompson,我忘记了swing标记,重点是用户不想通过14个元素的长列表进行解析,除非对其进行细分。“用户不想通过14个元素的长列表进行解析”我不同意,但是..你比我更了解你的用户。试着从一个可能的解决方案开始看看JMenu有什么问题?你可以让它出现在右键单击上。啊,谢谢@Andrew Thompson我忘记了swing标记。关键是用户不想通过14个元素的长列表进行解析,除非它被细分。“用户不想通过14个元素的长列表进行解析”我不同意,但是..你比我更了解你的用户。试着从一个可能的解决方案开始看看JMenu有什么问题?您可以让它显示在右键单击上。