2012-09-25 63 views
2

所以,我試圖爲一大組按鈕定義一組方法,並且我想我可以在for循環中執行它,但是我得到一個語法錯誤我不能破譯......這是我想使用的代碼的簡化版本...的錯誤是:「令牌(S)語法錯誤,錯位構建體」在for循環中定義一個方法JAVA

JMenu blocks = new JMenu("Block"); 
menuBar.add(blocks); 

for (int i=0; i < 9; i++){ 
    public void action() { 
     System.out.println(i+""); 
    } 
    JMenuItem blockName = new JMenuItem(i+""); 
    blockName.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      action(); 
     } 
    }); 
    blocks.add(blockName); 
} 
+1

嘗試'新的JMenuItem( 「」 + I);' –

+2

@PaulTomblin沒有必要的,無論是工作 –

+0

什麼行給出了這樣的錯誤? – Lobo

回答

2

Java方法不是第一類對象(或第二或第三類對象;實際上,方法根本不是對象)。您需要將方法移動到類之一 - 無論是你的頂級,或者你定義的匿名內部類,像這樣:

for (int i=0; i < 9; i++) { 
    // You cannot access i from methods of the anonymous inner class 
    // because it is not final, but you can make a final copy 
    final int iCopy = i; 
    JMenuItem blockName = new JMenuItem(i+""); 
    blockName.addActionListener(new ActionListener() { 
     // It is OK to define additional methods here: 
     public void action() { 
      System.out.println(iCopy+""); 
     } 
     public void actionPerformed(ActionEvent arg0) { 
      action(); 
     } 
    }); 
    blocks.add(blockName); 
} 
3

刪除您action方法,把你的代碼的ActionListener

public void actionPerformed(ActionEvent arg0) { 
     System.out.println(i+""); 
     // ... etc. 
    } 

正如其他人在回答中提到的,i將不能從actionPerformed訪問。具體來說,請參閱@ dasblinkenlight的答案以獲得更全面的回覆。

2

你定義內的另一個方法的新方法:

public void action() { 
     System.out.println(i+""); 
    } 

你需要提取這個當前方法之外。

1

你不能有一個方法declartion insede for循環。循環必須位於方法體中。

private void init(JMenu blocks) { 
    for (int i=0; i < 9; i++){ 

    JMenuItem blockName = new JMenuItem(i+""); 
    blockName.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       handleAction(arg0); 
      } 
     }); 
    blocks.add(blockName); 
    } 
} 


    public void handleAction(ActionEvent event) { 

     Object source = event.getSource(); 

     if(source instanceof JMenuItem) { 
      JMenuItem item = (JMenuItem) source; 
      System.out.println(item.getName()); 
     ) 
    } 
1

這根本就是無效的Java。考慮在for循環中創建一個Action實例,並使用該動作返回JMenuItem,例如,

JMenu blocks = new JMenu("Block"); 
menuBar.add(blocks); 

for (int i=0; i < 9; i++){ 
    Action action = new AbstractAction(){ 
     public void actionPerformed(ActionEvent e){ 
     System.out.println("Whatever but not i as that cannot be accessed"); 
     System.out.println("or you need to introduce a final variable"); 
     } 
    }; 
    JMenuItem blockName = new JMenuItem(i+""); 
    blockName.setAction(action); 
    blocks.add(blockName); 
} 
0

您can'd定義嵌套的方法,只是嵌套類[內類別],或嵌套在方法[本地類別]中的類別。

如果你希望你的ActionListener要意識到i的,你不能直接,否則你會偶然發現這樣的錯誤:

local variable i is accessed from within inner class; needs to be declared final

所以你應該延長您的JMenuItem,或者更好地設計你的應用程序爲了將UI從當前模型狀態中分離出來。

1

你也可以做到這一點

for (int i = 0; i < 9; i++) { 
     JMenuItem blockName = new JMenuItem(i + ""); 
     blockName.setAction(new MyAction(i)); 
     blocks.add(blockName); 
    } 
} 

class MyAction extends AbstractAction { 
    int param; 

    public MyAction(int myParameter) { 
     param = myParameter; 
    } 

    public void actionPerformed(ActionEvent e) { 
     System.out.println(String.valueOf(param)); 
    } 
}