所以,我试图为一大堆按钮定义一组方法,我想我可以在for循环中做到这一点,但是我得到了一个语法错误,我可以&# 39; t decipher ...这里是我想要使用的代码的简化版本......错误是:&#34;令牌上的语法错误,错位的构造&#34; < / p>
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);
}
答案 0 :(得分:3)
删除action
方法并将代码放在ActionListener
public void actionPerformed(ActionEvent arg0) {
System.out.println(i+"");
// ... etc.
}
正如其他人在答案中提到的那样,i
无法从actionPerformed
内访问{{1}}。具体来说,请参阅@ dasblinkenlight的答案以获得更全面的回复。
答案 1 :(得分:2)
您正在另一个方法中定义一个新方法:
public void action() {
System.out.println(i+"");
}
您需要在当前方法之外提取它。
答案 2 :(得分: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 :(得分: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());
)
}
答案 4 :(得分: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);
}
答案 5 :(得分: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));
}
}
答案 6 :(得分:0)
您可以定义嵌套方法,只嵌套类[内部类],或嵌套在方法[本地类]中的类。
如果您希望ActionListener
了解i
,则无法直接了解,或者您会偶然发现此类错误:
从内部类中访问局部变量i;需要被宣布为最终
所以你应该扩展你的JMenuItem
,或者更好地设计应用程序,以便将UI与当前模型状态分离。