2013-03-05 16 views
1

我在我的代碼使用JOptionPane的,我有這個塊:重複的局部變量對象[]的JOptionPane

Object[] move = { "Up", "Down" }; 
Object moveValue = JOptionPane.showInputDialog(null, 
"Where do you want to move?", "Input", 
JOptionPane.INFORMATION_MESSAGE, null, move, 
move[0]); 

我使用這個上面塊多次,我在想,是有辦法給予

Object[] move; 

新值。當我嘗試它像

Object[] move = { "Up", "Down", "Left" }; 

它說"Duplicate local variable move",當我嘗試

move = { "Up", "Down", "Left" }; 

提示錯誤"Array constants can only be used in initializers"

那麼有沒有辦法讓我多次使用我的變量「移動」?

編輯:代碼

更大的一部分是

 while (true) { 
     switch(hero.getPos()) { 
     case 1: 
      Object[] move = { "Up", "Down" }; 
      Object moveValue = JOptionPane.showInputDialog(null, 
        "Where do you want to move?", "Input", 
        JOptionPane.INFORMATION_MESSAGE, null, move, 
        move[0]); 
      move = null; 
      switch ((String) moveValue) { 
      case "Üles": 
       hero.setPos(hero.getPos() + 1); 
       break; 
      case "Paremale": 
       hero.setPos(hero.getPos() + 5); 
       break; 
      } 
      break; 
     case 2: 
      System.out.println("Draakon!!!!"); 
      dragon = new Dragon(1); 
      fight = new Fight(hero, dragon); 
      break; 
     case 3: 
      System.out.println("hallo!"); 
      move = { "Up", "Right", "Left" }; 

所以我有4路,也對最後一個定義的「移動」。最後一個給出了錯誤。

+0

你重用相同梅索德內上面的代碼? 方法內的「移動」聲明是否也是? – 2013-03-05 09:20:22

+0

'Object [] move = {「Up」,「Down」,「Left」};'應該是有效的,你確定你沒有在代碼的某處留下另一個'move'的聲明嗎?嘗試將其重命名爲其他內容並查看會發生什麼。 – 2013-03-05 09:21:32

回答

2

試試這個

Object[] move = { "Up", "Down" }; 

... 

move = new Object[]{ "Up", "Down", "Left" }; 
+0

謝謝,它的工作原理是這樣的。 LinkedList看起來太難 – Hans 2013-03-05 09:42:47

+0

是的,它的工作原理,但請記住,在Java中沒有像C語言那樣的動態分配,以便動態增加數組的大小。你在這裏做的是重新創建數組,當然這樣2或3項數組沒有問題。想象一下,您現在擁有一個包含100萬個物品的陣列,當您只需添加一個物品時,您是否每次在代碼中都需要時重新創建它?當你的集合大小是靜態時,數組很有意思,但是完成列表來處理這種情況。 – Rob 2013-03-05 10:33:50

-1

嘗試這種方式

Object[] move = { "Up", "Down" }; 

.... some code 

    move = { "Up", "Down", "Left" }; 
+0

他已經試過這個,它給'''數組常量只能用於初始化器'' – 2013-03-05 09:21:25

+4

誰upvoted這?它不是正確的答案,因爲OP已經嘗試了這一點,但沒有奏效。 – SudoRahul 2013-03-05 09:22:12

0

你可以有更詳細,並什麼每個move[]變量是唯一名。你也可以謹慎使用空白代碼塊,以提供一個較小的範圍:

LinkedList<Object> link = new LinkedList<Object>();//needs java.util.*; as import 
    link.add("Left"); 
    link.add("right"); 
     Object moveValue = JOptionPane.showInputDialog(null, 
       "Where do you want to move?", "Input", 
       JOptionPane.INFORMATION_MESSAGE, null, link.toArray(), 
       link.get(0).toString()); 
     System.out.println(moveValue); 
     link.add("Down"); 
     moveValue = JOptionPane.showInputDialog(null, 
       "Where do you want to move?", "Input", 
       JOptionPane.INFORMATION_MESSAGE, null, link.toArray(), 
       link.get(0).toString()); 
1

使用鏈表而不是陣列

看到這種方法試試java數組初始化。當你編碼像Object[] move = { "Up", "Down" };,你應該靜態初始化數組。因此,如果您再次嘗試執行move = { "Up", "Down", "Left" };,則意味着您要再次初始化陣列,這是非法的。所以你會得到一個錯誤信息。如果你想創建一個多次使用的對象數組的引用,你可以編寫像Object[] move=new Object[count]這樣的代碼,並且你必須給出這個數組的長度是不可變的...如果你想改變它的一個元素,通過使用或者像上面提到的那樣編寫另一個代碼並將其設置爲引用。如Object[] move2=new Object[count];move=move2;

0

那麼,你的問題可以參考:

{ 
    Object[] move = {...}; 
    ... 
} 
... 
{ 
    Object[] move = {...}; 
    ... 
} 
0

您應該使用一個列表來代替ArrayList。

Object[] move = { "Up", "Down" }; 
ArrayList<Object> list = new ArrayList<>(); 
for(Object o : move) list.add(o); 
// When you need it 
list.add("Left"); 
// To use it with JOptionPane 
Object[] finalMoves = list.toArray();