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

JavaFX-如何使用ColumnConstraints的缩放宽度和静态宽度将GridPane填充整个HBox?

贾骏
2023-03-14

我有问题填充我的整个自定义HBox与一个网格窗格,是动态创建的。HBox存在于ListView中,并且已经随ListView动态缩放,没有任何问题。问题是,我希望我的GridPane中的一些东西在用鼠标扩展窗口大小时可以缩放,但有些部分需要保持相同的大小。

有两个按钮和一个填充标签需要保持相同的大小,这不是一个问题。我的模拟类总结了我正在做的事情:

控制器:

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import static javafx.scene.layout.Region.USE_PREF_SIZE;


public class FXMLDocumentController implements Initializable {

private Label label;
@FXML
private ListView<ConversionJob> listJobs;
@FXML
private Button btnAction;

@FXML
private void handleButtonAction(ActionEvent event) {
    // Generates a new ConversionJob in the ListView.
listJobs.getItems().add(new ConversionJob());

}

@Override
public void initialize(URL url, ResourceBundle rb) {
    // EMPTY
}

public class ConversionJob extends HBox {

    public ConversionJob() {
        super();

        // Creates all elements
        Label lblConversionName = new Label();
        ProgressBar progress = new ProgressBar();
        Button btnPause = new Button();
        Button btnCancel = new Button();
        GridPane grid = new GridPane();

        setGridInfo(grid, lblConversionName, progress, btnPause, btnCancel);

        this.getChildren().addAll(grid);
    }

    private void setGridInfo(GridPane grid, Label lblConversionName, ProgressBar progress, Button btnPause, Button btnCancel) {
        this.setHgrow(grid, Priority.ALWAYS);

    Label filler = new Label();
    filler.setText("  ");

    grid.addColumn(0, filler);
    grid.add(lblConversionName, 1, 0);
    grid.add(progress, 2, 0);
    grid.add(btnPause, 3, 0);
    grid.add(btnCancel, 4, 0);
    grid.setGridLinesVisible(true);


    grid.setMaxWidth(this.getMaxWidth());

    ColumnConstraints col1 = new ColumnConstraints();
    col1.setMinWidth(USE_PREF_SIZE);

    ColumnConstraints col2 = new ColumnConstraints();
    col2.setPercentWidth(40);

    ColumnConstraints col3 = new ColumnConstraints();
    col3.setPercentWidth(40);

    ColumnConstraints col4 = new ColumnConstraints();
    col4.setMinWidth(USE_PREF_SIZE);
    col4.setMaxWidth(USE_PREF_SIZE);

    ColumnConstraints col5 = new ColumnConstraints();
    col5.setMinWidth(USE_PREF_SIZE);
    col5.setMaxWidth(USE_PREF_SIZE);

    grid.getColumnConstraints().addAll(col1, col2, col3, col4, col5);
    }
}
}

FXML文档:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane id="AnchorPane" prefHeight="500.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="testieclass.FXMLDocumentController">
   <children>
      <ListView fx:id="listJobs" layoutX="54.0" prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="40.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
      <Button fx:id="btnAction" layoutX="53.0" layoutY="160.0" mnemonicParsing="false" onAction="#handleButtonAction" text="Button" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="460.0" />
   </children>
</AnchorPane>
  • 填充第一列中的标签,该标签在增大窗口大小时不会缩放,并且具有文本“”。
  • 第二列中的标签,该标签随窗口大小而增大。
  • 第三列中的进度条,也可根据窗口大小缩放。
  • 最后2列中完全不缩放的两个按钮,就像第一个填充标签一样。最后一个按钮需要锚定在最右边,以便GridPane填充整个HBox。

更改col.setPercentageWidth(RandomNumber)中的数字感觉完全是随机的,因为有时它在我的HBox中完全脱离屏幕,有时它根本不缩放百分比。有人知道怎么解决我的问题吗?

共有1个答案

沈枫涟
2023-03-14

由于两个可调整大小的列应该增长到相同的大小,您可以简单地使用hgrow属性,并将priority.neverpriority.always分别分配给不应该调整大小的列和应该调整大小的列:

GridPane grid = new GridPane();

ColumnConstraints neverGrow = new ColumnConstraints();
neverGrow.setHgrow(Priority.NEVER);

ColumnConstraints alwaysGrow = new ColumnConstraints();
alwaysGrow.setHgrow(Priority.ALWAYS);

grid.getColumnConstraints().addAll(
        neverGrow,
        alwaysGrow,
        alwaysGrow,
        neverGrow,
        neverGrow);

// just use the most basic resizable nodes to demonstrate this
Region region1 = new Region();
region1.setStyle("-fx-background-color: red;");
region1.setMinHeight(50);
Region region2 = new Region();
region2.setStyle("-fx-background-color: blue;");
region2.setMinHeight(50);

// fill the first row with some nodes
grid.addRow(0,
        new Label("Some Text:"),
        region1,
        region2,
        new Button("Click me"),
        new Button("me too"));
 类似资料:
  • 我试图弄清楚如何最大化中的节点的宽度和高度。我想要打包到中的主要原因是,我想要包含一个从我的到并返回的。要做到这一点,我需要一个虚拟节点,它将被来回移动,并且该节点必须具有绝对定位。 根据这个SO问题,例如,我需要使用一个,我试图在下面的MWE中实现这个组。 我想基本上避免通过硬编码设置的首选大小。我知道将splitpane的WidthProperty/HeightProperty绑定到根也是可能

  • 我有一个用SceneBuilder生成的TableView,所有列都是从其他视图导入的FXML,直到没有问题为止,但列没有填充宽度。 我试图用scene builder和FXML来解决这个问题,但没有运气,所有的大小都是计算出来的。 我尝试用一个change listener对其进行编码,它在每次窗口改变大小以适应列的大小时都会进行检查。 这样可以工作,并且列的大小调整到适当的宽度(基本上我得到了

  • 问题内容: 如何使div填充剩余宽度? 我如何才能填满其余部分? 问题答案: 试试这样的事情: div自然会占用其容器的100%宽度,因此无需显式设置此宽度。通过添加与两侧div相同的左/右页边距,它自己的内容被强制置于它们之间。 请注意,“中间格”云 后 的HTML“正确的div”

  • 我首先创建了一个全宽的动画边框渐变,然后我想像在Adobe XD上所做的那样创建两个相邻的大容器,但是我不能增加容器的宽度。 我已经截图了一些: Adobe XD参考 集装箱问题Pic 谢谢. 代码如下: home.jsx home.css null null

  • 我的图像滑块不是我想要的方式。 除非我的浏览器窗口很小,否则图像不会填满容器的整个宽度。当我的窗口较大时,图像的右侧有一个空白,而不是图像填满整个宽度。 这是我的代码: 和CSS:

  • 问题内容: 我有这个标题栏。 我需要searchBar来填补div中剩余的空白。我该怎么做? 这是我的CSS 问题答案: 您可以使用CSS表格单元格实现此布局。 稍微修改您的HTML,如下所示: 只需删除两个元素周围的wrapper 元素即可。 应用以下CSS: 适用于并给它100%的宽度。 对于,,,适用。 对于,将宽度设置为90%,这将迫使所有其他元素计算出缩小以适合的宽度,搜索栏将展开以填充