英文:
Updating Labels to show the width and height of the scene in JavaFX
问题
我正在尝试创建一个小的JavaFX程序,该程序会打印出当前窗口的宽度和高度,并使用属性和绑定自动更新它。
我尝试了很多方法,最终得出了这个解决方案:
import javafx.application.Application;
import javafx.beans.property.*;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class App extends Application {
@Override
public void start(Stage stage) {
VBox root = new VBox();
Label width = new Label();
Label height = new Label();
TextField widthTf = new TextField();
TextField heightTf = new TextField();
Button button = new Button("Resize");
root.getChildren().addAll(width, height, widthTf, heightTf, button);
IntegerProperty widthInteger = new SimpleIntegerProperty(320);
IntegerProperty heightInteger = new SimpleIntegerProperty(240);
Scene scene = new Scene(root, widthInteger.getValue(), heightInteger.getValue());
width.textProperty().bind(widthInteger.asString());
height.textProperty().bind(heightInteger.asString());
stage.setScene(scene);
button.setOnAction(e -> {
widthInteger.setValue(Integer.parseInt(widthTf.getText()));
heightInteger.setValue(Integer.parseInt(heightTf.getText()));
stage.setWidth(widthInteger.getValue());
stage.setHeight(heightInteger.getValue());
widthTf.clear();
heightTf.clear();
});
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
这看起来可能不太美观,但这并不是我的主要目标,虽然使用按钮确实会更新值并调整窗口大小,但对我来说感觉像是作弊。我相信肯定有比这更好的方法,如果有的话,我想知道确切的方法。我尝试使用scene.getWidth()
和scene.getHeight()
,但是无法解决问题。我可能只是想得太多,但这确实感觉像是一个欺骗性的解决方案,我觉得应该有更好、更清晰的方法。
提前感谢你的帮助。
英文:
I'm trying to make a small JavaFX program that prints out the width and height of the current window, and updates it automatically using properties and bindings.
I tried a lot of things, and came to this solution:
import javafx.application.Application;
import javafx.beans.property.*;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class App extends Application {
@Override
public void start(Stage stage) {
VBox root = new VBox();
Label width = new Label();
Label height = new Label();
TextField widthTf = new TextField();
TextField heightTf = new TextField();
Button button = new Button("Resize");
root.getChildren().addAll(width, height, widthTf, heightTf, button);
IntegerProperty widthInteger = new SimpleIntegerProperty(320);
IntegerProperty heightInteger = new SimpleIntegerProperty(240);
Scene scene = new Scene(root, widthInteger.getValue(), heightInteger.getValue());
width.textProperty().bind(widthInteger.asString());
height.textProperty().bind(heightInteger.asString());
stage.setScene(scene);
button.setOnAction(e -> {
widthInteger.setValue(Integer.parseInt(widthTf.getText()));
heightInteger.setValue(Integer.parseInt(heightTf.getText()));
stage.setWidth(widthInteger.getValue());
stage.setHeight(heightInteger.getValue());
widthTf.clear();
heightTf.clear();
});
stage.show();
}
public static void main(String[] args) { launch(args);}
}
It is definitely not pleasing to the eyes, but that is not my main goal here, and even tho using the button does update the values and resize the window, it just feels like cheating to me. I'm pretty sure there has to be a better way than this, and if there is, I would like to know what exactly. I tried using scene.getWidth()
and scene.getHeight()
, but I couldn't solve it with them.
I might be just overthinking this, but it definitely feels like a cheating solution and like there is a better and cleaner way.
Thanks for the help in advance.
答案1
得分: 2
如果目标仅仅是显示窗口的宽度和高度标签,Stage
提供了 widthProperty()
和 heightProperty()
。你可以直接将它们绑定到标签上:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class App extends Application {
@Override
public void start(Stage stage) {
VBox root = new VBox();
Label width = new Label();
Label height = new Label();
root.getChildren().addAll(width, height);
Scene scene = new Scene(root, 320, 240);
width.textProperty().bind(stage.widthProperty().asString());
height.textProperty().bind(stage.heightProperty().asString());
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
如果你希望它们显示为整数,你可以提供一个格式化字符串:
width.textProperty().bind(stage.widthProperty().asString("%.0f"));
等等。
英文:
If the goal is simply to have labels which display the width and height of the window, Stage
exposes a widthProperty()
and a heightProperty()
. You can just bind directly to those:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class App extends Application {
@Override
public void start(Stage stage) {
VBox root = new VBox();
Label width = new Label();
Label height = new Label();
root.getChildren().addAll(width, height);
Scene scene = new Scene(root, 320, 240);
width.textProperty().bind(stage.widthProperty().asString());
height.textProperty().bind(stage.heightProperty().asString());
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) { launch(args);}
}
If you want them as integers, you can provide a format string:
width.textProperty().bind(stage.widthProperty().asString("%.0f"));
etc.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论