将一堆 Button 添加到 ScrollPane 的最佳方法是什么?
What's the best way to add a bunch of Button to a ScrollPane?
我是 JavaFx 的新手,对于我的应用程序,我需要在屏幕的一部分上设置一组不确定的按钮。因为在程序启动之前我不知道我需要多少个按钮,所以我想在屏幕的这一部分设置一个 ScrollPane,然后动态添加一堆 HBox 包含按钮(我使用 List<> 按钮和 List<> HBox,所以我可以为每 8 个按钮创建一个新的 HBox。
我的想法是使用 ScrollPane 在包含按钮的不同 HBox 之间滚动,所以我不需要总是显示所有按钮。问题是,你似乎不能直接将一堆HBox添加到ScrollPane。无论如何执行此操作?我的代码将是这样的:
public void startApp(int nDetect){
this.primaryStage = new Stage();
this.nDetect = nDetect;
BorderPane bp = new BorderPane();
Group root = new Group();
.
.
.
LinkedList<Button> buttons = new LinkedList<>();
LinkedList<HBox> boxes = new LinkedList<>();
for(int i=0; i<this.nDetect; i++) {
if(i%8 == 0){
boxes.add(new HBox());
boxes.get(i/8).setSpacing(5);
}
boxes.get(i/8).getChildren().add(buttons.get(i)) //add the button to the appropriate HBox
}
ScrollPane spane = new ScrollPane();
for( HBox h : boxes){
//add every element in "boxes" to the ScrollPane
}
bp.setTop(spane);
root.getChildren().add(bp);
}
一个 ScrollPane
包裹另一个 Node
。只需制作一个 HBox
(或 VBox
),将其设置为滚动窗格的内容并将所有 Button
添加到框中。该框将自动缩放,滚动窗格将保持相同大小,但随着内容超出其范围,会自动绘制水平 and/or 垂直滑块。
听起来您希望将按钮布置在滚动窗格内的网格内。
合适的布局是 GridPane
。
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class ButtonLinesInScrollPane extends Application {
private static final double BUTTONS_PER_LINE = 8;
private static final double NUM_BUTTON_LINES = 8;
private static final double BUTTON_PADDING = 5;
@Override
public void start(Stage stage) {
GridPane grid = new GridPane();
grid.setPadding(new Insets(BUTTON_PADDING));
grid.setHgap(BUTTON_PADDING);
grid.setVgap(BUTTON_PADDING);
for (int r = 0; r < NUM_BUTTON_LINES; r++) {
for (int c = 0; c < BUTTONS_PER_LINE; c++) {
Button button = new Button(r + ":" + c);
grid.add(button, c, r);
}
}
ScrollPane scrollPane = new ScrollPane(grid);
stage.setScene(new Scene(scrollPane));
stage.show();
}
public static void main(String[] args) { launch(args); }
}
我是 JavaFx 的新手,对于我的应用程序,我需要在屏幕的一部分上设置一组不确定的按钮。因为在程序启动之前我不知道我需要多少个按钮,所以我想在屏幕的这一部分设置一个 ScrollPane,然后动态添加一堆 HBox 包含按钮(我使用 List<> 按钮和 List<> HBox,所以我可以为每 8 个按钮创建一个新的 HBox。
我的想法是使用 ScrollPane 在包含按钮的不同 HBox 之间滚动,所以我不需要总是显示所有按钮。问题是,你似乎不能直接将一堆HBox添加到ScrollPane。无论如何执行此操作?我的代码将是这样的:
public void startApp(int nDetect){
this.primaryStage = new Stage();
this.nDetect = nDetect;
BorderPane bp = new BorderPane();
Group root = new Group();
.
.
.
LinkedList<Button> buttons = new LinkedList<>();
LinkedList<HBox> boxes = new LinkedList<>();
for(int i=0; i<this.nDetect; i++) {
if(i%8 == 0){
boxes.add(new HBox());
boxes.get(i/8).setSpacing(5);
}
boxes.get(i/8).getChildren().add(buttons.get(i)) //add the button to the appropriate HBox
}
ScrollPane spane = new ScrollPane();
for( HBox h : boxes){
//add every element in "boxes" to the ScrollPane
}
bp.setTop(spane);
root.getChildren().add(bp);
}
一个 ScrollPane
包裹另一个 Node
。只需制作一个 HBox
(或 VBox
),将其设置为滚动窗格的内容并将所有 Button
添加到框中。该框将自动缩放,滚动窗格将保持相同大小,但随着内容超出其范围,会自动绘制水平 and/or 垂直滑块。
听起来您希望将按钮布置在滚动窗格内的网格内。
合适的布局是 GridPane
。
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class ButtonLinesInScrollPane extends Application {
private static final double BUTTONS_PER_LINE = 8;
private static final double NUM_BUTTON_LINES = 8;
private static final double BUTTON_PADDING = 5;
@Override
public void start(Stage stage) {
GridPane grid = new GridPane();
grid.setPadding(new Insets(BUTTON_PADDING));
grid.setHgap(BUTTON_PADDING);
grid.setVgap(BUTTON_PADDING);
for (int r = 0; r < NUM_BUTTON_LINES; r++) {
for (int c = 0; c < BUTTONS_PER_LINE; c++) {
Button button = new Button(r + ":" + c);
grid.add(button, c, r);
}
}
ScrollPane scrollPane = new ScrollPane(grid);
stage.setScene(new Scene(scrollPane));
stage.show();
}
public static void main(String[] args) { launch(args); }
}