2017-04-03 25 views
0

我试图修改类“AnimalGUI”中的静态ArrayList,“selectList”。Java - 如何在一个类中使用另一个类中的ActionListener修改静态ArrayList?

我必须通过Java GUI接受用户输入,所以我实现了JFrame和所有其他类的输入。

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

我知道它不工作,因为我试图打印ArrayList的内容后,据说,修改它,系统什么都不打印。

下面是动物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); 
    } 
} 
} 
+2

获取帮助,迅速请参阅本的机会较高 - [MCVE] – petehallw

回答

0

看起来像你的selectListener不符合条件。所以,问题的关键不是在静态列表不modifyable,但程序不输入任何if声明:

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

您好,感谢您的答复。你介意再详细一点吗?你是说if语句不起作用吗? – potatoguy

+0

是的,我认为这是你问题的根源。将一些System.out.println语句添加到if块中并测试它们是否被执行 –

0

要调用的对象从静态字段。

而不是

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

尝试 AnimalGUI.selectList.add(0);

相关问题