2013-04-05 86 views
0

我有這個代碼,我想把我的頁面中的所有按鈕放在arraylist中,考慮他們的名字,如果它的名字是例如btn_2它應該是列表的第二個元素。 它給出了一個錯誤,並說不能把字段投給Jbutton,因爲我的列表類型是Jbutton而不是field.his並不是我所有的代碼只是其中的一部分,但所有的代碼都由ading面板組成,然後向面板添加一個按鈕以及一些標籤。我怎麼能把Jbuttons考慮到arraylist考慮他們的名字?

getContentPane().setForeground(Color.DARK_GRAY); 
getContentPane().setLocation(-405, -87); 
setResizable(false); 
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
getContentPane().setLayout(null); 

panelPOD1 = new JPanel(); 
panelPOD1.setBounds(65, 13, 353, 313); 
panelPOD1.setBorder(new BevelBorder(BevelBorder.RAISED, Color.DARK_GRAY, null, null, null)); 
getContentPane().add(panelPOD1); 
panelPOD1.setLayout(null); 

JPanel panel = new JPanel(); 
panel.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, Color.DARK_GRAY, null, null, null)); 
panel.setBounds(10, 11, 59, 59); 
panelPOD1.add(panel); 
panel.setLayout(null); 

btn_1 = new JButton(); 
btn_1.setText(""); 
btn_1.setEnabled(false); 
btn_1.setBorder(new RoundedBorder()); 
btn_1.setBounds(17, 15, 26, 24); 
panel.add(btn_1); 

btn_3 = new JButton(""); 
btn_3.setEnabled(false); 
btn_3.setForeground(SystemColor.textInactiveText); 
btn_3.setBackground(SystemColor.activeCaption); 
btn_3.setBounds(10, 15, 26, 24); 
btn_3.setBorder(new RoundedBorder()); 
panel1.add(btn_3); 
panel.setLayout(null); 

btn_5 = new JButton(""); 
btn_5.setEnabled(false); 
btn_5.setBounds(11, 15, 26, 24); 
btn_5.setBorder(new RoundedBorder()); 
panel_1.add(btn_5); 

btn_2 = new JButton(""); 
btn_2.setEnabled(false); 
btn_2.setBounds(12, 15, 26, 24); 
btn_2.setBorder(new RoundedBorder()); 
panel_2.add(btn_2); 

btn_4 = new JButton(""); 
btn_4.setEnabled(false); 
btn_4.setBounds(11, 15, 26, 24); 
btn_4.setBorder(new RoundedBorder()); 
panel_3.add(btn_4); 


JPanel panel_4 = new JPanel(); 
panel_4.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null)); 
panel_4.setBounds(10, 81, 59, 59); 
panelPOD1.add(panel_4); 
panel_4.setLayout(null); 

btn_6 = new JButton(""); 
btn_6.setEnabled(false); 
btn_6.setBounds(10, 15, 26, 24); 
btn_6.setBorder(new RoundedBorder()); 
panel_4.add(btn_6); 


Integer search_index=0; 
java.lang.reflect.Field[] fields; 
Integer arrayIndex=0; 
ArrayList<JButton> rockets; 
boolean allFound=false; 
while (!allFound) 
{ 

    for (int i =0;i<fields.length;i++) 
    { 
     if(fields[i].getName().equals("btn"+arrayIndex.toString())) 
     { 

      rockets.add(arrayIndex,fields[i]); 
     } 

     if (arrayIndex==50) 
     { 
      allFound = true; 
     } 
    } 
} 
+0

請解釋爲什麼通過使用'java.lang.reflect.Field []字段' – mKorbel 2013-04-05 08:02:02

+0

嘗試添加到列表類型轉換。 – 2013-04-05 08:02:02

+2

請使用地圖嗎?你可以直接設置字段的名稱(使用setName) – MadProgrammer 2013-04-05 08:03:37

回答

0

像其他人一樣在這裏,我很懷疑你是否應該解決這個問題這樣的,但如果你堅持,這個工程:

final int NUMBER_OF_BUTTONS = 50; 
final String PREFIX = "btn_"; 
Field[] fields = getClass().getDeclaredFields(); 
JButton[] rockets = new JButton[NUMBER_OF_BUTTONS]; 

for (Field field : fields) {       
    if(field.getName().startsWith(PREFIX)) { 
     int index = Integer.parseInt(field.getName().substring(PREFIX.length())) - 1; 
     rockets[index] = (JButton) field.get(this); 
    }   
} 

我認爲你的第一個按鈕叫btn_1,因此-1爲該指數。

0
ArrayList<JButton> rockets = new ArrayList<JButton>(); 

btn_1 = new JButton(); 
btn_1.setText(""); 
btn_1.setEnabled(false); 
btn_1.setBorder(new RoundedBorder()); 
btn_1.setBounds(17, 15, 26, 24); 
rockets.add(btn_1); 
panel.add(btn_1); 

btn_2 = new JButton(""); 
btn_2.setEnabled(false); 
btn_2.setBounds(12, 15, 26, 24); 
btn_2.setBorder(new RoundedBorder()); 
rockets.add(btn_2); 
panel_2.add(btn_2); 

如果你在你的佈局重新排列(=掉?)按鈕,只需交換物品rocket

這樣你就不需要創建一個JButton的一個單獨的實例如果您更改代碼以重新使用over變量的單個變量。如果你需要識別一個實例,你應該繼承JButton的子類並添加一個標識符,而不是依賴於ArryList中不可見的變量名。