当前位置: 首页 > 知识库问答 >
问题:

JavaFX将旋转对象调整为网格窗格单元格

辛承
2023-03-14

在JavaFX中使用setRotate()旋转节点(GridPane)后,我对节点(GridPane)的方向有问题。当我旋转节点并将其放入GridPane的一个单元格中时,我希望旋转后的节点适合单元格内部,并随单元格一起调整大小。我添加了一些示例代码,向您展示我希望得到的结果。

public class MonopolyApp extends Application {
    @Override
    public void start(Stage primaryStage) {
        //Construction of the grid
        GridPane square = new GridPane();
        square.setGridLinesVisible(true);
        final int heightPercent = 14;
        final int widthPercent = 8;

        RowConstraints rowsEdge = new RowConstraints();
        rowsEdge.setPercentHeight(heightPercent);
        RowConstraints rowsMid = new RowConstraints();
        rowsMid.setPercentHeight(widthPercent);
        ColumnConstraints colEdge = new ColumnConstraints();
        colEdge.setPercentWidth(heightPercent);
        ColumnConstraints colMid = new ColumnConstraints();
        colMid.setPercentWidth(widthPercent);

        square.getColumnConstraints().addAll(colEdge, colMid,
                colMid, colMid, colMid, colMid, colMid, colMid, colMid, colMid, colEdge);
        square.getRowConstraints().addAll(rowsEdge, rowsMid,
                rowsMid,rowsMid,rowsMid,rowsMid,rowsMid,rowsMid, rowsMid,rowsMid, rowsEdge);

        GridPane wrongSuare = makeMonopolySquare();
        square.add(wrongSuare, 0, 4);
        wrongSuare.setRotate(90);

        GridPane rightSquare = makeMonopolySquare();
        square.add(rightSquare, 1, 10);

        Scene s = new Scene(square);
        primaryStage.setHeight(500);
        primaryStage.setWidth(500);
        primaryStage.setScene(s);
        primaryStage.show();

    }

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

    private GridPane makeMonopolySquare(){
        GridPane monopolySquare = new GridPane();


        RowConstraints top = new RowConstraints();
        top.setPercentHeight(20);

        RowConstraints bottom = new RowConstraints();
        bottom.setPercentHeight(80);

        ColumnConstraints  c = new ColumnConstraints();
        c.setPercentWidth(100);

        monopolySquare.getRowConstraints().addAll(top,bottom);
        monopolySquare.getColumnConstraints().addAll(c);
        bottom.setValignment(VPos.CENTER);

        monopolySquare.setGridLinesVisible(true);

        Label name = new Label("name");
        Pane colorPane = new Pane();
        colorPane.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
        colorPane.setBackground(new Background( new BackgroundFill(Color.BLUE, null, null)));
        GridPane.setMargin(colorPane, new Insets(1));

        monopolySquare.add(colorPane,0,0);
        monopolySquare.add(name, 0, 1);

        return monopolySquare;
    }
}

如果您运行代码,您将看到stage底部的GridPane非常适合它的单元格。但旋转后的网格窗格没有。我还将添加一张图片,向您展示我的问题:

有人知道如何解决这个问题吗?我知道我可以把它放在一个组中,但把它放在一个组中的问题是,该组不会调整到GridPane的单元格大小。

共有1个答案

史旺
2023-03-14

嗯,这是一个困难的问题。没有想到最佳的解决方案,但如果我处在你的位置,我会尽量保持在布局的限制范围内(而不是使用像旋转这样的低级操作)。

例如,为每行/每列构建不同的布局单元:

