1

我正在尝试调用一个类中的 JList 并将其添加到另一个类中但无济于事,因为它告诉我有关静态和非静态函数的信息

我在一个类中有一个名为 finalList 的 ArrayList,其中填充了值,并且已经通过打印列表进行了检查。

然后我在另一个名为cupboard 的文件中有另一个类,我想将项目放入那里的JList 中。

    finalList.add(si);

是添加项目的位置,其中 si 是数组项目,finalList 是新数组,然后在我的橱柜类文件中,目前我有

    public Cupboard() 
{
    cupboardContent = new JList(ShoppingList.finalList.toArray());
}

cupboardContent 是我想要物品去的新 JList。

谢谢,如果有人有任何想法。我敢肯定这很简单,我只是很愚蠢!似乎在将普通流程与 GUI 结合起来时,由于我对使用 GUI 很陌生,我正在努力建立联系!

//编辑

没错,第一段代码就是将项目添加到数组中,但我需要弄清楚如何在新类中调用它。目前,这就是我所拥有的

    public class KitchenCupboard extends JPanel //implements ActionListener
    {
private JList cupboardContent;
private JButton usedItem;

ShoppingList items = new ShoppingList();

public KitchenCupboard() 
{
    System.out.println(ShoppingList.finalList);

    cupboardContent = new JList(items.finalList.toArray());
    cupboardContent.setVisibleRowCount(10);
    cupboardContent.setFixedCellHeight(30);
    cupboardContent.setFixedCellWidth(200);
    cupboardContent.setFont(new Font ("sansserif", Font.BOLD, 13));
    cupboardContent.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    add(new JScrollPane(cupboardContent));
}

}

ShoppingList 中的数组是

    static ArrayList<ShoppingItem> finalList = new ArrayList<ShoppingItem>();

它使用两个类/文件:ShoppingList.java 和 KitchenCupboard.java

4

3 回答 3

2

因为 finalList 是 ShoppingList 的成员,所以您可以做两件事之一。任何一个:

将 finalList 声明为staticShoppingList 的成员,从而允许您完全按照上面的方式访问它:

cupboardContent = new JList(ShoppingList.finalList.toArray());

或将对 ShoppingList 对象的引用传递给Cupboard允许您通过该引用访问 finalList 的构造函数:

public Cupboard(ShoppingList list) 
{
    cupboardContent = new JList(list.finalList.toArray());
}

然后创建一个新的橱柜:

Cupboard c = new Cupboard(<some ShoppingList instance>);

我还可以建议您将生成的 Array 转换为您需要的类型,因为 Java 7 引入了新的基于泛型的 swing 组件,因此包含任何内容的 ArrayfinalList可能更有用。

于 2013-04-08T21:31:57.870 回答
2

我不确定您是否对此感到满意,但我可以建议您使用观察者模式吗?Java 内置了ObserverObservable类来帮助您解决这些问题。

我已经制作了一个小示例程序,说明如何使用它解决问题,但它远非一个有效的示例。

主.java

public class Main {

    public static void main(String... args){
        final Controller appController = new Controller();
        final ObjectListModel listModel = new ObjectListModel();
        appController.addObserver(listModel);

        //Event is fired, lists are updated.
        appController.addObject(new Object()); 
    }
}

控制器.java

import java.util.ArrayList;
import java.util.List;
import java.util.Observable;

public class Controller extends Observable {

    private final List<Object> objectList = new ArrayList<>();

    public void addObject(Object obj) {
        objectList.add(obj);
        this.setChanged();
        this.notifyObservers(obj);
    }
}

对象列表模型.java

import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import javax.swing.AbstractListModel;

public class ObjectListModel extends AbstractListModel implements Observer{

    private List<Object> objectList = new ArrayList<>();

    @Override
    public int getSize() {
        return objectList.size();
    }

    @Override
    public Object getElementAt(int index) {
        return objectList.get(index);
    }

    @Override
    public void update(Observable o, Object arg) {
        if(arg instanceof Object){
            objectList.add(arg);
        }
    }

}

简单地说,这一切的工作原理如下:

您有 1 个Controller类,所有不同的组件都在其中相互交谈。其余的,在这个例子中,听着Controller告诉他们该做什么。

作为Controllerextends Observable,它能够告诉所有注册Observer的类一个状态已经改变并且他们需要更新。

在我们的示例中,我们将ListModel您的 future设置JList为等待由控制器控制的主数据源的更改。当用户添加另一个数据对象时,会触发一个事件,该事件会更新主数据源并告诉列表模型也进行更新。

