【问题标题】:JavaFX Data Mangement [duplicate]JavaFX 数据管理 [重复]
【发布时间】:2014-05-31 20:24:51
【问题描述】:

带有 Scene1Controller 的场景 1!它有一个文本字段(客户名称)和一个按钮!

当我点击场景 1 中的按钮时,会出现一个屏幕键盘而不关闭场景!

屏幕键盘有它自己的控制器!

屏幕键盘有一个文本字段和完整的键盘

在屏幕键盘的文本字段中输入“stackoverflow”!

在屏幕键盘上按回车后,如何将屏幕键盘的文本字段值检索到场景 1 的客户名称字段中?

场景 1:

<TextField fx:id="CustomerName" layoutX="14.0" layoutY="75.0" onAction="#TextBoxTextChanged" prefHeight="29.0" prefWidth="254.0"/>
<Button fx:id="OnScreenKeyBoardButton" layoutX="268.0" layoutY="75.0" mnemonicParsing="false" onAction="#ButtonNameClick" prefHeight="29.0" text="..." />

屏幕键盘:

所有的钥匙和

输入按钮代码:

<Button fx:id="enterButton" layoutX="796.0" layoutY="210.0" minHeight="18.8" mnemonicParsing="false" prefHeight="40.0" prefWidth="90.0" text="Enter" onAction="#ButtonEnterClick"/>

场景 1 控制器:

@FXML
public void ButtonNameClick(final ActionEvent event)
{
  //opens on-screen keyboard
}

屏幕键盘控制器:

@FXML
public void ButtonEnterClick(final ActionEvent event)
{
  //code to be written to get the text field of the on-screen keyboard into the textfield of scene 1
}

【问题讨论】:

  • 我没有使用“fx:include”
  • 如需详细解答,请提供代码示例。
  • @Pete 我用代码编辑了我的问题
  • 没关系,使用相同的技术:通过控制器共享数据。例如。 github.com/james-d/Dialog-FXML-Example/tree/master/src
  • 你能详细说明一下吗?

标签: javafx fxml


【解决方案1】:

只需在键盘控制器中创建一个属性来表示文本,并从“Screen1Controller”中观察它:

public class KeyboardController {
    private StringProperty text = new SimpleStringProperty(this, "text", "");
    public StringProperty textProperty() {
         return text ;
    }
    public String getText() {
        return text.get();
    }
    public void setText(String text) {
        this.text.set(text);
    }

    @FXML
    public void buttonEnterClick(ActionEvent event) {
        text.set(// text from keyboard) ;
    }
    // ... everything else as before
}

public class Screen1Controller {
    @FXML
    private TextField customerName ;
    // ...
    @FXML
    public void buttonNameClick(ActionEvent event) {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("Keyboard.fxml"));
        Parent parent = loader.load();
        KeyboardController controller = (KeyboardContoller) loader.getController();
        controller.textProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> obs, String oldValue, String newValue) {
                // update text field with newValue:
                customerName.setText(newValue);
            }
        });
        // show keyboard ...
    }

    // other code...
}

【讨论】:

  • 感谢您的详尽回答,但只有在 buttonNameClick 完成执行后才会启动屏幕键盘!你不能修改场景 1 的文本字段。如果你知道我在那种情况下的意思
  • 我不太明白那个评论。你试过我的代码吗?执行KeyboardController 中的buttonEnterClick(...) 方法时,将更新“场景1”中的textfield。这不是你想要的吗?
  • 对不起我的错误!感谢您的回答!它正在工作!
猜你喜欢
  • 2021-09-30
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
相关资源
最近更新 更多