【问题标题】:Resizable Buttons in 4*6 GridPane4*6 GridPane 中可调整大小的按钮
【发布时间】:2022-01-25 17:55:09
【问题描述】:

我的目标是在 JavaFX 中构建一个有 24 个按钮的窗口,这样:

  • 按钮应放置在 4x6 网格中(即 4 列 6 行)
  • 以允许网格填充整个窗口的方式编辑网格和按钮(即使在调整大小时)

我现在遇到的问题是关于按钮大小,我可以使用 setMinHeight 和 setMaxHeight 来增加按钮大小,但是如果窗口大小发生变化,它不会响应。

我的代码-

   private Button getSOSButton(){
    //create button

    Button b = new Button();
     b.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE)
    return b;
};

我在循环内尝试了 b.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE) 但它不起作用。

    int i=0;
    int j=0;
    GridPane gridPane = new GridPane();
    for(i=0;i<6;i++) {
        for (j = 0; j < 4; j++) {
            gridPane.add(getSOSButton(), i, j, 1, 1);
        }
    }
    gridPane.setPadding(new Insets(25,0,0,0));
    gridPane.setAlignment(Pos.CENTER);

        

    StackPane layout = new StackPane();
    layout.getChildren().addAll(hbox,gridPane);
    Scene scene = new Scene(layout, 600, 800);
    stage.setScene(scene);
    stage.show();

这是我的预期输出 -

这是我的代码结果 -

【问题讨论】:

  • 创建并发布minimal reproducible example
  • 如果您期望按钮会增长,为什么要设置它们的最大宽度和高度?
  • 好吧,起初我尝试在 for 循环和 getSOSButton() 内部使用 b.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE) 但是该函数没有响应。然后我用 Max Min 来检查它是否工作(这个函数工作)
  • @James_D 现在我编辑了那部分
  • tips for resizing button layouts 包括指向resizable button grid 的链接,他们可能会教你一些东西,但可能并不能完全解决你的问题。

标签: java javafx gridpane


【解决方案1】:

我修改了检查here 的第二个示例以使按钮变大;调整舞台大小以查看效果。注意到GridPane 可选布局约束,我允许每个Button 始终在其网格单元的中心任意增长。

button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
…
GridPane.setHalignment(gb, HPos.CENTER);
GridPane.setHgrow(gb, Priority.ALWAYS);
GridPane.setValignment(gb, VPos.CENTER);
GridPane.setVgrow(gb, Priority.ALWAYS);

import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.stage.Stage;

/** @see https://stackoverflow.com/a/69429741/230513 */
public class GridButtonTest extends Application {

    private static final int N = 5;
    private final List<List<Button>> list = new ArrayList<>();

    private Button getGridButton(int r, int c) {
        return list.get(r).get(c);
    }

    private Button createGridButton(int row, int col) {
        Button button = new Button("r" + row + ",c" + col);
        button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
        button.setOnAction((ActionEvent event) -> {
            System.out.println(event.getSource() == getGridButton(row, col));
        });
        return button;
    }

    @Override
    public void start(Stage stage) {
        stage.setTitle("GridButtonTest");
        GridPane root = new GridPane();
        for (int row = 0; row < N - 1; row++) {
            list.add(new ArrayList<>());
            for (int col = 0; col < N + 1; col++) {
                Button gb = createGridButton(row, col);
                list.get(row).add(gb);
                root.add(gb, row, col);
                //GridPane.setMargin(gb, new Insets(N));
                GridPane.setHalignment(gb, HPos.CENTER);
                GridPane.setHgrow(gb, Priority.ALWAYS);
                GridPane.setValignment(gb, VPos.CENTER);
                GridPane.setVgrow(gb, Priority.ALWAYS);
            }
        }
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    }

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

【讨论】:

  • 我使用 Hbox 并设置 Hgrow 来创建顶部边框三个按钮和一个标签(作弊、遗憾、“Advent Calculator 0.1 Alpha”和关于)final HBox hbox = new HBox( new Button ("Cheat"), new Button("Regret"), leftSpacer, new Label("Advent Calendar 0.1 Alpha"), rightSpacer, new Button("About") ); 现在如果我想添加事件作弊按钮上的处理程序我怎么称呼它?注意:请看我在这篇文章中添加的截图
  • 我不确定您为什么不能添加事件处理程序。通常,我建议您在edit 您的问题中包含一个minimal reproducible example,以显示您修改后的方法,但这似乎是一个与按钮布局问题无关的设计问题。如果您提出新问题,请不要犹豫使用/引用此示例。
猜你喜欢
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多