【问题标题】:Strange behaviour when updating a Label with a TextField (Possible bug in JavaFX8)?使用 TextField 更新标签时的奇怪行为(JavaFX8 中的可能错误)?
【发布时间】:2014-08-17 00:40:42
【问题描述】:

抱歉,我没有找到更好的标题来描述我的问题:
我想用 TextField 的值更新 JavaFX 标签。

在某个星座中,直到我调整窗口大小或单击包含我的标签和我的TextFieldGridPane 之外,才会显示已更新的值。
完成此操作后,该值将立即更新。

以下 FXML 中的每个元素似乎都很重要:

<?xml version="1.0" encoding="UTF-8"?>
<?language javascript?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<VBox xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
    <fx:script> function updateLabel() { label.setText(textfield.getText()); } </fx:script>

    <GridPane>
        <TextField fx:id="textfield" onKeyReleased="updateLabel()" />
        <Label fx:id="label" text="Just type..." GridPane.columnIndex="1" />
        <DatePicker GridPane.columnIndex="2" />
    </GridPane>
    <!-- a ScrollPane containing a TableView containing a TableColumn -->
    <ScrollPane><TableView><columns><TableColumn/></columns></TableView></ScrollPane>
</VBox>
  • 如果我删除DatePicker 或将其放在GridPane 之外,Label 会立即刷新。
  • 如果我删除 ScrollPaneTableViewLabel 会立即刷新

你可以通过像这样加载 FXML 文件来尝试这个(但你需要 JDK8,因为DatePicker):

package sample;

import javafx.application.Application;
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().getClassLoader().getResource("main.fxml"));
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

这是一个(已知的?)错误吗?还是我在 JavaFX 中遗漏了有关缓存策略或类似内容的内容?

/opt/java8/bin % ./java -version
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)
/opt/java8/bin % uname -a       
Linux venus 3.15.7-1-ARCH #1 SMP PREEMPT Mon Jul 28 20:06:17 CEST 2014 x86_64 GNU/Linux

【问题讨论】:

  • 为我工作 (OS X + Java8u20b17)。如果将 javascript 函数替换为标签文本的绑定,也可以使用:text="${textfield.text}"
  • 是的。同样的问题。我的操作系统是 Win 8。Java 版本。 1.8.0。解决方案很容易。只需将TextField 的文本属性绑定到Label 的文本属性:textField.textProperty().bindBidirectional(label.textProperty());
  • 感谢您的回复!事实上,这个例子的解决方案很简单;但在我的程序的非简化版本中,我在 TextField 中输入时间并在标签中添加 8h - 所以简单的绑定是不够的。
  • 我也将日期选择器放在 GridView 之外——这甚至可以解决实际应用程序中的问题。
  • 我报告了一个错误:javafx-jira.kenai.com/browse/RT-38337

标签: java javafx


【解决方案1】:

由于标签通常是静态的,您可能需要在舞台上调用 repaint。你能把它加到fxml中提到的更新标签方法中吗?

【讨论】:

  • 这似乎更像是一个评论而不是一个实际的答案,因为它正在向 OP 询问他的代码
猜你喜欢
  • 2019-10-28
  • 1970-01-01
  • 2017-11-22
  • 2017-08-08
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
相关资源
最近更新 更多