动态 JComboBoxes

Posted

技术标签:

【中文标题】动态 JComboBoxes【英文标题】:Dynamic JComboBoxes 【发布时间】:2011-03-12 15:12:57 【问题描述】:

我有以下数据(字符串):

Course1: A1
Course1: A2
Course2: B1
Course2: B2
Course2: B3
Course2: B4
Course3: C1
Course3: C2

我想创建两个JComboBox(JComboBox1、JComboBox2),让JComboBox1包含Course1、Course2、Course3等。

如果我从 JComboBox1 中选择 Course2,则对应的 B1、B2、B3、B4 应填充到 JComboBox2 中。

如何实现?非常感谢。

【问题讨论】:

检查JList 的类似示例here。 【参考方案1】:

是的,只需为每个集合创建一个DefaultComboBoxModel,并在JComboBox1 更改时对JComboBox2 执行setModel()

附录:例如,

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ComboTest extends JPanel implements ActionListener, Runnable 

    private final JComboBox combo1 = new JComboBox(
        new String[]"Course 1", "Course 2", "Course 3");
    private final JComboBox combo2 = new JComboBox();
    private ComboBoxModel[] models = new ComboBoxModel[3];

    public ComboTest() 
        models[0] = new DefaultComboBoxModel(
            new String[]"A1", "A2");
        models[1] = new DefaultComboBoxModel(
            new String[]"B1", "B2", "B3", "B4");
        models[2] = new DefaultComboBoxModel(
            new String[]"C1", "C2");

        combo2.setModel(models[0]);
        this.add(combo1);
        this.add(combo2);
        combo1.addActionListener(this);
    

    @Override
    public void actionPerformed(ActionEvent e) 
        int i = combo1.getSelectedIndex();
        combo2.setModel(models[i]);
    

    @Override
    public void run() 
        JFrame f = new JFrame("ComboTest");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    

    public static void main(String[] args) 
        EventQueue.invokeLater(new ComboTest());
    

【讨论】:

@PujanSrivastava:也可以考虑List<ComboBoxModel>;在 Java 7 中,List<ComboBoxModel<String>>. @trashgod 这个例子是针对桌面应用程序的,你能指点一下在 Web 应用程序的情况下该怎么做吗? @SaumilSoni:模型原理是一样的,不过具体看你的框架,example。【参考方案2】:

是的。您可以将更改事件侦听器添加到第一个 JComboBox 以更新第二个 JComboBox 的值。

类似的东西

// first comboBox
final JComboBox courseBox = new JComboBox(
                               new String[]"Course 1", "Course 2", "Course 3");

final JComboBox box2 = new JComboBox();

// Now listen for changes
courseBox.addActionListener(new ActionListener()
   void actionPerformed(ActionEvent e)
       if(courseBox.getSelectedItem().equals("Course 1"))
           // we know that the user picked "Course 1", now change box2 to match
           // first clear everything
           box2.removeAllItems();
           // now add back relevant values
           box2.addItem("A1");
           box2.addItem("A2");
       else if(...)
           // ...
       
   
);

【讨论】:

以上是关于动态 JComboBoxes的主要内容,如果未能解决你的问题,请参考以下文章

算法动态规划 ② ( 动态规划四要素 | 动态规划状态 State | 动态规划初始化 Initialize | 动态规划方程 Function | 动态规划答案 Answer )

算法动态规划 ② ( 动态规划四要素 | 动态规划状态 State | 动态规划初始化 Initialize | 动态规划方程 Function | 动态规划答案 Answer )

CocosCreator-如何动态加载资源

OC是动态运行时语言是什么意思?什么是动态识别,动态绑定?

动态添加/删除多个输入字段和输入行 PHP(动态表单中的动态表单)

动态代理与动态编译