JComboBox 在 Java 中显示空白项
JComboBox showing blank items in Java
我有 2 个 JComboBox:
showingsCb
和 timesCb
showingsCb
包含从我的数据库中提取的电影放映列表。
timesCb
包含基于 showingsCb
的 selection 的电影放映时间列表,该列表也是从我的数据库中提取的。
现在我已经设法用正确的数据填充它们并且逻辑工作正常,但这是我的问题:
我在 showingsCb
中制作了一个 selection,然后启用 timesCb
并在点击 timesCb
后,根据在 showingsCb
中显示 selected。这工作正常。
然后我 select 在 showingsCb
中显示了不同的内容,单击 timesCb
后,列表会下拉并显示一个空白列表。放映时间存在于这个空白列表中,但我看不到它们(我知道它们在那里,因为我可以单击它们应该在的空白处,它会用我的 [= 填充 JComboBox
58=]离子).
我在 JComboBox
上使用 DefaultComboBoxModel
,它由 ArrayList
或 Vector
填充(使用我自己的方法从我的数据库中检索结果) .我在 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 它并能够提供帮助你以更好更快的方式。
我有 2 个 JComboBox:
showingsCb
和 timesCb
showingsCb
包含从我的数据库中提取的电影放映列表。
timesCb
包含基于 showingsCb
的 selection 的电影放映时间列表,该列表也是从我的数据库中提取的。
现在我已经设法用正确的数据填充它们并且逻辑工作正常,但这是我的问题:
我在 showingsCb
中制作了一个 selection,然后启用 timesCb
并在点击 timesCb
后,根据在 showingsCb
中显示 selected。这工作正常。
然后我 select 在 showingsCb
中显示了不同的内容,单击 timesCb
后,列表会下拉并显示一个空白列表。放映时间存在于这个空白列表中,但我看不到它们(我知道它们在那里,因为我可以单击它们应该在的空白处,它会用我的 [= 填充 JComboBox
58=]离子).
我在 JComboBox
上使用 DefaultComboBoxModel
,它由 ArrayList
或 Vector
填充(使用我自己的方法从我的数据库中检索结果) .我在 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
好的。您的 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 它并能够提供帮助你以更好更快的方式。