- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的目标是在 Stage + Scene 出现后,每秒查看矩形的颜色变化。
我研究并尝试了几件事:
一切都是徒劳的。在大多数情况下,舞台来了,然后程序在后台执行颜色更改(没有可视化),最后场景和最终结果一起出现。或版本 2:我什么也没看到,代码通过,最后立即得出最终结果。
这是我的代码:
package sample;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
GridPane gridPane = new GridPane();
Rectangle[] recs = new Rectangle[10];
for (int i = 0; i < recs.length; i++) {
recs[i] = new Rectangle(30, 30, Color.GREEN);
recs[i].setStroke(Color.BLACK);
gridPane.add(recs[i], i, 0);
}
primaryStage.setTitle("Code after primaryStage.show()");
primaryStage.setScene(new Scene(gridPane, 400, 300));
primaryStage.show();
for (Rectangle rec : recs) {
Thread.sleep(1000);
rec.setFill(Color.ORANGE);
}
}
public static void main(String[] args) {
launch(args);
}
}
最佳答案
这里的问题是您的循环在主应用程序线程上运行,因此它会锁定任何 GUI 更新,直到它完成。
改为在它自己的线程上执行循环并使用 Platform.runLater()
更新每个矩形:
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
GridPane gridPane = new GridPane();
Rectangle[] recs = new Rectangle[10];
for (int i = 0; i < recs.length; i++) {
recs[i] = new Rectangle(30, 30, Color.GREEN);
recs[i].setStroke(Color.BLACK);
gridPane.add(recs[i], i, 0);
}
primaryStage.setTitle("Code after primaryStage.show()");
primaryStage.setScene(new Scene(gridPane, 400, 300));
primaryStage.show();
new Thread(() -> {
for (Rectangle rec :
recs) {
try {
Thread.sleep(1000);
Platform.runLater(() -> rec.setFill(Color.ORANGE));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
public static void main(String[] args) {
launch(args);
}
}
那么发生了什么?
new Thread(() -> {
在您的应用程序后台打开一个新线程,以便 UI 保持响应。
然后我们可以在 try/catch
block 中开始您的循环。
Platform.runLater(() -> rec.setFill(Color.ORANGE));
当使用后台线程时,重要的是要知道您不能直接对 UI 进行更改。这一行告诉 JavaFX 在 JavaFX 应用程序线程上执行 rec.setFill()
语句。
.start();
您已经创建了新的 Thread
,这只是启动它。
关于JavaFX,primaryStage.show () 之后的代码,怎么样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50843652/
这个问题在这里已经有了答案: How do I open the JavaFX FileChooser from a controller class? (4 个答案) 关闭 6 年前。 我将 .f
有什么办法可以防止新阶段抢走主阶段的焦点吗? 我的意思是每个新的 stage.show(); 都会从我的主舞台上夺走焦点。 我不想将 JavaFX 与 Swing 混合,因此无法选择将内容嵌入到 JF
JavaFX PrimaryStage 无法工作。为什么?我检查了谷歌,但我没有找到任何与问题类型相关的内容。我的意思是图书馆已经建立了。我导入了 javaFX 并编写了这个类,但它再次不起作用,我不
我目前有一些代码可以在 primaryStage 中创建一个按钮来生成一个新的阶段。我的目标是让按钮在启动新按钮后立即使用 setOnMouseClicked 方法关闭它所在的阶段。这是当前的设置方式
我正在尝试使用 JavaFX 和 SceneBuilder 实现应用。 我制作了一个包含不同按钮的主菜单,每个按钮都指向不同的页面。 因此,例如,当我单击第一个按钮时,我希望切换到一个新面板,然后,如
我得到了一个 Mainpage.fxml,并且在同一阶段打开了一个 Objectpage.fxml。现在我需要通过 Labelpress 返回 Mainpage.fxml,但我无法让它工作。 我已经尝
我知道有很多与此特定错误相关的问题,但我找不到适合我的错误的解决方案。 所以我正在做的是创建一个 javaFX 应用程序并使用 Modality 库,以便我可以创建一个始终在主舞台上方打开的子窗口。但
我的目标是在 Stage + Scene 出现后,每秒查看矩形的颜色变化。 我研究并尝试了几件事: primaryStage.show() 下的代码[看我的示例代码] primaryStage.set
这个问题在这里已经有了答案: JavaFX: Undecorated Window (1 个回答) 关闭7年前。 我正在制作 JavaFX 桌面应用程序。我想删除默认的窗口边框,还想自定义最小化、最大
我目前正在测试一些 JavaFX 代码,以便更多地了解这种语言,我希望有一个带有名为“Iconify”的按钮的窗口,该按钮在单击时会最小化窗口。 Here you can see how it loo
我的类中有 start 方法,用于启动 javaFX 的 primaryStage。 不过,我有另一个名为 change_screen(int n) 的函数,它将根据传递给它的数字创建一个新场景并为该
我正在尝试制作一个具有 2 个屏幕的简单应用程序,一个用于加载应用程序,一个用于仅使用 Java 和 CSS(无 FXML)汇总输入商品的价格,但我卡在了初始屏幕上。我知道这个 primaryStag
我是 tornadoFX 的新手,我不知道如何设置 PrimaryStage 或 Scene 属性,例如 Scene 高度或宽度或 PrimaryStage 模态。请帮我。 更新 我要设置场景的高度和
我是一名优秀的程序员,十分优秀!