我已经尝试了所有组合并查看了所有文档,但是我不知道如何使用GridBagLayout。

我在JPanel中有3个组件,其中GridBagLayout是JPanel的LayoutManager,并且在这3个组件上使用GridBagConstraints。

使用当前代码(如下所示),这三个元素将正确显示在面板上。问题是第一个组件是JLabel,有时会很长,如果是这种情况,它将扩展并缩小其他两个组件。

我的目标是创建一个具有1行4列GridBagLayout的JPanel,其中第一个元素占据前2列,其他2个元素占据其余2列,并且这些元素不会扩展到它们的外面列。

private static void setConstraints(GridBagConstraints constraints, int gridx, int gridy, int weightx, Insets insets) {
    constraints.gridx = gridx;
    constraints.weightx = weightx;
    constraints.insets = insets;
}

gridBagLayout = new GridBagLayout();
constraints = new GridBagConstraints();
centerPanel = new JPanel(gridBagLayout);

constraints.fill = GridBagConstraints.HORIZONTAL;
fileNameLabel = new JLabel("Resolving: '" + EngineHelpers.trimStringToFitPanel(urlTextField.getText(), 70) + "'");
setConstraints(constraints, 0, 0, 2, new Insets(0, 5, 5, 0));
gridBagLayout.setConstraints(fileNameLabel, constraints);
progressBar = new JProgressBar();
progressBar.setStringPainted(true);
setConstraints(constraints, 1, 0, 1, new Insets(0, 5, 5, 0));
gridBagLayout.setConstraints(progressBar, constraints);
cancelDownloadButton = new JButton("Cancel");
setConstraints(constraints, 2, 0, 1, new Insets(0, 0, 0, 0));
gridBagLayout.setConstraints(cancelDownloadButton, constraints);

centerPanel.add(fileNameLabel);
centerPanel.add(progressBar);
centerPanel.add(cancelDownloadButton);


在此先感谢大家,对这个愚蠢的问题表示抱歉!

最佳答案

您可能希望按钮和进度条的weightx都设置为0。对于标签,将权重设置为1。这将使按钮和进度条完全不会膨胀,并让进度条占用所有多余的空间。

还将进度栏约束上的gridwidth设置为2,因此它实际上使用2列。

最后,根据centerPanel的放置位置,它可能不会实际展开以填充容器。如果将centerPanel通过BorderLayout放置在父对象中,则应将其展开。为确保这一点,您可以添加带有centerPanel.setBorder(BorderFactory.createLineBorder(Color.RED))的边框以进行调试。这在按钮,标签和进度条上也很有用。

关于java - GridBagLayout协助,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12987929/

10-11 06:14