【发布时间】:2016-11-15 06:47:31
【问题描述】:
我的问题基本上来自我无法弄清楚的 Java 语言。
这只是帮助我理解使用Platform.runlater 方法更新GUI 概念的基本代码。
package practise;
import java.util.Random;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
public class Practise extends Application {
@Override
public void start(Stage primaryStage) {
Button btn = new Button();
final Line l1 = new Line(200,80,200,0);
final int c = 0;
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
Platform.runLater(new Runnable() {
Random rn = new Random();
@Override
public void run() {
if(c==0)
{
l1.setStartX(rn.nextInt(400));
l1.setStartY(rn.nextInt(400));
c = 1;
}
else
{
l1.setEndX(rn.nextInt(400));
l1.setEndY(rn.nextInt(400));
c = 0;
}
}
});
}
});
l1.setStroke(Color.YELLOW);
l1.setStrokeWidth(2);
StackPane root = new StackPane();
root.getChildren().add(btn);
root.getChildren().add(l1);
Scene scene = new Scene(root, 400, 400, Color.WHITE);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
这是我的代码。我希望交替更改线条的起点或终点。为此,我创建了一个变量“c”,每次按下按钮时都会交替它的值。
但问题是编译器强制我将 int c 更改为 final。这意味着它成为一个常数,不再符合我的目的。
为什么会发生这种情况,我该如何解决?
【问题讨论】:
-
发生这种情况是因为您在匿名内部类中使用了
c。 -
您在其匿名内部类中使用外部类中的变量。这些变量必须是
final。创建一个实现Runnable的“real”类,并在其构造函数或其他方式中传递c。 -
我该如何解决这个问题?
-
您可以更改我上面的代码以使其正常工作吗?我是 java 和 OOP 的菜鸟,不了解匿名内部类的概念。
-
将
c设为实例变量。