这将是我关于全面筛选的第一篇文章的第二部分。
在JavaFX中使用全屏缩放开始屏幕
在全屏时稍微调整一下开始屏幕的比例,但现在,我似乎无法让游戏本身正确缩放。
package application.console;
import java.util.List;
import application.areas.startingArea.SA;
import application.areas.vanguardForest.VFCmds;
import application.areas.vanguardForest.VFNavi;
import application.areas.vanguardForest.VFPkups;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextField;
import javafx.scene.control.ScrollPane.ScrollBarPolicy;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
public class Console extends Region {
public static double WIDTH = 990;
public static double HEIGHT = 525;
private final Font cinzel;
private final BorderPane root;
private final VBox console;
private final ScrollPane scroll;
private final HBox inputBar;
private final TextField input;
private final Text carrot;
public Console() {
this.root = new BorderPane();
root.setStyle("-fx-background-color: #232323;");
this.cinzel = Font.loadFont("file:fonts/static/Cinzel-Medium.ttf", 16);
this.console = new VBox();
console.setPrefWidth(WIDTH);
console.setPrefHeight(HEIGHT);
this.scroll = new ScrollPane();
scroll.setContent(console);
scroll.setStyle("-fx-background: #232323;"
+ "-fx-background-color: transparent;"
+ "-fx-border-color: #232323;"
+ "-fx-focus-color: #232323;");
scroll.setHbarPolicy(ScrollBarPolicy.NEVER);
scroll.setVbarPolicy(ScrollBarPolicy.NEVER);
scroll.setBackground(new Background(new BackgroundFill(Color.TRANSPARENT, null, null)));
console.setStyle("-fx-background-color: #232323;"
+ "-fx-focus-color: #232323;");
console.heightProperty().addListener(new ChangeListener<Object>() {
@Override
public void changed(ObservableValue<?> observable, Object oldValue, Object newValue) {
scroll.setVvalue((Double)newValue);
}
});
this.inputBar = new HBox();
inputBar.setPrefSize(WIDTH, 16);
this.input = new TextField();
input.setStyle("-fx-background-color: transparent;"
+ "-fx-text-fill: #FFFFFF;"
+ "-fx-highlight-fill: #FFFFFF;"
+ "-fx-highlight-text-fill: #232323;"
);
input.setFont(cinzel);
input.setPrefWidth(WIDTH);
this.carrot = new Text(" > ");
carrot.setFont(Font.loadFont("file:fonts/static/Cinzel-Medium.ttf", 24));
carrot.setFill(Color.WHITE);
inputBar.getChildren().addAll(carrot, input);
root.setMinSize(WIDTH, (HEIGHT - input.getHeight()));
input.setOnAction(e -> {
String s = (input.getText()).stripTrailing();
if ((SA.isBuried || SA.inVF) && SS.gameStart) {
Cmds.commands(s); //has general functions
VFCmds.commands(s); //doesn't have function until specific command
VFPkups.pickUp(s); //commands that allows pickups to be made within the game
VFNavi.commands(s); //commands navigation for selected area
} else {
Cmds.commands(s);
}
input.clear();
});
root.getChildren().addAll(console, scroll, inputBar);
root.setBottom(inputBar);
}
@Override
protected void layoutChildren() {
double xScale = getWidth() / root.getWidth();
double yScale = getHeight() / root.getHeight();
double scale = Math.min(xScale, yScale);
for (BorderPane bp : List.of(root)) {
scaleAndCenter(bp, scale);
}
for (VBox vb : List.of(console)) {
scaleAndCenter(vb, scale);
}
for (HBox hb : List.of(inputBar)) {
scaleAndCenter(hb, scale);
}
for (ScrollPane sp : List.of(scroll)) {
scaleAndCenter(sp, scale);
}
for (TextField tf : List.of(input)) {
scaleAndCenter(tf, scale);
}
for (Text text : List.of(carrot)) {
scaleAndCenter(text, scale);
}
}
private void scaleAndCenter(BorderPane root, double scale) {
double w = scale * root.getWidth();
double h = scale * root.getHeight();
root.setPrefSize(w, h);
root.relocate((getWidth() - w) / 2, (getHeight() - h) / 2);
}
private void scaleAndCenter(VBox vb, double scale) {
double w = scale * vb.getWidth();
double h = scale * vb.getHeight();
vb.setPrefSize(w, h);
vb.relocate((getWidth() - w) / 2, (getHeight() - h) / 2);
}
private void scaleAndCenter(HBox hb, double scale) {
double w = scale * hb.getWidth();
double h = scale * hb.getHeight();
hb.setPrefSize(w, h);
hb.relocate((getWidth() - w) / 2, (getHeight() - h) / 2);
}
private void scaleAndCenter(TextField input, double scale) {
double w = scale * input.getWidth();
double h = scale * input.getHeight();
input.setPrefSize(w, 16);
input.relocate((getWidth() - w) / 2, (getHeight() - h) / 2);
}
private void scaleAndCenter(ScrollPane scroll, double scale) {
double w = scale * scroll.getWidth();
double h = scale * scroll.getHeight();
scroll.setPrefSize(w, h);
scroll.relocate((getWidth() - w) / 2, (getHeight() - h) / 2);
}
private void scaleAndCenter(Text text, double scale) {
double w = scale * text.getLayoutBounds().getWidth();
double h = scale * text.getLayoutBounds().getHeight();
double size = scale * text.getFont().getSize();
text.setFont(Font.font(
text.getFont().getFamily(),
size));
text.relocate((getWidth() - w) / 2, (getHeight() - h) / 2);
}
}
这样做,我得到一个错误说
Caused by: java.lang.RuntimeException: Exception in Application start method
at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:901)
at javafx.graphics@18.0.1/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.IllegalArgumentException: Children: duplicate children added: parent = BorderPane@56dca201
如果我要从类中删除BorderPane
,它只会显示一个白色窗口。
package application.console;
import javafx.scene.Parent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
public class game {
public static Parent runGame() {
Console c = new Console();
AnchorPane anchor = new AnchorPane(c);
AnchorPane.setTopAnchor(c, 0.0);
AnchorPane.setRightAnchor(c, 0.0);
AnchorPane.setBottomAnchor(c, 0.0);
AnchorPane.setLeftAnchor(c, 0.0);
BorderPane root = new BorderPane();
root.setCenter(anchor);
return root;
}
}
为什么让它成为Parent
的原因:它可以让我把它变成一个场景。(尽管有许多不同的方法可以做到这一点)我该如何在主机上执行完整的筛选并显示它?
你的问题中有很多代码,大多数与你的问题无关,所以我不会在这里讨论它。特别是你的问题与缩放无关。
错误信息告诉你做错了什么:
duplicate children added: parent = BorderPane
导致这种情况的代码是:
this.root = new BorderPane();
// . . .
root.getChildren().addAll(
console,
scroll,
inputBar
);
root.setBottom(inputBar);
您将inputBar
添加到root
BorderPane两次。
我不建议直接添加到边框窗格的子窗格。相反,使用borderPane上的位置设置器来设置子节点的位置(这些设置器会在内部将集合节点添加为子节点)。参考BorderPane
文档