显示JScrollPane中对象的ArrayList中的变量



一个是静态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名称的渲染器

有关JList的更多信息,请查看Swing JList教程。

如果你想增加显示的功能,那么JTable就是你的选择,但这意味着你的代码的复杂性会增加,因为你需要通过扩展DefaultTableModel(更简单但有限)或AbstractTableModel(很难做到,但有更大的灵活性和功能)来创建自己的TableModel。如果你对这条路线感兴趣,请看一下Swing JTable教程。


次要建议(与您最初的问题无关):

  • scrollPane_1.setBounds(219, 50, 134, 309);建议您使用null布局,如果是这样,您将希望改变这种习惯。虽然在Swing新手看来,空布局和setBounds()可能是创建复杂GUI的最简单、最好的方法,但您创建的Swing GUI越多,在使用它们时就会遇到更严重的困难。当GUI调整大小时,它们不会调整组件的大小,它们是一个需要增强或维护的皇家女巫,当放在滚动窗格中时,它们会完全失败,当在所有平台上查看时,或者当屏幕分辨率与原始分辨率不同时,它们看起来非常糟糕
  • 避免过度使用静电。当您使用静态字段时,例如上面的ArrayList,您会将该字段从面向对象领域中抛出,并放入静态领域。如果只是在绝对需要的时候小心完成,这是可以的,但如果可能的话,应该避免,因为这有增加程序复杂性(准确地说是循环复杂性)的风险,从而增加错误的风险

相关内容

最新更新