5

在此处输入图像描述

我正在使用 GridBagLayout 制作一个如图所示的 StatusBar。我有 4 个区域,所以我在第一个有一个按钮,然后在第二个有信息消息,然后我想要两个(我还有第五个来制作角落)。

按钮区域非常适合,因为内容始终是具有相同宽度的按钮。与角落区域相同。信息区域必须获得所有可用空间。第 3 和第 4 区域必须具有固定值,与屏幕尺寸无关。

我怎样才能做到这一点?

我目前的代码是:

public MyStatusBar() {
        setLayout(new GridBagLayout());
        setPreferredSize(new Dimension(getWidth(), 23));
        GridBagConstraints c = new GridBagConstraints();

        botonDispositivo = new JButton("");
        this.setText(0, "Disconnected");
        URL imageUrl = getClass().getResource("resources/22x22/dispositivo01.png");
        this.setButtonImg(imageUrl);
        this.setButtonEnabled(false);


        c.gridx = 0;
        c.gridy = 0;
        c.fill = GridBagConstraints.BOTH;
        c.anchor = GridBagConstraints.WEST;
        c.gridwidth = 1;
        c.gridheight = 1;
        this.add(botonDispositivo, c);

        c.insets= new Insets(0,10,0,0);
        c.gridx ++;
        c.gridy = 0;
        c.weightx = 0.7;
        c.fill = GridBagConstraints.HORIZONTAL;
        msgLabel = new JLabel("");
        msgLabel.setPreferredSize(new Dimension(500, msgLabel.getHeight()));
        this.add(msgLabel, c);
        this.setText(1, "Waiting for potentiostat conection");

        c.gridx ++;
        c.gridy = 0;
        c.weightx = 0.0;
        c.fill = GridBagConstraints.NONE;
        this.add(new SeparatorPanel(Color.GRAY, Color.WHITE), c);

        c.gridx ++;
        c.gridy = 0;
        c.fill = GridBagConstraints.NONE;
        c.weightx = 0.0;
        overErrorLabel = new JLabel("");
        overErrorLabel.setSize(new Dimension(150, overErrorLabel.getHeight()));
        this.add(overErrorLabel, c);
        //this.setText(2, "");

        c.gridx ++;
        c.gridy = 0;
        c.weightx = 0.0;
        c.fill = GridBagConstraints.NONE;
        this.add(new SeparatorPanel(Color.GRAY, Color.WHITE), c);

        c.gridx ++;
        c.gridy = 0;
        c.weightx = 0.0;
        c.fill = GridBagConstraints.NONE;
        c.anchor = GridBagConstraints.EAST;
        timeLabel = new JLabel("");
        timeLabel.setMinimumSize(new Dimension(150, timeLabel.getHeight()));
        //timeLabel.setMaximumSize(new Dimension(150, timeLabel.getHeight()));
        this.add(timeLabel, c);
        //this.setText(3, "");


        JPanel rightPanel = new JPanel(new GridBagLayout());
        c.gridx ++;
        c.gridy = 0;
        c.weightx = 0.0;
        c.fill = GridBagConstraints.BOTH;
        rightPanel.add(new JLabel(new AngledLinesWindowsCornerIcon()), c);
        rightPanel.setOpaque(false);

        c.gridx ++;
        c.gridy = 0;
        c.fill = GridBagConstraints.BOTH;
        this.add(rightPanel, c);

        setBackground(SystemColor.control);
      }
4

3 回答 3

12

您为不同的标签设置首选、最小、最大等大小。我认为您所需要的只是设置 weight X>0 并为您想要调整大小的标签填充 param=HORIZONTAL 和 weightX=0 并为您不想调整大小的标签填充-NONE 。

还可以使用 ipadx 指定标签的最小尺寸。

于 2011-07-27T10:19:44.523 回答
4

为了更好和最简单的 GUI 输出,最好寻找Borderlayout

JPanel#setPrefferedSize(200, 30);for JButtonwithIcon和 JLabel 放到WEST area

JPanel#setPrefferedSize(200, 30); (右面板)到EAST area

JPanel把另一个CENTER area

于 2011-07-27T10:24:32.707 回答
3

如果您希望 GridBagLayout 内的单元格的宽度(或高度)固定,那么有一个可行的解决方案。假设您希望 (x,y) 处的单元格宽度固定,但其中的 JLabel 具有可变内容,必须在运行时更改。如果 JLabel 需要更改大小,则使用 GridBagLayout 会重新定位其他组件,从而强制调整包含单元格的大小。为了解决这个问题,您可以执行以下操作之一:

  • 您可以在布局中添加一个额外的行 (y + 1),其中第 x 个单元格包含一个虚拟 JPanel,并在该 JPanel 上调用.setPreferredSize(new Dimension(desiredWidth, 0));.
  • 相同,但不是设置 preferredSize,而是在添加此虚拟面板时使用的 GridBagConstraints 对象上设置插图。因此,如果您想要固定宽度,只需执行gbc.insets = new Insets(0,preferredWidth,0,0);or gbc.insets = new Insets(0,0,0,preferredWidth);。这样,面板本身的尺寸为 (0,0),但包含的单元格将被强制为您指定的宽度(因为从组件中看,插图是外部填充)。

第一个要求您调用 setPreferredSize(),这总是让我感到不舒服,因为您正在搞乱 LayoutManager 的任务。因此,我更喜欢后一种解决方案,但由于虚拟面板没有尺寸,您将无法可视化您的单元格。在前一种解决方案中,您可以通过为面板提供背景颜色来使您的单元格可见。

这种方法的好处是您不必费心在 JLabel 上设置大小,尤其是在显示之前未知的高度。您不能在 JLabel 上设置 preferredSize,因为您不知道它必须具有哪个高度(取决于平台、取决于字体等)。您只需添加它,并使用带有虚拟面板的虚拟行将强制包含 JLabel 的单元格与desiredWidth.

鉴于 JLabel 的宽度不会超过desiredWidth,此解决方案有效,因为在这种情况下,单元格也会增长。你总是可以在 JLabel 上设置一个 maximumSize 来解决这个问题(这里你没有未知高度的问题 - 对于最大高度,你可以使用 Integer.MAX_VALUE)。

同样的故事也适用于高度,只需引入一个虚拟列并在出现问题的行的单元格中添加一个维度 = (0, preferredHeight) 的虚拟 JPanel。

这种方法的缺点:您必须使用虚拟组件,这从来都不是最好的方法,但在这里效果很好。

于 2013-03-04T12:34:17.553 回答