- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
几天来我一直在努力解决这个问题,我已经阅读了有关线程、MVC、绑定(bind)、接口(interface)和许多有趣的东西,但我就是无法以适当的方式将它们全部放在一起来完成这项工作。
我只想列出 mi c:\中的所有文件并将它们显示在不断变化的标签上但我得到的只是:
Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4
这是我的 FXML:
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<GridPane alignment="center" hgap="10" prefHeight="200.0" prefWidth="401.0" vgap="10" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.60" fx:controller="sample.Controller">
<columnConstraints>
<ColumnConstraints />
</columnConstraints>
<rowConstraints>
<RowConstraints />
</rowConstraints>
<children>
<AnchorPane prefHeight="200.0" prefWidth="368.0">
<children>
<Button fx:id="start" layoutX="159.0" layoutY="35.0" mnemonicParsing="false" onAction="#displayFiles" text="Start" />
<Label fx:id="fileLabel" layoutX="20.0" layoutY="100.0" prefHeight="21.0" prefWidth="329.0" text="This label must change on iteration" />
</children>
</AnchorPane>
</children>
</GridPane>
我的主要:
import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Dummy App");
primaryStage.setScene(new Scene(root));
primaryStage.setResizable(false);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
我的 Controller :
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
public class Controller {
@FXML
Button start;
@FXML
Label fileLabel;
@FXML
void displayFiles(ActionEvent event) throws Exception{
Model model = new Model();
//BINDING
fileLabel.textProperty().bind(model.status);
Thread thread = new Thread(model);
thread.start();
}
}
和模型:
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import java.io.File;
/**
* Created by R00715649 on 16-Nov-16.
*/
public class Model implements Runnable {
File rootDirectory = new File("C:/");
StringProperty status = new SimpleStringProperty("Starting scan...");
@Override
public void run() {
try{
File[] fileList = rootDirectory.listFiles();
for (File f:fileList){
processDirectory(f);
}
}catch (Exception e){
}
}
void processDirectory (File directory){
if (directory.isDirectory()){
File[] fileList = directory.listFiles();
for (File f:fileList){
processDirectory(f);
}
}else{
System.out.println(directory.getAbsolutePath());
status.set(directory.getAbsolutePath());
}
}
}
最佳答案
由于标签的文本绑定(bind)到模型的状态,更改模型的状态会导致 UI 发生变化(标签的文本将发生变化)。因此,您只能在 FX 应用程序线程上更改模型的状态。
您可以使用 Platform.runLater(...)
安排代码在 FX 应用程序线程上运行。您可以直接在模型中执行此操作:
void processDirectory (File directory){
if (directory.isDirectory()){
File[] fileList = directory.listFiles();
for (File f:fileList){
processDirectory(f);
}
}else{
System.out.println(directory.getAbsolutePath());
Platform.runLater(() -> status.set(directory.getAbsolutePath()));
}
}
或者您可以使用模型的状态(而不是绑定(bind))注册一个监听器,然后委托(delegate)给那里的 FX 应用程序线程:
@FXML
void displayFiles(ActionEvent event) throws Exception{
Model model = new Model();
ChangeListener<String> listener = (obs, oldStatus, newStatus) -> fileLabel.setText(newStatus);
model.status.addListener(listener);
Thread thread = new Thread(model);
thread.start();
}
在后一种解决方案中,您可能希望在线程结束时移除监听器(这需要一些额外的工作),否则在标签仍然显示时无法对模型进行垃圾回收。为此,您可以考虑使用 Task
:
@FXML
void displayFiles(ActionEvent event) throws Exception{
Model model = new Model();
Task<Void> task = new Task<Void>() {
@Override
public Void call() {
model.status.addListener((obs, oldStatus, newStatus) -> updateMessage(newStatus));
model.run();
return null ;
}
};
fileLabel.textProperty().bind(task.messageProperty());
task.setOnSucceeded(e -> fileLabel.textProperty().unbind());
new Thread(task).start();
}
关于Javafx 在哪里将标签绑定(bind)到 StringProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40658633/
我正在稍微切换我的数据模型。我打算将 'repeated=True' 添加到当前存在的 stringProperty。我想知道这会不会搞砸什么? 最佳答案 它应该可以工作,除非您有 None 值。单例
我正在使用javafx。 我必须将 Object 类型的变量转换为 StringProperty 类型。 Object v = "var"; StringProperty var = (StringP
我想更新 JavaFX 应用程序中的标签,以便文本在方法运行时更改多次: private void analyze(){ labelString.setValue("Analyzing");
当我尝试根据输入更新值时,我遇到了 Kivy StringProperty 变量的问题。 让它变得简单一点,这样我也能理解(我对此有点陌生)。 TextTime1 = StringProperty()
我想实现一个 kivy 应用程序,它有两个屏幕(由屏幕管理器管理)。在第一个屏幕(称为 LoginScreen)上有两个 TextInput 字段和一个按钮。在第二个屏幕上,我有两个标签,我想显示在第
我对 JavaFX 中的绑定(bind)功能有疑问。我想要的是绑定(bind) 2 个字符串属性。但是它们的值不应该相等。 让我举个例子: 我有一个 StringProperty,它代表我的应用程序中
我正在用 JavaFX 开发一个应用程序,我想用一个 Person 表示一个人的信息类(class)。我遇到了一个教程,其中一个人的名字被表示为 StringProperty而不是 String .我
几天来我一直在努力解决这个问题,我已经阅读了有关线程、MVC、绑定(bind)、接口(interface)和许多有趣的东西,但我就是无法以适当的方式将它们全部放在一起来完成这项工作。 我只想列出 mi
我有一个具有 String 重复属性的 ndb 模态。我正在尝试检索所有具有空值的实体。但是 NDB 查询返回空。 class A(ndb.model): name = ndb.StringP
我的应用程序从数据库中获取数据并将其存储到 Python 变量中。下面的代码是一个简化版本,其中有两个屏幕。第一个屏幕有两个按钮,第二个屏幕有一个标签和一个后退按钮。第二个屏幕上的标签文本将根据按下的
我有一个关于多线程和 StringProperty 绑定(bind)的问题。 我有一个 CacheManager 类,它包含一个 Thread,它使用服务器上的更改更新我的缓存。现在,我想用文本和进度
我正在使用 JavaFx TableView 并发现有一些类可以使用 TableView,例如 SimpleStringProperty、StringProperty、SimpleBooleanPro
有没有一种简单的方法来绑定(bind) StringProperty 对象的串联? 这是我想做的事情: TextField t1 = new TextField(); TextField t2 = n
我正在尝试在 TableView 中显示一些信息,但遇到了一些无法解决的问题。 这是我正在尝试做的事情: 我有一个 Room 对象: public class Room { private S
我正在使用 PyCrypto 生成安全 key 哈希。我想存储我生成的一个或多个部分 key 。每个部分键的形式为 \x0f|4\xcc\x02b\xc3\xf8\xb0\xd8\xfc\xd4\x9
我有一个 kivy 标签绑定(bind)到 StringProperty() 。我正在尝试用 Python 从中取出字符串。 class Screen1(Screen): food_label
假设我的 POJO 仅限于以下内容: public class TestPojo { StringProperty myField; public TestPojo(){} p
我有 StringProperty,它由两个不断变化的字母(例如:06)组成。我有两个标签,我想将它们绑定(bind)到 StringProperty 的每个字母,例如 label1="0" 和 la
它们之间的主要区别是什么?您也可以谈谈结构化属性吗?他们都保存了多个值,但我无法理解其中的区别。 最佳答案 db.StringListProperty() 在传统的 Datastore API 中用于
在任何情况下,GAE 数据存储可能会将属性类型从 StringProperty 更改为 TextProperty(实际上忽略模型定义)? 考虑以下情况(简化): class MyModel(db.Mo
我是一名优秀的程序员,十分优秀!