【问题标题】:Java - How do I modify static ArrayList in one class with an ActionListener in another class?Java - 如何使用另一个类中的 ActionListener 修改一个类中的静态 ArrayList?
【发布时间】:2017-04-03 20:41:21
【问题描述】:

我正在尝试修改“AnimalGUI”类中的静态 ArrayList“selectList”。

我必须通过 Java GUI 接受用户输入,所以我在另一个类中实现了 JFrame 和所有这些。

当我将 ArrayList 传递给存在于不同类“HandleGUI”中的 ActionListener 时遇到问题。 ActionListener 由于某种原因无法修改静态 ArrayList。

我知道它不起作用,因为我试图在修改后打印 ArrayList 的内容,但系统什么也没打印。

下面是类Animal GUI,除了代码底部的ArrayList“selectList”之外没有什么特别关注的。

public class AnimalGUI {

public static void main(String[] args) {
    AnimalGUI a = new AnimalGUI();
    HandleGUI h = new HandleGUI();

    h.initialisation();
    a.printSelectList();
}

//Print selectList
void printSelectList(){
    for(int x: selectList){
        System.out.println(x);
    }
}

static ArrayList<Integer> selectList = new ArrayList<Integer>();
static ArrayList<Animal> aniList = new ArrayList<Animal>();
static String[][] Forest = new String[15][15];
}

下面是子类“HandleGUI”。

您可以忽略大多数 Java GUI 组件。这里重要的部分是 ActionListener “selectListener”。

public class HandleGUI{

JFrame menu = new JFrame("Startup Menu");
JPanel panelA = new JPanel();
JCheckBox cCB, dCB, fCB, hCB, lCB, tCB, uCB, wCB;
JButton cBT, dBT, fBT, hBT, lBT, tBT, uBT, wBT, start;

//Constructor
public HandleGUI(){

    //Declare all the JCheckBoxes.
    cCB = new JCheckBox("Cat");
    dCB = new JCheckBox("Dog");
    fCB = new JCheckBox("Fox");
    hCB = new JCheckBox("Hippo");
    lCB = new JCheckBox("Lion");
    tCB = new JCheckBox("Tiger");
    uCB = new JCheckBox("Turtle");
    wCB = new JCheckBox("Wolf");

    //Declare all the JButtons.
    cBT = new JButton("Pick an alternative icon.");
    dBT = new JButton("Pick an alternative icon.");
    fBT = new JButton("Pick an alternative icon.");
    hBT = new JButton("Pick an alternative icon.");
    lBT = new JButton("Pick an alternative icon.");
    tBT = new JButton("Pick an alternative icon.");
    uBT = new JButton("Pick an alternative icon.");
    wBT = new JButton("Pick an alternative icon.");

    start = new JButton("Start");

    //Declare JFrame and set its size.
    //Make the startup menu display in centre of monitor.
    menu.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    menu.setSize(300, 300);
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    menu.setLocation(dim.width/2-menu.getSize().width/2, dim.height/2-menu.getSize().height/2);


}

//Generates a setup menu that allows user to select animals to be included in the simulation. 
public void initialisation(){

    //Make the startup menu display in centre of monitor.
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    menu.setLocation(dim.width/2-menu.getSize().width/2, dim.height/2-menu.getSize().height/2);

    //Set the JPanel to grid layout so elements on both columns align.
    panelA.setLayout(new GridLayout(8, 2, 5, 5));

    //Add the elements into JPanel.
    panelA.add(cCB);
    panelA.add(cBT);
    panelA.add(dCB);
    panelA.add(dBT);
    panelA.add(fCB); 
    panelA.add(fBT);
    panelA.add(hCB);
    panelA.add(hBT);
    panelA.add(lCB);
    panelA.add(lBT);
    panelA.add(tCB);
    panelA.add(tBT);
    panelA.add(uCB);
    panelA.add(uBT);
    panelA.add(wCB);
    panelA.add(wBT);

    //Add the Panel to the Frame.
    menu.getContentPane().add(panelA, BorderLayout.CENTER);
    menu.getContentPane().add(start, BorderLayout.SOUTH);

    //Make Frame visible.
    menu.setVisible(true);

    start.addActionListener(new selectListener());
}

class selectListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
        AnimalGUI a = new AnimalGUI();


        if(cCB.isSelected())
            a.selectList.add(0);

        if(dCB.isSelected())
            a.selectList.add(1);

        if(fCB.isSelected())
            a.selectList.add(2);

        if(hCB.isSelected())
            a.selectList.add(3);

        if(lCB.isSelected())
            a.selectList.add(4);

        if(tCB.isSelected())
            a.selectList.add(5);

        if(uCB.isSelected())
            a.selectList.add(6);

        if(wCB.isSelected())
            a.selectList.add(7);

        menu.setVisible(false);
    }
}
}

【问题讨论】:

标签: java user-interface arraylist static actionlistener


【解决方案1】:

您的selectListener 中的条件似乎未满足。所以,问题不在于静态列表不可修改,而是该程序没有输入任何if 语句:

if(cCB.isSelected())
    a.selectList.add(0);
.....

【讨论】:

  • 您好,感谢您的回复。你介意再详细一点吗?你的意思是 if 语句不起作用?
  • 是的,我想这是您问题的根本原因。将一些 System.out.println 语句添加到 if 块中并测试它们是否被执行
【解决方案2】:

您正在从对象中调用静态字段。

代替

AnimalGUI a = new AnimalGUI(); <...> a.selectList.add(0);

试试 AnimalGUI.selectList.add(0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 2015-10-04
    相关资源
    最近更新 更多