【问题标题】:Javafx Gui updateJavafx Gui 更新
【发布时间】: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 设为实例变量。

标签: java javafx


【解决方案1】:

您正在匿名内部类中使用具有局部范围的变量。仅当变量为 final 时才能执行此操作。如果需要更改变量的值,可以将其定义为实例变量。

public class MainApp extends Application {

    private int c;

    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        final Line l1 = new Line(200,80,200,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)
                        {
                            System.out.println("c=" + c);
                            l1.setStartX(rn.nextInt(400));
                            l1.setStartY(rn.nextInt(400));
                            c = 1;
                        }
                        else
                        {
                            System.out.println("c=" + c);
                            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=0
世界你好!
c=1
世界你好!
c=0

【讨论】:

  • 谢谢。现在我明白了
  • 如果假设 'c' 是另一个类的实例变量,这会起作用吗?
  • 是的,这应该可以工作,即使实例仅在您的方法中是本地的。请注意,由于某些版本(虽然不知道是哪个版本)本地变量不必声明为最终版本,但必须有效地为最终版本,即您可以向它们添加最终版本而不会产生任何副作用
猜你喜欢
  • 2014-12-20
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 2014-12-12
  • 2013-12-04
相关资源
最近更新 更多