我在封闭范围中定义的JAVA、SWT局部变量必须是final或final
我正在尝试创建一个I*j数量的按钮 在每个按钮上,我想添加一个mouseUp操作,但我得到一个错误 我试图创建一个“Line”类来处理侦听器事件,但失败了 这就是我目前拥有的:我在封闭范围中定义的JAVA、SWT局部变量必须是final或final,java,button,scope,swt,listener,Java,Button,Scope,Swt,Listener,我正在尝试创建一个I*j数量的按钮 在每个按钮上,我想添加一个mouseUp操作,但我得到一个错误 我试图创建一个“Line”类来处理侦听器事件,但失败了 这就是我目前拥有的: protected void createContents() { // Connect to prolog engine Query.hasSolution("use_module(library(jpl))"); // only because we call e.g. jpl_pl_syntax/1
protected void createContents() {
// Connect to prolog engine
Query.hasSolution("use_module(library(jpl))"); // only because we call e.g. jpl_pl_syntax/1 below
String t1 = "consult('dots_lines.pl')";
Query.hasSolution(t1);
// Build GUI
shell = new Shell();
shell.setSize(450, 300);
shell.setText("SWT Application");
shell.setLayout(null);
txtDotsAndLines = new Text(shell, SWT.BORDER);
txtDotsAndLines.setBounds(175, 10, 86, 21);
txtDotsAndLines.setText("Dots and lines");
Button btnStartGame = new Button(shell, SWT.NONE);
btnStartGame.setBounds(180, 226, 70, 25);
btnStartGame.setText("Start Game");
// TODO: Play with sizes
int size = 5;
Line[] lines = new Line[size * (size - 1)];
// Buttons are line
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size; j++) {
lines[i] = new Line(shell, SWT.NONE);
lines[i].setBounds(100 + i * 35,54 + j * 13,32,11);
lines[i].addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
lines[i].setEnabled(false);
lines[i].setBackground(Display.getDefault().getSystemColor(SWT.COLOR_GREEN));
String t4 = "move([[line(9,10,cpu),line(11,16,cpu),line(16,17,cpu),line(17,22,p1),line(5,6,p1),line(2,3,p1),line(1,2,p1)],cpu],4,X).";
System.out.println("each solution of " + t4);
}
});
}
}
}
我得到的错误是:
我在封闭范围中定义的局部变量必须是final或实际上是final
非常感谢。您不能在鼠标适配器匿名类中引用
i
,因为它的值会更改。而是使用:
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size; j++) {
final Line line = new Line(shell, SWT.NONE);
lines[i] = line;
line.setBounds(100 + i * 35,54 + j * 13,32,11);
line.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(final MouseEvent e) {
line.setEnabled(false);
line.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_GREEN));
...
}
});
}
}
for(int i=0;i
这里,
最后一行
创建了一个可以在侦听器中引用的行的最后一个实例 无法在鼠标适配器匿名类中引用i
,因为其值已更改。而是使用:
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size; j++) {
final Line line = new Line(shell, SWT.NONE);
lines[i] = line;
line.setBounds(100 + i * 35,54 + j * 13,32,11);
line.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(final MouseEvent e) {
line.setEnabled(false);
line.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_GREEN));
...
}
});
}
}
for(int i=0;i
这里,
最后一行
创建了一个可以在侦听器中引用的行的最后一个实例 您必须使用数组吗?你能改用ArrayList吗?有几种方法可以解决这个问题,基本上是将集合声明为final,而不是它的内容。另外,如果您试图创建一个2D数组,您的代码当前创建一个大小为20的1D数组,但只填充前4行。您必须使用数组吗?你能改用ArrayList吗?有几种方法可以解决这一问题,基本上是将集合声明为final,而不是它的内容。另外,如果您试图创建一个2D数组,您的代码当前将创建一个大小为20的1D数组,但只填充前4行。或者,可以使用而不是final line
,也可以使用((line)e、 getSource())
来获取MouseeEvent父对象。或者,可以使用((line)e.getSource())
来获取MouseeEvent父对象,而不是使用最后一行。