private static Node makeMonopolySquare( final Layout layout )
  {
    final GridPane monopolySquare = new GridPane();
    monopolySquare.setGridLinesVisible( true );
    final Label label = new Label( "name" );
    final StackPane name = new StackPane( label );
    final Pane colorPane = new Pane();
    GridPane.setMargin( colorPane, new Insets( 1 ) );
    colorPane.setMaxSize( Double.MAX_VALUE, Double.MAX_VALUE );
    colorPane.setBackground( new Background( new BackgroundFill( Color.BLUE, null, null ) ) );
    final RowConstraints top = new RowConstraints();
    final RowConstraints bottom = new RowConstraints();
    //    bottom.setValignment( VPos.CENTER );
    //    top.setValignment( VPos.CENTER );
    final ColumnConstraints c = new ColumnConstraints();
    c.setPercentWidth( 100 );
    final ColumnConstraints right = new ColumnConstraints();
    //    right.setHalignment( HPos.CENTER );
    final ColumnConstraints left = new ColumnConstraints();
    //    left.setHalignment( HPos.CENTER );
    final RowConstraints r = new RowConstraints();
    r.setPercentHeight( 100 );

    switch ( layout )
    {
      case BOTTOM:
        top.setPercentHeight( 20 );
        bottom.setPercentHeight( 80 );

        monopolySquare.getRowConstraints().addAll( top, bottom );
        monopolySquare.getColumnConstraints().addAll( c );

        monopolySquare.add( colorPane, 0, 0 );
        monopolySquare.add( name, 0, 1 );
        break;
      case LEFT:
        right.setPercentWidth( 20 );
        left.setPercentWidth( 80 );

        monopolySquare.getColumnConstraints().addAll( left, right );
        monopolySquare.getRowConstraints().addAll( r );

        monopolySquare.add( name, 0, 0 );
        monopolySquare.add( colorPane, 1, 0 );
        break;
      case RIGHT:
        right.setPercentWidth( 80 );
        left.setPercentWidth( 20 );

        monopolySquare.getColumnConstraints().addAll( left, right );
        monopolySquare.getRowConstraints().addAll( r );

        monopolySquare.add( colorPane, 0, 0 );
        monopolySquare.add( name, 1, 0 );
        break;
      case TOP:
        top.setPercentHeight( 80 );
        bottom.setPercentHeight( 20 );

        monopolySquare.getRowConstraints().addAll( top, bottom );
        monopolySquare.getColumnConstraints().addAll( c );
        bottom.setValignment( VPos.CENTER );

        monopolySquare.add( colorPane, 0, 1 );
        monopolySquare.add( name, 0, 0 );
        break;
    }

然而,这不会改变标签(我认为这对于数字垄断委员会来说是更好的)。只要旋转标签,就会遇到与单元格相同的问题,只是更小。

完整的代码示例。

 类似资料:
  • 我有一个小问题。我试图用JavaFX2.0创建一个好的GUI(可以调整大小),但我有一个小问题。我使用的是网格窗格,但当我在其中放置多个按钮时,当我将屏幕大小调整为较小尺寸时,按钮将以屏幕左侧的大小相互滑动。我可以为单元格或其他东西设置最小大小吗?我正在使用FXML进行设计。非常感谢你!

  • 我目前有一个GridPane作为布局的根,我有另一个GridPane里面包含2个标签。我试图让这些标签中的一个左对齐,另一个右对齐。 我尝试使用GridPane.halignment="右",但这对标签没有影响。 我的布局代码如下: 如何按照我想要的方式对齐这些标签?GridPane对我想做的事情来说是理想的吗?我对JavaFX相当缺乏经验,但对Android的布局管理器很熟悉。

  • 我无法在SceneBuilder(eclipse)中使用GridPane,当我尝试在项目中插入GridPane时,SceneBuilder会在没有提示任何消息的情况下退出。 这就是我在日志文件中找到的:

  • 我正在尝试构建一个包含6个窗格(作为父级添加到GridPane布局中)的简单Java项目。我必须在开始时设置窗口大小,并通过参考根布局的宽度和高度,设法将它们均匀地拆分。 但我想要他们调整大小,因为我改变了窗口的大小(使用鼠标,现在他们得到固定的大小)。 下面是我的代码:

  • 问题内容: 我创建了一个UICollectionView,以便可以将视图排列成整齐的列。我希望在宽度大于500像素的设备上有一列。 为了实现这一点,我创建了以下功能: 这在第一次加载时可以按预期工作,但是当我旋转设备时,计算并不总是再次发生,并且视图也不一定总是按预期重绘。这是设备旋转时的代码: 我假设我忘记重画了一些东西,但是我不确定是什么。非常感谢任何想法! 问题答案: 您可以使用。这个问题应

  • 我的任务是在全屏模式下创建可调整大小的图形。当用户改变程序的窗口(默认为全屏)时,图形必须是可调整大小的(图形的组件和线条改变它们的大小)。我实现了带有:元素(即s)的图形,这些元素位于定义的坐标中。然后,在方法的帮助下生成这些行。下面是Graph的scema: 一切都很好,但问题是我不能调整我的图形大小。所有组件都保持其尺寸;变量、、不进行大小调整。我尝试使用params等,但它们不调整大小,只