GridPane中的JavaFX标签未扩展

GridPane中的JavaFX标签未扩展,java,user-interface,javafx,gridpane,Java,User Interface,Javafx,Gridpane,我目前正在制作一个小JavaFX应用程序。 在这个应用程序中,我创建了一个标签,并希望在两个方向上拉伸自己。 标签放在一个网格窗格中,我尝试了所有我知道的方法,包括Double.MAX_VALUE方法,在我看来,这个方法似乎不是很优雅,有时也会以错误的方式工作。下面是我得到的结果: 这是我的代码: package sample; import javafx.application.Application; import javafx.geometry.Insets; import javafx

我目前正在制作一个小JavaFX应用程序。 在这个应用程序中,我创建了一个标签,并希望在两个方向上拉伸自己。 标签放在一个网格窗格中,我尝试了所有我知道的方法,包括Double.MAX_VALUE方法,在我看来,这个方法似乎不是很优雅,有时也会以错误的方式工作。下面是我得到的结果:

这是我的代码:

package sample;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{

        GridPane gp = new GridPane();
        gp.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(3))));

        Label label = new Label("Some text that could be longer");
        label.setFont(new Font(20));
        label.setTextFill(Color.WHITE);
        label.setBackground(new Background(new BackgroundFill(Color.rgb(34, 35, 36), CornerRadii.EMPTY, Insets.EMPTY)));
        label.setBorder(new Border(new BorderStroke(Color.GREEN, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(3))));


        // Commands that don't look like to work
        GridPane.setHgrow(label, Priority.ALWAYS);
        GridPane.setFillWidth(label, true);
        GridPane.setVgrow(label, Priority.ALWAYS);
        GridPane.setFillHeight(label, true);

        ColumnConstraints cc = new ColumnConstraints();
        cc.setFillWidth(true);
        cc.setHgrow(Priority.ALWAYS);
        cc.setPercentWidth(100);

        RowConstraints rc = new RowConstraints();
        rc.setFillHeight(true);
        rc.setVgrow(Priority.ALWAYS);
        rc.setPercentHeight(100);
        // end


        gp.add(label, 0, 0);
        gp.getColumnConstraints().add(cc);
        gp.getRowConstraints().add(rc);


        primaryStage.setScene(new Scene(gp, 800, 300));
        primaryStage.show();
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}
我不知道还能做什么,因为上面的方法都不适合我。在多个示例中,它们甚至一次都不起作用。

默认情况下,标签的maxWidth设置为Region.USE_PREF_SIZE,因此它不能比首选大小更宽。使用将maxWidth设置为无界

label.setMaxWidth(Double.MAX_VALUE);
在其他设置中,您只需将hgrow设置为“始终”,可以使用静态方法或通过列约束执行此操作:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{

        GridPane gp = new GridPane();
        gp.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(3))));

        Label label = new Label("Some text that could be longer");
        label.setFont(new Font(20));
        label.setTextFill(Color.WHITE);
        label.setBackground(new Background(new BackgroundFill(Color.rgb(34, 35, 36), CornerRadii.EMPTY, Insets.EMPTY)));
        label.setBorder(new Border(new BorderStroke(Color.GREEN, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(3))));
        
        label.setMaxWidth(Double.MAX_VALUE);


        GridPane.setHgrow(label, Priority.SOMETIMES);

        // Can use the following instead of the previous line:

        // ColumnConstraints cc = new ColumnConstraints();
        // cc.setHgrow(Priority.ALWAYS);
        // gp.getColumnConstraints().add(cc);


        gp.add(label, 0, 0);

        primaryStage.setScene(new Scene(gp, 800, 300));
        primaryStage.show();
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}

您还必须使标签覆盖多个列。请参阅:void addNode child、int columnIndex、int rowIndex、int colspan、int rowspan from.@Sedrick在示例代码中,只有一列,因此不需要使标签覆盖多个列。大概OP只是想让它水平地填充网格中的单元格。@James_D,谢谢!我没有注意到。如果GridPane只有一行和一列,我建议使用不同的父节点。好的,我理解,这是有意义的。但是为什么我的代码中的命令不能做到这一点呢?两者之间的界线comments@Alex因为网格窗格的标签大小不会超过最大宽度。这就是“最大宽度”的含义。此外,当我将maxHeight或maxWidth设置为父窗格时,它只是被忽略,而具有Double.max_值的子窗格则会被忽略。这是另一个我无法解决的问题,我可以自由地根据孩子们认为合适的大小来安排他们的孩子——pref/max/min只是一些提示。每个人都做了什么,在其java文档中都有明确的解释:@Alex我不明白这是什么意思。父窗格的大小由其父窗格控制,并尝试遵守其最小、首选和最大大小。我建议你重读这本书