一个是静态ArrayList,另一个是已设置的UI,我想显示每个对象foodName的列表,因为这将是可以在在线菜单GUI上选择和订购的食物。
public class MenuItem
{
private String foodName;
private String foodType;
private float price;
private int calories;
/**
* Constructor for objects of class MenuItem
*/
public MenuItem(String nameFood, String typeFood, float foodPrice, int caloryCount)
{
foodName = nameFood;
foodType = typeFood;
price = foodPrice;
calories = caloryCount;
}
public String foodName()
{
return foodName;
}
public String foodType()
{
return foodType;
}
public float price()
{
return price;
}
public int calories()
{
return calories;
}
}
上面是我为每个MenuItem所上的课。
import java.util.ArrayList;
/**
*
* ArrayList for the class, will hold all food items
* @author Jonathan
* @version 1.0
*
*/
public class RestaurantArrayList extends MenuItem
{
public RestaurantArrayList(String nameFood, String typeFood, float foodPrice, int caloryCount) {
super(nameFood, typeFood, foodPrice, caloryCount);
}
public static final ArrayList<MenuItem> items;
static
{
items = new ArrayList<>();
items.add(new MenuItem("Coca Cola", "Drink", 3.00f, 38));
items.add(new MenuItem("Fanta Orange", "Drink", 3.00f, 31 ));
items.add(new MenuItem("Glass of Red Wine", "Drink", 5.00f, 85));
items.add(new MenuItem("Glass of White Wine", "Drink", 5.00f, 82));
items.add(new MenuItem("Carling", "Drink", 3.50f, 189));
items.add(new MenuItem("Fosters", "Drink", 3.50f, 378));
items.add(new MenuItem("Water", "Drink", 0.00f, 0));
items.add(new MenuItem("Breads", "Starter", 5.00f, 150));
items.add(new MenuItem("Cold Meat", "Starter", 5.00f, 150));
items.add(new MenuItem("Potato Skins and Barbeque Sauce", "Starter", 5.00f, 500));
items.add(new MenuItem("Cold Meat", "Starter", 5.00f, 400));
items.add(new MenuItem("Garlic Bread and Cheese", "Starter", 4.50f, 450));
items.add(new MenuItem("Steak", "Main", 13.50f, 750));
items.add(new MenuItem("Cheese and Bacon Burger", "Main", 8.00f, 850));
items.add(new MenuItem("Spaghetti Cabonara", "Main", 7.00f, 675));
items.add(new MenuItem("Steak", "Main", 13.50f, 378));
items.add(new MenuItem("Seafood Paella", "Main", 10.00f, 850));
}
}
这是我也设置的ArrayList类。我只想在文本区域显示食物的名称,但我不确定如何做到这一点。如果有人能帮忙那就太好了。感谢
JScrollPane scrollPane_1 = new JScrollPane();
scrollPane_1.setBounds(219, 50, 134, 309);
contentPane.add(scrollPane_1);
这是设置JScrollPane的一小段代码,我希望信息显示在它自己的GUI类中。
我会使用带有自定义DefaultListCellRenderer的JList。单元渲染器决定了单元中对象的显示方式,因此在您的情况下,您希望JList
中有MenuItem
对象,并且渲染器应该提取名称字符串以进行显示。这是我起草的:
创建一个JList并将其添加到JScrollPane:的视口中
JList foodList = new JList(RestaurantArrayList.items.toArray());
foodList.setCellRenderer(new FoodListRenderer());
JScrollPane scr = new JScrollPane(foodList);
和自定义ListCellRenderer类:
class FoodListRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
String name = ((MenuItem) value).foodName();
return super.getListCellRendererComponent(list, name, index, isSelected, cellHasFocus);
}}
显示项目列表的最简单方法不是使用JTextArea,而是如果您只显示一列信息(如菜单项的名称),则使用JList;如果您想显示多列数据表,则使用JTable。
简单的步骤,方法,JList:
- 创建
DefaultListModel<MenuItem>
对象 - 使用它的
addItem(...)
方法用MenuItem填充它,就像上面填充ArrayList一样 - 将其放入
JList<MenuItem>
- 将JList放入JScrollPane中
- 通过调用JList上的
setVisibleRowCount(...)
来设置它的可见行数 - 确保JList通过以下方式正确显示项目
- 给MenuItem一个返回MenuItem名称的
public String toString()
方法,或者 - 为JList提供一个显示MenuItem名称的渲染器
- 给MenuItem一个返回MenuItem名称的
有关JList的更多信息,请查看Swing JList教程。
如果你想增加显示的功能,那么JTable就是你的选择,但这意味着你的代码的复杂性会增加,因为你需要通过扩展DefaultTableModel(更简单但有限)或AbstractTableModel(很难做到,但有更大的灵活性和功能)来创建自己的TableModel。如果你对这条路线感兴趣,请看一下Swing JTable教程。
次要建议(与您最初的问题无关):
scrollPane_1.setBounds(219, 50, 134, 309);
建议您使用null
布局,如果是这样,您将希望改变这种习惯。虽然在Swing新手看来,空布局和setBounds()
可能是创建复杂GUI的最简单、最好的方法,但您创建的Swing GUI越多,在使用它们时就会遇到更严重的困难。当GUI调整大小时,它们不会调整组件的大小,它们是一个需要增强或维护的皇家女巫,当放在滚动窗格中时,它们会完全失败,当在所有平台上查看时,或者当屏幕分辨率与原始分辨率不同时,它们看起来非常糟糕- 避免过度使用静电。当您使用静态字段时,例如上面的ArrayList,您会将该字段从面向对象领域中抛出,并放入静态领域。如果只是在绝对需要的时候小心完成,这是可以的,但如果可能的话,应该避免,因为这有增加程序复杂性(准确地说是循环复杂性)的风险,从而增加错误的风险