JavaFX ListView 被 TextArea 使用 GridPane 覆盖

标签 java javafx

我正在开发一个带有 GUI 的小游戏,我遇到了布局问题。

当我运行它时,我得到这个:

Image

ListViewTextArea 覆盖,我试图将其放在它旁边。就像这个例子一样:

Image2

这是我到目前为止的代码:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.TextArea;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class test extends Application {

    Stage window;
    ListView<String> listView;
    TextArea descArea = new TextArea();
    TextArea actionDescArea = new TextArea();
    Label healthLabel = new Label("Health:");
    Label manaLabel = new Label("Mana:");
    Label healthDisplay = new Label("100/100");
    Label manaDisplay = new Label("100/100");
    Button actionBtn = new Button("Action");

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        window = primaryStage;
        window.setTitle("Game");

        GridPane grid = new GridPane();
        grid.setPadding(new Insets(10, 10, 10, 10));
        grid.setVgap(10);
        grid.setHgap(10);

        descArea.setPrefWidth(750);
        descArea.setPrefHeight(550);
        descArea.setWrapText(true);
        descArea.setEditable(false);
        GridPane.setConstraints(descArea, 0, 0, 1, 2);

        GridPane.setConstraints(healthLabel, 1, 0);
        GridPane.setValignment(healthLabel, VPos.TOP);

        GridPane.setConstraints(healthDisplay, 2, 0);
        GridPane.setValignment(healthDisplay, VPos.TOP);

        GridPane.setConstraints(manaLabel, 1, 1);
        GridPane.setValignment(manaLabel, VPos.TOP);

        GridPane.setConstraints(manaDisplay, 2, 1);
        GridPane.setValignment(manaDisplay, VPos.TOP);

        listView = new ListView<>();
        listView.getItems().addAll("Action 1", "Action 2", "Action 3", "Action 4");
        listView.setPrefWidth(260);
        listView.setMaxWidth(260);
        listView.setPrefHeight(150);
        GridPane.setConstraints(listView, 0, 2, 1, 1);

        actionDescArea.setPrefWidth(100);
        actionDescArea.setPrefHeight(150);
        actionDescArea.setMaxWidth(100);
        actionDescArea.setWrapText(true);
        actionDescArea.setEditable(false);
        GridPane.setConstraints(actionDescArea, 0, 2, 2, 1);

        actionBtn.setPrefWidth(260);
        actionBtn.setPrefHeight(60);
        GridPane.setConstraints(actionBtn, 0, 3);

        grid.getChildren().addAll(descArea, healthLabel, healthDisplay, manaLabel, manaDisplay, listView, actionBtn, actionDescArea);

        Scene scene = new Scene(grid, 950, 750);
        window.setScene(scene);
        window.show();
    }

如果有人能指出我正确的方向,那就太好了!

谢谢:)

最佳答案

需要注意的几点:

GridPane.setConstraints(descArea, 0, 0, 1, 2);

此处,TextArea descArea 的 colspan 为 1,columnIndex 为 0。

GridPane.setConstraints(listView, 0, 2, 1, 1);

这里,ListView listView 的 colspan 为 1,columnIndex 为 0。

GridPane.setConstraints(actionDescArea, 0, 2, 2, 1);

此处,TextArea actionDescArea 的 colspan 为 2,columnIndex 为 0。

如果我们想将 actionDescArea 放置在 listView 旁边,它的 columnIndex 应该大于后者。此外,如果我们希望它增长并覆盖 descArea 下面的整个宽度,我们需要将 Hgrow 设置为 Priority.Always 并删除 maxWidth

GridPane.setConstraints(actionDescArea, 1, 2, 1, 1);
GridPane.setHgrow(actionDescArea, Priority.ALWAYS);

此外,由于 listViewactionDescArea 都应位于 descArea 下,因此其 colspan 应为 2。

GridPane.setConstraints(descArea, 0, 0, 2, 2);

解决方案:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.TextArea;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.stage.Stage;

public class Test extends Application {

    Stage window;
    ListView<String> listView;
    TextArea descArea = new TextArea();
    TextArea actionDescArea = new TextArea();
    Label healthLabel = new Label("Health:");
    Label manaLabel = new Label("Mana:");
    Label healthDisplay = new Label("100/100");
    Label manaDisplay = new Label("100/100");
    Button actionBtn = new Button("Action");

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        window = primaryStage;
        window.setTitle("Game");

        GridPane grid = new GridPane();
        grid.setPadding(new Insets(10, 10, 10, 10));
        grid.setVgap(10);
        grid.setHgap(10);

        descArea.setPrefWidth(750);
        descArea.setPrefHeight(550);
        descArea.setWrapText(true);
        descArea.setEditable(false);
        GridPane.setConstraints(descArea, 0, 0, 2, 2);

        GridPane.setConstraints(healthLabel, 2, 0);
        GridPane.setValignment(healthLabel, VPos.TOP);

        GridPane.setConstraints(healthDisplay, 3, 0);
        GridPane.setValignment(healthDisplay, VPos.TOP);

        GridPane.setConstraints(manaLabel, 2, 1);
        GridPane.setValignment(manaLabel, VPos.TOP);

        GridPane.setConstraints(manaDisplay, 3, 1);
        GridPane.setValignment(manaDisplay, VPos.TOP);

        listView = new ListView<>();
        listView.getItems().addAll("Action 1", "Action 2", "Action 3", "Action 4");
        listView.setPrefWidth(260);
        listView.setMaxWidth(260);
        listView.setPrefHeight(150);
        GridPane.setConstraints(listView, 0, 2, 1, 1);

        actionDescArea.setPrefWidth(100);
        actionDescArea.setPrefHeight(150);
        actionDescArea.setWrapText(true);
        actionDescArea.setEditable(false);
        GridPane.setConstraints(actionDescArea, 1, 2, 1, 1);
        GridPane.setHgrow(actionDescArea, Priority.ALWAYS);

        actionBtn.setPrefWidth(260);
        actionBtn.setPrefHeight(60);
        GridPane.setConstraints(actionBtn, 0, 3);

        grid.getChildren().addAll(descArea, healthLabel, healthDisplay, manaLabel, manaDisplay, listView, actionBtn, actionDescArea);

        Scene scene = new Scene(grid, 950, 750);
        window.setScene(scene);
        window.show();
    }
}

输出:

enter image description here

关于JavaFX ListView 被 TextArea 使用 GridPane 覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38833708/

相关文章:

java - ComboBox ChangeListener 在 AutoCompleteDropDown 中被调用 3 次

Java ArrayList如何在开头添加元素

java - 延迟用户访问,直到 webapp 正确初始化

java - 依赖 javafx.util.Callback 安全吗?

events - JavaFx 按钮事件冒泡

JavaFX、FXML 和 Controller : switching scenes, 维护场景数据

java - 如何在JavaFX中制作多级 TreeView ?

java - Grails:验证文件上传

Java存储过程运行缓慢

java - 在 Weblogic 10.3.5/w SOA 服务器上运行 CXF 时出现问题