2014-02-27 74 views
1

我已經創建了JFields數組;如何給java中的數組中的項目命名?

JFields[] field = new JField[5]; 

for(int j = 0; i < 5; i++) { 
    field[j] = new JField(); 
} 

我想要做的就是給陣列中的每個項目的名稱,因此,例如,字段1,字段2,字段3,字段4,字段5。

我試過這樣做;

String[] field = {field1, field2, field3, field4, field5} 

也試過這樣做;

field[j] = {field1, field2, field3, field4, field5} 

但都沒有工作。有人能告訴我我該怎麼做,謝謝。

另外,我怎麼能叫個別項目從陣列

我試過例如field[0] OR field[1]等,但不起作用。

謝謝

+0

你不是說'的JTextField字段1 =字段[0] ; JTextField field2 = field [1]; ...'? –

+2

你的'for'循環有一個錯字(i-> j) – Joffrey

+0

「我嘗試了例如field [0]或者field [1]等等,但那是行不通的。請詳細說明這一點。我不明白你的嘗試,以及你無法獲得的。 – Joffrey

回答

4

這就是你的數組的用途。因爲您有一個名爲fields的JTextField數組,所以您已經爲數組中的項目(例如field [2]和field [3])獲得了「名稱」,因此不需要在此給變量「名稱」。

幽州:

我試過例如場[0]或領域[1]等,但不起作用。

然後你做錯了什麼,但沒有告訴我們什麼。請詳細說明您的「不起作用」,包括向我們展示如何使用field[0]field[1]以及您可能會遇到的錯誤或異常情況,我們將爲您提供更完整的答案。

我猜你已經有了一個範圍問題,也許你的數組是在一個方法或構造塊中聲明的,或者是一些其他的循環或控制結構塊使它在你想要使用它的地方不可見,但我無法確定。更多的代碼將幫助我們更多地告訴你這一點。


編輯
例如:

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class TextFieldFun extends JPanel { 
    public static final int TEXT_FIELD_COUNT = 8; 
    private static final int COLS = 10; 

    // array of JTextFields 
    private JTextField[] fields = new JTextField[TEXT_FIELD_COUNT]; 

    // JTextField used to enter text to go into one of the array item fields 
    private JTextField enterField = new JTextField(COLS); 

    // spinner to choose which fields item to have its text set 
    private JSpinner fieldIndexSpinner = new JSpinner(new SpinnerNumberModel(0, 0, TEXT_FIELD_COUNT - 1, 1)); 

    public TextFieldFun() { 
     // JPanel to hold the array of fields 
     JPanel textFieldPanel = new JPanel(new GridLayout(0, 1)); 
     for (int i = 0; i < fields.length; i++) { 
     // create field items for array 
     fields[i] = new JTextField(COLS); 
     fields[i].setEditable(false); 
     fields[i].setFocusable(false); 
     JPanel rowPanel = new JPanel(); 
     rowPanel.add(new JLabel("Field " + i + ":")); 
     rowPanel.add(fields[i]); // and put into a JPanel 
     textFieldPanel.add(rowPanel); // put JPanel into grid layout using JPanel 
     } 

     EnterAction enterAction = new EnterAction(); 
     enterField.setAction(enterAction); 

     JPanel bottomPanel = new JPanel(); 
     bottomPanel.add(new JLabel("Row to Change:")); 
     bottomPanel.add(fieldIndexSpinner); 
     bottomPanel.add(new JLabel("Text:")); 
     bottomPanel.add(enterField); 
     bottomPanel.add(new JButton(enterAction)); 

     setLayout(new BorderLayout()); 
     add(textFieldPanel, BorderLayout.CENTER); 
     add(bottomPanel, BorderLayout.SOUTH); 
    } 

    private class EnterAction extends AbstractAction { 
     public EnterAction() { 
     super("Enter"); 
     } 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     // get the text from the enterField JTextField 
     String text = enterField.getText(); 

     // get the int from the JSpinner 
     int index = ((Integer)fieldIndexSpinner.getValue()).intValue(); 

     // set the JTextField in the array whose index matches that of the spinner value 
     fields[index].setText(text); 
     } 
    } 

    private static void createAndShowGui() { 
     TextFieldFun mainPanel = new TextFieldFun(); 

     JFrame frame = new JFrame("TextFieldFun"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

這是一個很好的見解。在數組中,元素的「名稱」是其索引。 –

+0

我的意思是說,我在上面創建的for循環中,添加了一個此語句字段[0] .setText(「Hi」),它確實很好。但是,當我將[0]更改爲[1]或其他內容時,它會添加文本,而不是更改文本字段的大小。我很抱歉沒有清楚地解釋我自己。謝謝。 – user3325350

+0

@ user3325350:請編輯您的問題並顯示您正在使用的特定代碼。試着展示整個循環,試圖展示真實的代碼,而不是排序的代碼(就像你最初的問題 - JFields一樣),試着更詳細地描述你的程序的不正當行爲,因爲你上面描述的是什麼,調用'someTextField.setText(「foo」)'改變字段的大小不可能真的發生。 –

0

你不能將數組給名稱明確。你正在尋找的是一個Map

0

你需要的是一個Map。它允許按鍵查找值。在你的情況下,關鍵是「名稱」,值是整數。

1

如果您堅持要按名稱引用它們,請使用HashMap。

HashMap<String, JField> fieldNameMap = new HashMap<String, JField>(); 

fieldNameMap.put("field1", field[j]); 
//repeat ad nauseum 

//when you want to retrieve one 
JField myField = fieldNameMap.get("field1"); 
1

你所要求並沒有什麼意義,除非你正在嘗試做的是與每一個Field實例獨立陣列中引用它的工作。上面推薦的Map解決方案可以工作,就像每個Field獨立實例化並將其分配給一個變量。

JField field1 = new JField(); 
JField field2 = new JField(); 
JField field3 = new JField(); 
JField field4 = new JField(); 
JField field5 = new JField(); 
JFields[] fields = { field1, field2, field3, field4, field5 }; 
// The following 2 statements reference the same JField instance. 
System.out.println(field5.toString()); 
System.out.println(fields[ 4 ].toString()); 

地圖更有意義,我,但空檢查步驟是在屁股(我想你也應該爲null檢查陣列的解決方案痛......我會離開,給讀者)。

Map<String,JField> fields = new HashMap<String,JField>(); 
for(int i = 0; i < 5; i++) { 
    String key = "field" + (i + 1); 
    JField value = new JField(); 
    fields.put(key, value); 
} 
JField field = fields.get("field5"); 
if (field != null) { 
    System.out.println(field.toString()); 
} 
1

數組意味着使用索引進行訪問(即fields[0], fields[1]等)。

如果您確實需要您的結構能夠通過名稱訪問您的項目,那麼您需要將數據結構從數組更改爲地圖。我推薦使用一個HashMap。

你可以導入你的陣列到這樣一個HashMap:

HashMap<String,JField> map = new HashMap<String,JField>(); 
for (int i = 0; i < field.length; i++){ 
    map.put("field"+i ,field[i]); 
} 

現在,您可以按名稱訪問您的JFields:

map.get("field1") 
相關問題