我正在尝试调用我在一个类中的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
答案 0 :(得分:2)
因为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>);
我是否还可以建议您将生成的数组转换为您需要的类型,因为Java 7引入了基于Generics的新swing组件,因此finalList
中的任何数组都可能更有用。
答案 1 :(得分:1)
我不确定您是否对此感到满意,但我建议您使用Observer pattern吗? Java内置了类Observer和Observable来帮助您完成这些工作。
我已经制作了一个小例子程序,说明你如何使用它来解决你的问题,但这远远不是一个有效的例子。
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());
}
}
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);
}
}
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
类状态已更改且需要更新。
在我们的示例中,我们将未来ListModel
的{{1}}设置为等待主数据源的更改,主数据源由控制器控制。当用户添加另一个数据对象时,会触发一个事件来更新主数据源并告诉列表模型也更新。
答案 2 :(得分: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();
}
}