gpt4 book ai didi

java - 使用没有 FXML 的 JavaFX Controller

转载 作者:行者123 更新时间:2023-12-04 03:35:37 25 4
gpt4 key购买 nike

是否有可能在不使用 FXML 的情况下使用带有 JavaFX GUI 的 Controller 。

我注意到 FXML 文件包含一个 fx-controller属性来绑定(bind) Controller ,但我发现它不是一个简单的方法来使用它。

关于在不使用 FXML 文件或 JavaFX Scene Builder 的情况下使用 JavaFX 构建 MVC 架构的任何想法?

最佳答案

你的问题对我来说不是特别清楚:你只是创建类,基本上将所有东西与听众联系在一起。我不知道这是否有帮助,但这是一个简单的示例,它只有几个文本字段和一个显示它们总和的标签。这就是我认为的“经典 MVC”: View 观察模型并在模型发生变化时更新 UI 元素。它向 UI 元素注册处理程序,并在事件发生时委托(delegate)给 Controller : Controller 依次处理输入(如果需要)并更新模型。

模型:

package mvcexample;

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ReadOnlyIntegerWrapper;
import javafx.beans.property.SimpleIntegerProperty;

public class AdditionModel {
private final IntegerProperty x = new SimpleIntegerProperty();
private final IntegerProperty y = new SimpleIntegerProperty();
private final ReadOnlyIntegerWrapper sum = new ReadOnlyIntegerWrapper();

public AdditionModel() {
sum.bind(x.add(y));
}

public final IntegerProperty xProperty() {
return this.x;
}

public final int getX() {
return this.xProperty().get();
}

public final void setX(final int x) {
this.xProperty().set(x);
}

public final IntegerProperty yProperty() {
return this.y;
}

public final int getY() {
return this.yProperty().get();
}

public final void setY(final int y) {
this.yProperty().set(y);
}

public final javafx.beans.property.ReadOnlyIntegerProperty sumProperty() {
return this.sum.getReadOnlyProperty();
}

public final int getSum() {
return this.sumProperty().get();
}



}

Controller :
package mvcexample;

public class AdditionController {

private final AdditionModel model ;

public AdditionController(AdditionModel model) {
this.model = model ;
}

public void updateX(String x) {
model.setX(convertStringToInt(x));
}

public void updateY(String y) {
model.setY(convertStringToInt(y));
}

private int convertStringToInt(String s) {
if (s == null || s.isEmpty()) {
return 0 ;
}
if ("-".equals(s)) {
return 0 ;
}
return Integer.parseInt(s);
}
}

看法:
package mvcexample;

import javafx.geometry.HPos;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.control.TextFormatter.Change;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;

public class AdditionView {
private GridPane view ;
private TextField xField;
private TextField yField;
private Label sumLabel;

private AdditionController controller ;
private AdditionModel model ;

public AdditionView(AdditionController controller, AdditionModel model) {

this.controller = controller ;
this.model = model ;

createAndConfigurePane();

createAndLayoutControls();

updateControllerFromListeners();

observeModelAndUpdateControls();

}

public Parent asParent() {
return view ;
}

private void observeModelAndUpdateControls() {
model.xProperty().addListener((obs, oldX, newX) ->
updateIfNeeded(newX, xField));

model.yProperty().addListener((obs, oldY, newY) ->
updateIfNeeded(newY, yField));

sumLabel.textProperty().bind(model.sumProperty().asString());
}

private void updateIfNeeded(Number value, TextField field) {
String s = value.toString() ;
if (! field.getText().equals(s)) {
field.setText(s);
}
}

private void updateControllerFromListeners() {
xField.textProperty().addListener((obs, oldText, newText) -> controller.updateX(newText));
yField.textProperty().addListener((obs, oldText, newText) -> controller.updateY(newText));
}

private void createAndLayoutControls() {
xField = new TextField();
configTextFieldForInts(xField);

yField = new TextField();
configTextFieldForInts(yField);

sumLabel = new Label();

view.addRow(0, new Label("X:"), xField);
view.addRow(1, new Label("Y:"), yField);
view.addRow(2, new Label("Sum:"), sumLabel);
}

private void createAndConfigurePane() {
view = new GridPane();

ColumnConstraints leftCol = new ColumnConstraints();
leftCol.setHalignment(HPos.RIGHT);
leftCol.setHgrow(Priority.NEVER);

ColumnConstraints rightCol = new ColumnConstraints();
rightCol.setHgrow(Priority.SOMETIMES);

view.getColumnConstraints().addAll(leftCol, rightCol);

view.setAlignment(Pos.CENTER);
view.setHgap(5);
view.setVgap(10);
}

private void configTextFieldForInts(TextField field) {
field.setTextFormatter(new TextFormatter<Integer>((Change c) -> {
if (c.getControlNewText().matches("-?\\d*")) {
return c ;
}
return null ;
}));
}
}

应用类:
package mvcexample;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class MVCExample extends Application {

@Override
public void start(Stage primaryStage) {
AdditionModel model = new AdditionModel();
AdditionController controller = new AdditionController(model);
AdditionView view = new AdditionView(controller, model);

Scene scene = new Scene(view.asParent(), 400, 400);
primaryStage.setScene(scene);
primaryStage.show();
}

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

关于java - 使用没有 FXML 的 JavaFX Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36868391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com