JComboBox 在 Java 中显示空白项

JComboBox showing blank items in Java

我有 2 个 JComboBox: showingsCbtimesCb

showingsCb 包含从我的数据库中提取的电影放映列表。

timesCb 包含基于 showingsCb 的 selection 的电影放映时间列表,该列表也是从我的数据库中提取的。

现在我已经设法用正确的数据填充它们并且逻辑工作正常,但这是我的问题:

我在 showingsCb 中制作了一个 selection,然后启用 timesCb 并在点击 timesCb 后,根据在 showingsCb 中显示 selected。这工作正常。

然后我 select 在 showingsCb 中显示了不同的内容,单击 timesCb 后,列表会下拉并显示一个空白列表。放映时间存在于这个空白列表中,但我看不到它们(我知道它们在那里,因为我可以单击它们应该在的空白处,它会用我的 [= 填充 JComboBox 58=]离子).

我在 JComboBox 上使用 DefaultComboBoxModel,它由 ArrayListVector 填充(使用我自己的方法从我的数据库中检索结果) .我在 showingsCb 上使用 ActionListener 来监听 selection,因此它知道 return.

的显示时间

这是我的代码:

        ArrayList<String> showingNames = Showing.getShowingList();
        showingNames.add(0, "--Select Showing--");
        DefaultComboBoxModel showingNameModel = new DefaultComboBoxModel(showingNames.toArray());
        showingsCb = new JComboBox(showingNameModel);

        Vector timesList = new Vector();
        timesList.add("--Select Time--");
        DefaultComboBoxModel timesModel = new DefaultComboBoxModel(timesList);
        timesCb = new JComboBox(timesModel);
        timesCb.setEnabled(false);

        showingsCb.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {

                timesList.clear();
                timesList.add("--Select Time--");
                timesCb.setSelectedIndex(0);
                if (showingsCb.getSelectedIndex() == 0) {
                    timesCb.setEnabled(false);
                } else {
                    timesCb.setEnabled(true);
                    ArrayList<String> times = Showing.getShowingTimes(Showing.getShowingIDByName(showingsCb.getSelectedItem().toString()));  //gather showing times based on showingID
                    Iterator itt = times.iterator();
                    while (itt.hasNext()) {
                        timesList.add(itt.next());
                    }
                }
            }

        });

下面是结果显示为空白时的截图:

如果我单击该空白下拉列表中的任意位置,那么我选择的 selection 将显示为我的 selected 项目。

我也无法从 timesCb JComboBox

上的代码中废弃 Vector

好的。您的 defaultcomboboxmodel 是用 timesList 初始化的。在动作侦听器中,您清除了这一点,您需要使用新的 timeList 重新初始化您的模型。所以 timesCb.setModel( new DefaultComboBoxModel( timesList ) ) while 循环后将解决你的问题。

或者实际上是更好的方法。您不应该每次都构建一个新模型 class,而是在 while 循环内的动作侦听器中执行此操作:

timesModel.addElement( itt.next() );

这是一种将元素动态添加到第二个 JComboBox and from the docs there's a JComboBox#addItem() method where you can easily add elements to your JComboBox. But I find @svasa a better approach than mine while adding elements to you DefaultComboBoxModel with DefaultComboBoxModel#addElement() 的方法。

在这种情况下,您从未更新过第二个组合框。

这是产生以下输出的代码,如您所见,它开始时处于禁用状态,当您 select 与第一个组合中的 0 不同的索引时它会启用,并在您 select 第一个索引(我的意思是 0)在第一个组合上。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
public class ComboBoxExample {
    JFrame frame;
    java.util.List <String> movies, times;
    JComboBox moviesCombo, timesCombo;
    JPanel pane;
    public ComboBoxExample () {
        frame = new JFrame("Combo Box Example");
        movies = new ArrayList <String>();
        times = new ArrayList <String>();
        pane = new JPanel(new FlowLayout());

        //This simulates the data comes from a DB
        movies.add("Select a movie");
        for (int i = 0; i < 5; i++) {
            movies.add("Movie " + (i + 1));
        }

        DefaultComboBoxModel model1 = new DefaultComboBoxModel(movies.toArray());
        moviesCombo = new JComboBox(model1);

        times.add("Select time");
        DefaultComboBoxModel timesModel = new DefaultComboBoxModel(times.toArray());
        timesCombo = new JComboBox(timesModel);
        timesCombo.setEnabled(false);

        moviesCombo.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                System.out.println(moviesCombo.getSelectedIndex());
                if (moviesCombo.getSelectedIndex() == 0) {
                    timesCombo.setEnabled(false);
                } else {
                    timesCombo.removeAllItems();
                    timesCombo.addItem("Select time");
                    for (int i = 0; i < 5; i++) {
                        timesCombo.addItem("" + (i + 3));
                    }
                    timesCombo.setEnabled(true);
                }
            }
        });

        pane.add(moviesCombo);
        pane.add(timesCombo);

        frame.add(pane);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
    public static void main (String args[]) {
        new ComboBoxExample();
    }
}

此外,如您所见,我也不需要数据库来让它工作,这就是我们所说的 Minimal, Complete, and Verifiable example 或可运行示例,我们可以 copy-paste对于你以后的问题,你可能想看看这个 link,阅读它,然后 post 你以后的问题用类似这段代码的东西,这样我们就可以 copy-paste 它并能够提供帮助你以更好更快的方式。