2017-04-03 29 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);

相關問題