将阶段划分为2个网格窗格JavaFX

时间:2017-10-10 19:14:04

标签: java javafx grid

因此,我尝试在左侧显示文本,在右侧显示按钮,文本应具有恒定大小,按钮应调整大小以填充窗口的其余部分。

到目前为止,这是我的结果:

so far...

我不希望我的文字超过按钮,我希望他们分享整个窗口。

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;


public class Main extends Application {

    GridPane buttons = new GridPane();
    GridPane textGrid = new GridPane();
    @Override
    public void start(Stage primaryStage) {

       StackPane root = new StackPane();
       Button button1 = new Button();
       Button button2 = new Button();
       Button button3 = new Button();
       Button button4 = new Button();
       Button button5 = new Button();

       button1.setText("Button1");
       button2.setText("Button4");
       button3.setText("Button3");
       button4.setText("Button4");
       button5.setText("Button5");


       TextArea text1 = new TextArea();
       text1.setText("Test");
       text1.setPrefSize(100, 100);

       button1.prefWidthProperty().bind(buttons.widthProperty());
       button2.prefWidthProperty().bind(buttons.widthProperty());
       button3.prefWidthProperty().bind(buttons.widthProperty());
       button4.prefWidthProperty().bind(buttons.widthProperty());
       button5.prefWidthProperty().bind(buttons.widthProperty());

       button1.prefHeightProperty().bind(buttons.heightProperty());
       button2.prefHeightProperty().bind(buttons.heightProperty());
       button3.prefHeightProperty().bind(buttons.heightProperty());
       button4.prefHeightProperty().bind(buttons.heightProperty());
       button5.prefHeightProperty().bind(buttons.heightProperty());


       buttons.addColumn(0, button1, button2, button3, button4, button5);

       textGrid.addColumn(0, text1);


        Scene scene = new Scene(root, 280, 180);

        root.getChildren().addAll(buttons, textGrid);

        buttons.setAlignment(Pos.TOP_RIGHT);
        textGrid.setAlignment(Pos.TOP_LEFT); 

        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

}

1 个答案:

答案 0 :(得分:4)

通常最好让布局窗格处理布局管理,而不是尝试通过绑定来管理布局。

以下是一个示例:

layout

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

import java.util.stream.IntStream;

public class Main extends Application {

    private static final int N_BUTTONS = 5;

    @Override
    public void start(Stage stage) {
        VBox buttonLayout = new VBox(
                10,
                IntStream.range(0, N_BUTTONS)
                        .mapToObj(this::createButton)
                        .toArray(Button[]::new)
        );
        HBox.setHgrow(buttonLayout, Priority.ALWAYS);

        TextArea textArea = new TextArea("Test");
        textArea.setPrefWidth(100);
        textArea.setMaxWidth(TextArea.USE_PREF_SIZE);
        textArea.setMinWidth(TextArea.USE_PREF_SIZE);

        HBox layout = new HBox(10, textArea, buttonLayout);
        layout.setPadding(new Insets(10));

        Scene scene = new Scene(layout);

        stage.setScene(scene);
        stage.show();
    }

    private Button createButton(int i) {
        Button button = new Button("Button " + i);
//        button.setMaxWidth(Double.MAX_VALUE);
        button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
        VBox.setVgrow(button, Priority.ALWAYS);

        return button;
    }

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

根据样本,我会指出以下几点:

  1. 由于按钮非常相似,因此在循环中创建按钮而不是在代码中单独创建按钮。我使用带有地图和IntStream的{​​{1}}范围,但您可以使用标准for循环执行相同的操作(可能更容易理解)。
  2. 使用标准布局窗格的组合来实现布局。例如,按钮是垂直间隔的,所以将它们放在VBox中,文本和按钮是相互水平的,所以使用HBox。
  3. 使用布局上的约束来按摩它们以执行您喜欢的布局,例如,toArray告诉Box总是将Box中的任何额外空间分配给buttonLayout,以便按钮将填充任何剩余的区域。
  4. 在各个节点上设置约束,以便按照您的意愿调整大小,例如,下面的代码为textArea建立了一个固定的宽度,不会发生变化(如果您愿意,可以使用类似的代码来建立固定的高度) :

    HBox.setHgrow(buttonLayout, Priority.ALWAYS);
  5. 某些控件会自动扩展超出其最大尺寸,默认情况下按钮不会启用此行为使用以下代码(如果您只想扩展宽度而不是高度,那么您只需设置maxWidth而不是maxSize:

    textArea.setPrefWidth(100);
    textArea.setMaxWidth(TextArea.USE_PREF_SIZE);
    textArea.setMinWidth(TextArea.USE_PREF_SIZE);
    
  6. 而不是像在此示例中那样在代码中定义布局,而是使用SceneBuilder等工具以可视方式创建场景并将布局保存为FXML file,以便布局为与代码分开(类似地将任何样式放在外部CSS文件中)。