于 2013-04-08T22:24:43.677 回答
0

检查这个,在这个程序中,我有列表“城市列表”,我在其中添加了我的所有元素,之后我有列表“第二个列表”,IA 在其中移动我的元素,这个程序还反转了,意味着它移动元素,从第二个列表到城市列表。为了更好地理解,请运行此程序...

import javax.swing.JList;
import javax.swing.JTextField;
import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

/*
 * Combo BOX pROBLEM
 */

public class ComboBoxProblem extends JFrame 
    {
        // made them static , so I can use them over & over
        static JLabel citiesLabel = new JLabel();

        static JList citiesList = new JList();
        static JScrollPane citiesScrollPane = new JScrollPane();

        static JLabel SecondLabel = new JLabel();
        static JList SecondList = new JList();
        static JScrollPane SecondScrollPane = new JScrollPane();


        // these are button to move the elements
        static JButton AssignButton = new JButton();
        static JButton RemoveButton = new JButton();

        static JList made_list = new JList();

public static void main(String args[]) 
    {
        new ComboBoxProblem().show();
    }


public ComboBoxProblem() 
    {
        // create frame
        setTitle("Flight Planner");
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new GridBagLayout());


        GridBagConstraints gridConstraints;
        citiesLabel.setText("Destination City");
        gridConstraints = new GridBagConstraints();
        gridConstraints.gridx = 0;
        gridConstraints.gridy = 1;
        gridConstraints.insets = new Insets(10, 0, 0, 0);

        getContentPane().add(citiesLabel, gridConstraints);
        citiesScrollPane.setPreferredSize(new Dimension(150, 100));
        citiesScrollPane.setViewportView(citiesList);
        gridConstraints = new GridBagConstraints();
        gridConstraints.gridx = 0;
        gridConstraints.gridy = 2;
        gridConstraints.insets = new Insets(10, 10, 10, 10);
        getContentPane().add(citiesScrollPane, gridConstraints);

        final DefaultListModel List1= new DefaultListModel();
        List1.addElement("San Diego");
        List1.addElement("Los Angeles");
        List1.addElement("Orange County");
        List1.addElement("Ontario");
        List1.addElement("Bakersfield");

        citiesList.setModel(List1);

        SecondLabel.setText("Moved");
        gridConstraints = new GridBagConstraints();
        gridConstraints.gridx = 1;
        gridConstraints.gridy = 1;
        gridConstraints.insets = new Insets(10, 0, 0, 0);

        getContentPane().add(SecondLabel, gridConstraints);
        SecondScrollPane.setPreferredSize(new Dimension(150, 100));
        SecondScrollPane.setViewportView(SecondList);
        gridConstraints = new GridBagConstraints();
        gridConstraints.gridx = 1;
        gridConstraints.gridy = 2;
        gridConstraints.insets = new Insets(10, 10, 10, 10);
        getContentPane().add(SecondScrollPane, gridConstraints);

        final DefaultListModel List2 = new DefaultListModel();

        SecondList.setModel(List2);

        AssignButton.setText("Move");
        gridConstraints = new GridBagConstraints();
        gridConstraints.gridx = 0;
        gridConstraints.gridy = 3;
        gridConstraints.insets = new Insets(0, 0, 10, 0);
        getContentPane().add(AssignButton, gridConstraints);
        AssignButton.addActionListener(new ActionListener() 
            {
                public void actionPerformed(ActionEvent e) 
                    {
                        for(int i = 0; i < List1.getSize(); i++)
                            {
                                if(citiesList.isSelectedIndex(i))
                            {
                                List2.addElement(List1.getElementAt(i));
                                List1.removeElementAt(i);
                                i--;
                            }

                    }
            }
            });

        RemoveButton.setText("Reverse");
        gridConstraints = new GridBagConstraints();
        gridConstraints.gridx = 1;
        gridConstraints.gridy = 3;
        gridConstraints.insets = new Insets(0, 0, 10, 0);
        getContentPane().add(RemoveButton, gridConstraints);
        RemoveButton.addActionListener(new ActionListener() 
            {
                public void actionPerformed(ActionEvent e) 
                    {

                        for(int i = 0; i < List2.getSize(); i++)
                            {
                                if(SecondList.isSelectedIndex(i))
                                {
                                    List1.addElement(List2.getElementAt(i));
                                    List2.removeElementAt(i);
                                    i--;
                                }
                            }

                    }
            });

        pack();

      }
 }
于 2013-04-08T21:23:52.137 回答