2

だから、私はボタンの大規模なセットのためのメソッドのセットを定義しようとしています.forループでそれを行うことができると考えましたが、解読できない構文エラーが発生しています.使用したいコードの簡略版...エラーは次のとおりです。「トークンの構文エラー、コンストラクトの配置が間違っています」

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);
}
4

7 に答える 7

3

メソッドを削除actionし、ActionListener内にコードを配置します

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

他の人が彼らの答えで述べたように、i内からアクセスすることはできませんactionPerformed。具体的には、@ dasblinkenlightの回答を参照して、より完全な対応を確認してください。

于 2012-09-25T13:49:35.663 に答える
2

別のメソッド内に新しいメソッドを定義しています。

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

これを現在のメソッドの外に抽出する必要があります。

于 2012-09-25T13:49:35.867 に答える
2

Java メソッドは第一級のオブジェクトではありません (または第二級または第三級のオブジェクトです。実際、メソッドはまったくオブジェクトではありません)。次のように、メソッドをクラスの 1 つ (トップ クラスまたは定義した匿名の内部クラス) に移動する必要があります。

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);
}
于 2012-09-25T13:54:34.803 に答える
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));
    }
}
于 2012-09-25T16:50:47.970 に答える
1

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());
       ) 
   }
于 2012-09-25T13:49:58.313 に答える
1

それは単に有効ではありませんJavaActionfor ループでインスタンスを作成することを検討し、そのアクションを使用して をバックアップします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);
}
于 2012-09-25T13:51:16.087 に答える
0

ネストされたメソッド、ネストされたクラス [内部クラス]、またはメソッドにネストされたクラス [ローカル クラス] を定義できます。

ActionListenerを認識したい場合iは、直接行うことはできません。そうしないと、次のようなエラーに遭遇します。

ローカル変数 i は内部クラス内からアクセスされます。final を宣言する必要があります

JMenuItemそのため、現在のモデル ステータスから UI を切り離すために、アプリケーションを拡張するか、アプリケーションをより適切に設計する必要があります。

于 2012-09-25T13:58:38.370 に答える