全屏缩放应用程序JavaFX 8



这将是我关于全面筛选的第一篇文章的第二部分。

在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添加到rootBorderPane两次。

我不建议直接添加到边框窗格的子窗格。相反,使用borderPane上的位置设置器来设置子节点的位置(这些设置器会在内部将集合节点添加为子节点)。参考BorderPane文档

最新更新