JAVA, SWT Локальная переменная i, определенная во вложенной области видимости, должна быть окончательной или фактически конечной - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь создать 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 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);
                }
            });
        }
    }
}

Это класс Line:

public class Line extends Button {


public Line(Composite parent, int style) {
    super(parent, style);
    // TODO Auto-generated constructor stub
}

protected void checkSubclass() { 
    // Disable the check that prevents sub-classing of SWT components 
} 

public void mouseUp(MouseEvent e) {
    Line.this.setEnabled(false);
    Line.this.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);
}

public void pc() {
    Line.this.setEnabled(false);
    Line.this.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_RED));
}

Я получаю сообщение об ошибке: Локальная переменная i, определенная во вложенной области видимости, должна быть окончательной или фактически конечной.

Заранее большое спасибо.

1 Ответ

0 голосов
/ 28 сентября 2018

Нельзя ссылаться на 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));

                ... 
            }
        });

    }
}

Здесь final Line line создает окончательный экземпляр строки, на которую можно ссылаться в слушателе.

...