使用多维数组列表填充 JComboBox
Populating JComboBox using an MultiDimensional Array List
我一直在尝试使用构造函数使用数组列表来填充 Eclipse GUI Java JComboBox,但没有任何运气。这是我迄今为止尝试过的。
import item.Item;
import javax.swing.JComboBox;
import java.util.ArrayList;
public class SelectionScreen{
private JFrame frame;
static ArrayList< Item> list;
private String items;
public static void main (String[] args){
initialize();
}
public void initialize(){
list = new ArrayList< Item >();
list.add(new Item("Strawberry,200,.25,.75);
list.add(new Item("Banana,200,.25,1.00);
list.add(new Item("Oranges,200,.25,2.00);
JcomboBox comboBox = newJcomboBox();
ComboBox.setBounds(63,29,86,22)
frame.getContentPane().add(comboBox);
// here is where I tried to fill the combobox
//comboBox.setModel(new DefaultComboBoxModel(Item.getName()))); //Wrong
//comboBox.setModel(Item.getName); //Wrong
//the following only loads the last item in the list which is Oranges
for(Item i: list{
comboBox.setModel(new DefaultComboBoxModel(New String[] {
i.getName()}));
}
// tried making a different list to collect my fruits.
for(Item i: list){
list2[ i.getName()];
Item.length;
} //which was a complete fail.
我完全迷失在这里并且对 Java 不是很有经验。我可以使用
comboBox.setModel(new DefaultComboBoxModel(new String[]{ "Strawberry","Banana","Oranges"}));
但是当我从文本文件中导入它们时,我不知道列表中有什么水果。
如有任何帮助,我们将不胜感激。
/*The following only loads the last item in the list which is Oranges.*/
for(Item i: list)
{
comboBox.setModel(new DefaultComboBoxModel(new String[] {
i.getName()}));
}
不要在循环中不断创建新的 ComboBoxModel。如果您不断创建新模型,则不能向模型中添加多个项目。因此,您只能看到最后创建的模型,其中添加了单个项目。如果您想使用这种方法,那么您可以在循环外部创建模型,然后只需在循环内部的模型中添加项目。
实际上您根本不需要创建组合框模型。您可以直接将项目添加到组合框:
类似于:
for(Item i: list
{
comboBox.addItem( i.getName() );
}
另一种选择是将 Item 对象直接添加到组合框中。然后您可以使用自定义渲染器来控制 Item 对象的 属性 显示在组合框中。查看 Combo Box With Custom Renderer 了解有关此方法的更多信息。
如果您希望在组合框中显示 Item
个对象,那么您应该声明 JComboBox
以存储 Item
个对象。这样您就可以轻松添加项目,而无需对模型进行任何处理:
JComboBox<Item> itemsCombo = new JComboBox<>();
list.forEach(itemsCombo::add);
组合框中显示的值将是 Item.toString
返回的值。如果这不是您想要的(因为您的 toString
returns 对对象的更完整描述 - 通常被认为是更好的做法),那么编写您自己的 Custom Renderer 相当容易。
JComboBox
API 唯一的缺点是您必须施放所选项目:
Item selectedItem = (Item)itemsCombo.getSelectedItem();
这很丑陋,我希望 API 不需要它,但是为了避免定义您自己的模型,这是一个很小的代价。
事实上,您可以通过以下方式避免强制转换:
Item selectedItem = itemsCombo.getItemAt(itemsCombo.getSelectedIndex());
但这也同样丑陋。
顺便说一句,这是标准 Java 教程和示例已经过时的几个领域之一,因此这里完全不能因为不知道使用泛型而受到指责。
我一直在尝试使用构造函数使用数组列表来填充 Eclipse GUI Java JComboBox,但没有任何运气。这是我迄今为止尝试过的。
import item.Item;
import javax.swing.JComboBox;
import java.util.ArrayList;
public class SelectionScreen{
private JFrame frame;
static ArrayList< Item> list;
private String items;
public static void main (String[] args){
initialize();
}
public void initialize(){
list = new ArrayList< Item >();
list.add(new Item("Strawberry,200,.25,.75);
list.add(new Item("Banana,200,.25,1.00);
list.add(new Item("Oranges,200,.25,2.00);
JcomboBox comboBox = newJcomboBox();
ComboBox.setBounds(63,29,86,22)
frame.getContentPane().add(comboBox);
// here is where I tried to fill the combobox
//comboBox.setModel(new DefaultComboBoxModel(Item.getName()))); //Wrong
//comboBox.setModel(Item.getName); //Wrong
//the following only loads the last item in the list which is Oranges
for(Item i: list{
comboBox.setModel(new DefaultComboBoxModel(New String[] {
i.getName()}));
}
// tried making a different list to collect my fruits.
for(Item i: list){
list2[ i.getName()];
Item.length;
} //which was a complete fail.
我完全迷失在这里并且对 Java 不是很有经验。我可以使用
comboBox.setModel(new DefaultComboBoxModel(new String[]{ "Strawberry","Banana","Oranges"}));
但是当我从文本文件中导入它们时,我不知道列表中有什么水果。
如有任何帮助,我们将不胜感激。
/*The following only loads the last item in the list which is Oranges.*/
for(Item i: list)
{
comboBox.setModel(new DefaultComboBoxModel(new String[] {
i.getName()}));
}
不要在循环中不断创建新的 ComboBoxModel。如果您不断创建新模型,则不能向模型中添加多个项目。因此,您只能看到最后创建的模型,其中添加了单个项目。如果您想使用这种方法,那么您可以在循环外部创建模型,然后只需在循环内部的模型中添加项目。
实际上您根本不需要创建组合框模型。您可以直接将项目添加到组合框:
类似于:
for(Item i: list
{
comboBox.addItem( i.getName() );
}
另一种选择是将 Item 对象直接添加到组合框中。然后您可以使用自定义渲染器来控制 Item 对象的 属性 显示在组合框中。查看 Combo Box With Custom Renderer 了解有关此方法的更多信息。
如果您希望在组合框中显示 Item
个对象,那么您应该声明 JComboBox
以存储 Item
个对象。这样您就可以轻松添加项目,而无需对模型进行任何处理:
JComboBox<Item> itemsCombo = new JComboBox<>();
list.forEach(itemsCombo::add);
组合框中显示的值将是 Item.toString
返回的值。如果这不是您想要的(因为您的 toString
returns 对对象的更完整描述 - 通常被认为是更好的做法),那么编写您自己的 Custom Renderer 相当容易。
JComboBox
API 唯一的缺点是您必须施放所选项目:
Item selectedItem = (Item)itemsCombo.getSelectedItem();
这很丑陋,我希望 API 不需要它,但是为了避免定义您自己的模型,这是一个很小的代价。
事实上,您可以通过以下方式避免强制转换:
Item selectedItem = itemsCombo.getItemAt(itemsCombo.getSelectedIndex());
但这也同样丑陋。
顺便说一句,这是标准 Java 教程和示例已经过时的几个领域之一,因此这里完全不能因为不知道使用泛型而受到指责。