2016-12-18 66 views
-1

我有一個項目處理三個使用jbuttons填充的面板。 jbuttons是從一個for循環創建的,我懶得重新創建一個jpanel填充了jbuttons的類,因爲它與我的actionlisteners衝突。 可以說我有每個三塊板填入代碼:確定從for循環創建的數組中的對象

JPanel panel109 = new JPanel(); //113, 115 for the other two 
roomPanel.add(panel109); 
for(int j = 0; j < 6*28; j++) { 
    btn[j] = new JButton(); 
    btn[j].setName("a" + j); 
    btn[j].setBackground(Color.white); 
    btn[j].setText(""); 
    btn[j].setPreferredSize(new Dimension(35,9)); 
    btn[j].addActionListener(this); 
    panel109.add(btn[j]); 
} 

對於每個面板,如何識別每個BTN []創造的呢?我想在用戶指定數據以更改按鈕顏色,工具提示文本等之後序列化每個按鈕。我幾乎只想知道如何訪問我創建的按鈕,因爲三個面板使用相同的循環。 所有按鈕的序列化來自「存儲」按鈕,然後「恢復」如果我想從它創建的文件恢復。

店內碼:

JButton btnStore = new JButton("Store"); 
    btnStore.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      ObjectOutputStream out = null; 
      try { 
       out = new ObjectOutputStream (new FileOutputStream("myFile")); 
      } catch (FileNotFoundException e1) { 
       e1.printStackTrace(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 
      for (int i=0;i<6*28;i++){ 
       //deregister 
       btn[i].removeActionListener(this);//Heres my problem, 
       //serialize     //I Don't know how to access 
       try {       //the buttons created from the 
        out.writeObject(btn[i]); //three loops. 
       } catch (IOException e1) { 

        e1.printStackTrace(); 
       } 
       try { 
        out.flush(); 
       } catch (IOException e1) { 

        e1.printStackTrace(); 
       } 
       //register 
       btn[i].addActionListener(this); 

      } 
     } 
    }); 
+0

首先你應該http://stackoverflow.com/mcve你的例子,第二如果你使用單選按鈕,然後使用JRadioButton()...你也可以使用https://docs.oracle.com/javase /tutorial/uiswing/examples/components/index.html#ListDialog作爲一個開始的例子,因爲你正在挑選整個按鈕主機 –

+0

哎呀,我搞砸了什麼類型的按鈕 – kfloresmx5

+0

@ kfloresmx5你正在訪問'JButton [] btn'在ActionListener裏面,我們猜它是一個類成員(還是一個「final」局部變量)?除非爲每個容器創建一個新數組,否則不能將同一對象添加到多個容器('JPanel')。這些變量的範圍很重要,特別是當你想要將它們檢索到別處時... – Matthieu

回答

0

嵌套循環?

for (int i = 0; i < roomPanel.size(); i++) { 
    JPanel panel = roomPanel[i]; 
    for (int j = 0; j < numButtons; j++) { 
      btn[i][j] = new JButton(); 
      btn[i][j].setName(i +"-"+ j); 
      btn[i][j].setBackground(Color.white); 
      btn[i][j].setText(""); 
      btn[i][j].setPreferredSize(new Dimension(35,9)); 
      btn[i][j].addActionListener(this); 
      panel.add(btn[i][j]); 
    } 
} 

假設roomPanel是您的名單。

+0

我不明白這是如何回答我的問題,就像我不想再次填充面板,但我想找到一種方法來訪問循環中按鈕的標識符,以便在用戶編輯它們之後序列化它。 – kfloresmx5

+0

您可以將您的按鈕表示爲二維數組,第一個維度爲面板,第二個按鈕。否則,我可能完全誤解你的問題。 –

+0

是的我的問題有點令人困惑,但我添加了我的「商店」按鈕代碼,以顯示我到底做了什麼。 – kfloresmx5

1

您可以使用JPanel.putClientProperty()存儲JButton[]

panel109.putClientProperty("btn", btn); 

然後通過

JButton[] btn = (JButton[])panel109.getClientProperty("btn"); 

訪問它,你也可以使用一個Map(這是什麼putClientProperty()用到底,雖然它是更一般的Map<Object,Object>):

Map<JPanel,JButton[]> mapPanelButtons = new HashMap<>(); 
mapPanelButtons.put(panel109, btn); 
... 
JButton[] btn = mapPanelButtons.get(panel109); 

編輯:從您使用商店按鈕代碼進行編輯,我認爲如果繼承JPanel以將JButton[]作爲成員並在任何地方直接訪問,您會更好。懶惰是好當它可以幫助你找出最快速的方法,而不是最髒;) 這就是說,你可以在你的商店按鈕動作監聽器代碼使用getClientProperty()這樣的:

public void actionPerformed(ActionEvent e) { 
    ... 
    JButton[] btn = (JButton[])panel109.getClientProperty("btn"); 
    for (int i=0;i<6*28;i++){ // You might want to use btn.length instead of 6*28 
     // ... rest of your code 
    } 
} 
+0

我添加了我的「商店」按鈕代碼,我很困惑你的答案將如何結合到循環中。 – kfloresmx5

+0

@ kfloresmx5你也可以在'JButton'的每個實例中保存'JPanel':'btn [j] .putClientProperty(「panel」,panel109)'並在'ActionListener'中檢索它。 – Matthieu

0

我最終結束了創建3分別爲每個面板使用不同的JButton []數組,以使事情更簡單並達到最終期限,但老實說,我認爲有一種更簡單的方法來實現它。

JPanel panel109 = new JPanel(); 
JButton[] btnOne = new JButton(); 
for(int j = 0; j < 6*28; j++) { 
    btnOne[j] = new JButton(); 
    btnOne[j].setName("a" + j); 
    btnOne[j].setBackground(Color.white); 
    btnOne[j].setText(""); 
    btnOne[j].setPreferredSize(new Dimension(35,9)); 
    btnOne[j].addActionListener(this); 
    panel109.add(btnOne[j]); 
} 

JPanel panel115 = new JPanel(); 
JButton[] btnTwo = new JButton(); 
for(int j = 0; j < 6*28; j++) { 
    btnOne[j] = new JButton(); 
    btnTwo[j].setName("b" + j); 
    btnTwo[j].setBackground(Color.white); 
    btnTwo[j].setText(""); 
    btnTwo[j].setPreferredSize(new Dimension(35,9)); 
    btnTwo[j].addActionListener(this); 
    panel115.add(btnTwo[j]); 
} 
.... 

這使得每個JButton數組本身都是唯一的,並且可以更容易地訪問。

+0

是的:繼承'JPanel' ... – Matthieu