【问题标题】:Java GUI adding a JList to class in another fileJava GUI 将 JList 添加到另一个文件中的类
【发布时间】:2013-03-31 02:12:21
【问题描述】:

我正在尝试调用一个类中的 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

【问题讨论】:

  • 噢!是的,这就是问题所在!虽然似乎仍然无法将值放入 JList,但它现在正在运行!
  • 您需要某种方式将 finalList 的引用从您的 ShoppingList 传递到您的橱柜
  • ShoppingList items = new ShoppingList();如果我使用类似的东西,它不会调用 finalList 是吗?我刚刚尝试过与 cupboardContent = new JList(items.finalList.toArray());但仍然没有帮助!抱歉,我有一个晚上什么都想不通!
  • 人们似乎建议您将 ShoppingList.finalList 设为静态。我个人会避免这种情况,除非你能坚定地保证整个程序中只有一个 ShppoingList - 恕我直言

标签: java swing user-interface arraylist jlist


【解决方案1】:

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

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

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 组件,因此 finalList 中的任何 Array 可能更有用。

【讨论】:

  • 谢谢!我想这就是我的目标!
【解决方案2】:

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

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

Main.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()); 
    }
}

Controller.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);
    }
}

ObjectListModel.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 告诉他们该做什么。

由于Controller 扩展Observable,它能够告诉所有已注册的Observer 类状态已更改并且它们需要更新。

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

【讨论】:

    【解决方案3】:

    检查这个,在这个程序中,我有列表“城市列表”,我在其中添加了我的所有元素,之后我有列表“第二个列表”,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();
    
          }
     }
    

    【讨论】:

    • 谢谢,但不幸的是我遇到的问题是它们是完全不同文件中的类,所以我试图从另一个文件中调用一个文件!我有一些叫同一个,但是当我必须分开它们时我被难住了!
    • 是您将列表设为静态,或者实际上您遇到了什么错误,您给我们的代码并没有多大帮助,因为首先我们必须知道错误,请向我们展示更多代码,为了更好地理解......
    • 我现在实际上并没有收到错误,这只是因为我错过了静态这个词,但我正在努力将值添加到橱柜类中的 JList 中。稍等,我将编辑原始位并将我现在拥有的内容添加到底部!
    • stackoverflow.com/questions/10022441/… 看看这个……说不定你会找到解决办法的……
    • 你的 Jbutton 中有什么?
    猜你喜欢
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2011-01-08
    相关资源
    最近更新 更多