Java 访问actionPerformed中的全局变量

Java 访问actionPerformed中的全局变量,java,multithreading,variables,global,Java,Multithreading,Variables,Global,我已经定义了一个全局ArrayListitemList,它可以通过不同的类访问。我已经通过actionPerformed为它赋值,并且可以在方法中访问它。但是,当我尝试在方法之外访问数据时,它会变成null。如何设置和访问方法之外的数据?这是代码 public void addMainBtn() { for(int i=0;i < mainMenu.size();i++) { mainPane.setLayout(new GridLayout(0,1));

我已经定义了一个全局ArrayList
itemList
,它可以通过不同的类访问。我已经通过
actionPerformed
为它赋值,并且可以在方法中访问它。但是,当我尝试在方法之外访问数据时,它会变成
null
。如何设置和访问方法之外的数据?这是代码

public void addMainBtn() {
    for(int i=0;i < mainMenu.size();i++) {
        mainPane.setLayout(new GridLayout(0,1));
        JButton mainBtn = new JButton(mainMenu.get(i).item_name+" - "+mainMenu.get(i).item_price);
        //mainAction mainBtnAct = new mainAction(mainMenu.get(i).item_name, mainMenu.get(i).item_price);
        mainBtn.addActionListener(this);
        mainPane.add(mainBtn);
    } 
}

public void actionPerformed(ActionEvent e) {
    String str = e.getActionCommand();
    String[] outputItem = str.split("-");
    double outputPrice = Double.parseDouble(outputItem[1]);
    storeArray.itemList.add(outputItem[0]);
    storeArray.priceList.add(outputPrice);
}

public void printall() {
    for (int i = 0; i < test.size(); i++) {
        System.out.println(storeArray.itemList.get(i).toString());
    }
}
public void addMainBtn(){
对于(int i=0;i
如果没有正确的同步,您不应该使用来自两个不同线程的ArrayList。改用ArrayBlockingQueue,并将存储它的变量定义为final。

基本上,第一种方法的设计很糟糕。直接访问不同类中的字段会将您连接到该字段的实现。此外,你在这里混合了层。一层处理UI事件;然后是一个管理您正在处理的数据的层。至少:把另一个类变成一个单体类;并在其上放置(同步)方法,如“添加新项”。编写单元测试;然后,在开始组装“更大”的组件之前,您可以确保每个组件都能按预期工作。最后,如果您想要有用的答案,那么您必须提供更多的代码。这里没有人知道storeArray来自哪里;它是如何初始化的;以及itemList和priceList是如何初始化的。谢谢Jagermeister,@Jägermeister感谢您的评论。我在这方面还是个新手,这是我第一次尝试这个练习。当我有更多的时间时,我可能会清理代码。