javafx 中是否有包装的网格布局?
is there a grid layout in javafx that wraps?
我正在尝试寻找我的问题的答案,但我什至不确定要 google 什么才能找到答案 - 所以我在 Whosebug 上。
在我的应用程序中,我使用 java 1.8 和 javafx 作为 GUI。我想在舞台上添加 N 个复选框,每个复选框上都有一个标签。标签的长度可以是任意数量的字符。复选框将在我的应用程序运行时由用户添加。我想在每一行上允许超过 1 个复选框。所以基本上我想要一个 table 或网格布局,以便所有复选框都在网格中对齐。它应该填满第一行,一旦所有水平 space 都被占用,它应该开始一个新行。
现在假设第一行有 8 个复选框,然后第二行开始填充。如果第 2 行的标签很长,第二行可能只有 6 个复选框。我不能在第一行有 8 列,在第二行有 6 列,并且仍然对齐所有内容。所以现在我必须将网格中的列数更改为 6(将 2 个复选框从第一行移动到第二行)并重新布局所有内容。
是否有处理此问题的任何布局或控件?仅供参考 - 我不想允许水平滚动条。
使用 TilePane 应该可以满足您的需求。 TilePane 的实现保证每行(最后一行除外)的 tiles 数量相同。
这是一个显示行为的简单示例:
package application;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.TilePane;
import javafx.scene.layout.VBox;
public class Main extends Application {
private String alphabet = "abcdefghijklmnopqrstuvwxyz";
private Label lastLabel = new Label("");
@Override
public void start(Stage primaryStage) {
try {
VBox root = new VBox();
Button btnAdd = new Button("Add label");
final TilePane tilePane = new TilePane();
btnAdd.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
Label lbl = new Label(lastLabel.getText()
+ alphabet.charAt(lastLabel.getText().length()));
tilePane.getChildren().add(lbl);
lastLabel = lbl;
}
});
root.getChildren().add(btnAdd);
root.getChildren().add(tilePane);
Scene scene = new Scene(root, 400, 400);
scene.getStylesheets().add(
getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
您必须知道,如果复选框包含很长的文本(相对于您的 windows 宽度),它可能会显着减少 TilePane 的列数!
此外,最好将 TilePane 包装到 ScrollPane 中(仅允许垂直滚动条)以避免在 TilePane 的宽度变小时无法访问元素。
我正在尝试寻找我的问题的答案,但我什至不确定要 google 什么才能找到答案 - 所以我在 Whosebug 上。
在我的应用程序中,我使用 java 1.8 和 javafx 作为 GUI。我想在舞台上添加 N 个复选框,每个复选框上都有一个标签。标签的长度可以是任意数量的字符。复选框将在我的应用程序运行时由用户添加。我想在每一行上允许超过 1 个复选框。所以基本上我想要一个 table 或网格布局,以便所有复选框都在网格中对齐。它应该填满第一行,一旦所有水平 space 都被占用,它应该开始一个新行。
现在假设第一行有 8 个复选框,然后第二行开始填充。如果第 2 行的标签很长,第二行可能只有 6 个复选框。我不能在第一行有 8 列,在第二行有 6 列,并且仍然对齐所有内容。所以现在我必须将网格中的列数更改为 6(将 2 个复选框从第一行移动到第二行)并重新布局所有内容。
是否有处理此问题的任何布局或控件?仅供参考 - 我不想允许水平滚动条。
使用 TilePane 应该可以满足您的需求。 TilePane 的实现保证每行(最后一行除外)的 tiles 数量相同。
这是一个显示行为的简单示例:
package application;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.TilePane;
import javafx.scene.layout.VBox;
public class Main extends Application {
private String alphabet = "abcdefghijklmnopqrstuvwxyz";
private Label lastLabel = new Label("");
@Override
public void start(Stage primaryStage) {
try {
VBox root = new VBox();
Button btnAdd = new Button("Add label");
final TilePane tilePane = new TilePane();
btnAdd.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
Label lbl = new Label(lastLabel.getText()
+ alphabet.charAt(lastLabel.getText().length()));
tilePane.getChildren().add(lbl);
lastLabel = lbl;
}
});
root.getChildren().add(btnAdd);
root.getChildren().add(tilePane);
Scene scene = new Scene(root, 400, 400);
scene.getStylesheets().add(
getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
您必须知道,如果复选框包含很长的文本(相对于您的 windows 宽度),它可能会显着减少 TilePane 的列数!
此外,最好将 TilePane 包装到 ScrollPane 中(仅允许垂直滚动条)以避免在 TilePane 的宽度变小时无法访问元素。