如何获取带有空JLabel的JPanel以占用GridBagLayout中的空间

时间:2013-11-02 02:38:31

标签: java swing gridbaglayout

我正在为学校的项目制作GUI。我正在使用GridBagLayout。

我希望有一个标签指示输入(文件类型@ x = 0,y = 0),然后是另一个标签(实际文件名一旦被选中@ x = 1, y = 0),然后是浏览文件选择器的按钮(@ x = 2, y = 0)。 (1,0)处的标签最初是空白的,但是当标签不包含文本时,我希望文本占用的区域占用一些空间。我还希望(0,0)处的标签与(2,0)处的按钮之间的空格保持不变。

为实现这一目标,我试图将标签放在面板上,然后使用布局。但是我无法缝合以达到预期的效果。有人可以提供一些建议吗? GridBagLayout的下三行将以完全相同的方式布局。

以下是GUI屏幕截图的链接。

The pic

    calibrationFileSelectionValueLabel = new JLabel("",Label.LEFT);
    calibrationFileSelectionValueLabel.setName("calibrationFileSelection");
    calibrationFileSelectionValueLabel.setMinimumSize(new Dimension(100,0));



    calibrationFileSelectionValuePanel = new JPanel();
    calibrationFileSelectionValuePanel.setBorder(BorderFactory.createEtchedBorder());
    calibrationFileSelectionValuePanel.add(calibrationFileSelectionValueLabel);

    c.gridx = 0;
    c.gridy = 0;
    c.fill = GridBagConstraints.NONE;

    filesPanel.add(calibrationFileLabel,c);

    c.gridy = 1;
    filesPanel.add(frequencyFileLabel,c);

    c.gridy = 2;
    filesPanel.add(sampleFileLabel,c);

    c.gridy = 3;
    filesPanel.add(outputFileLabel,c);

    c.gridx = 1;
    c.gridy = 0;
    c.fill = GridBagConstraints.BOTH;

   // filesPanel.add(calibrationFileSelection,c);
    filesPanel.add(calibrationFileSelectionValuePanel,c);

    c.gridy = 1;
   // filesPanel.add(frequencyFileSelection,c);
    filesPanel.add(frequencyFileSelectionValueLabel,c);

    c.gridy = 2;
   // filesPanel.add(sampleFileSelection,c);
    filesPanel.add(sampleFileSelectionValueLabel,c);

    c.gridy = 3;
   // filesPanel.add(outputFileSelection,c);
    filesPanel.add(outputFileSelectionValueLabel,c);

    c.gridx = 2;
    c.gridy = 0;
    c.fill = GridBagConstraints.NONE;
    filesPanel.add(calibrationFileSelectionButton,c);

    c.gridy = 1;
    filesPanel.add(frequencyFileSelectionButton,c);      

    c.gridy = 2;
    filesPanel.add(sampleFileSelectionButton,c);

    c.gridy = 3;
    filesPanel.add(createOutputFileButton,c);       

    panelForFilesPanelBorder = new JPanel();
    panelForFilesPanelBorder.setBorder(BorderFactory.createCompoundBorder(new EmptyBorder(5,10,5,10), BorderFactory.createEtchedBorder()));
    panelForFilesPanelBorder.add(filesPanel);

    buttonsPanel = new JPanel();
    buttonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
    buttonsPanel.setBorder(BorderFactory.createCompoundBorder(new EmptyBorder(5,10,10,10), BorderFactory.createEtchedBorder()));
    buttonsPanel.add(startButton);
    buttonsPanel.add(stopButton);
    basePanel.add(panelForFilesPanelBorder);
    basePanel.add(numericInputPanel); 
    basePanel.add(buttonsPanel); 

4 个答案:

答案 0 :(得分:5)

令人讨厌的是,没有文字的标签不会占用任何垂直空间。当它为空时,你可以使用" "来解决这个问题。

JLabel fileNameLabel = new JLabel(" ");

答案 1 :(得分:4)

嗯,基本上,GridBagLayout将组件放置在网格中的矩形(单元格)中,然后使用组件“ preferred sizes 来确定单元格应该有多大。 使用此布局

  • 如果容器的尺寸小于小于 ,那么将使用最小尺寸
  • 使用空("")文字如果没有使用JLabel\JTextFeild\JButton或覆盖{明确地向其提供首选大小提示,则(2,2)的首选大小约为setPreferredSize(size) {1}}。

在他的设定点上,设置最小尺寸将不起作用,因为带有空文本的首选尺寸大约为getPreferredSize(size),并且容器的尺寸已经大于首选尺寸。 (2,2)使用首选大小而不必担心最小大小。

您实际上需要使用GridBagLayout设置首选尺寸和最小尺寸,因为:

如果您尝试仅设置 首选大小,缩小窗口大小最终会导致容器面板的大小缩小。容器的面板大小小于小于组件的首选大小,GridBagLayout缩小到最小大小。如果此时尚未给出最小大小提示,则会使用默认的最小大小:可能大约为JLabel\JTextFeild\JButton您将通过下面的工作示例更好地理解。

需要注意的其他一些事项:

(2,2)

您要添加包含 c.gridx = 1; c.gridy = 0; c.fill = GridBagConstraints.BOTH; // filesPanel.add(calibrationFileSelection,c); filesPanel.add(calibrationFileSelectionValuePanel,c); 的{​​{1}}。您不需要使用额外的面板,而只需通过设置直接将panel添加到网格中(而不是覆盖calibrationFileSelectionValueLabel更好)calibrationFileSelectionValueLabel。不过请尝试设置getPreferedSize(Size)的插页,让您的第一个preferredSize看起来更好一些:

GridBagConstraints

最适合您的工作示例:

如果你没有得到我们说的话,这个例子我只设置了首选大小来解决你的问题。但由于我没有设置最小尺寸,请尝试调整窗口大小以符合上述说明。

enter image description here

源代码:

panel

答案 2 :(得分:1)

我使用John的" "技巧修改了Sage的程序,并添加了一些我自己的GridBagConstraint调味剂,以便在崩溃和扩展时更自然地调整对话框的大小。

public class GridBagLayoutDemo extends JFrame {

    public GridBagLayoutDemo() throws HeadlessException {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.setLayout(new BorderLayout());

        JPanel panel = new JPanel(new java.awt.GridBagLayout());
        panel.setBorder(new EmptyBorder(10, 10, 10, 10));
        GridBagConstraints labCnst = new GridBagConstraints();

        Dimension preferredSize = new Dimension(140, 1);

        labCnst.insets = new Insets(3, 3, 3, 3);

        JLabel title = new JLabel("My Title");
        JLabel title2 = new JLabel("My Title");
        JLabel title3 = new JLabel("My Title");

        final JLabel selectionLabel1 = new JLabel(" ");
        selectionLabel1.setBorder(new LineBorder(Color.BLACK));
        final JLabel selectionLabel2 = new JLabel(" ");
        selectionLabel2.setBorder(new LineBorder(Color.BLACK));
        final JLabel selectionLabel3 = new JLabel(" ");
        selectionLabel3.setBorder(new LineBorder(Color.BLACK));

        setPreferredWidth(selectionLabel1, 120);
        setPreferredWidth(selectionLabel2, 120);
        setPreferredWidth(selectionLabel3, 120); 

        JButton browse1 = new JButton(new AbstractAction("Browse 1") {
            public void actionPerformed(ActionEvent arg0) {
                selectionLabel1.setText("C:\\Documents and Settings\\jsmith\\My Documents\\Studio 2014\\Projects\\1");
            }
        });
        JButton browse2 = new JButton(new AbstractAction("Browse 2") {
            public void actionPerformed(ActionEvent arg0) {
                selectionLabel2.setText("C:\\Documents and Settings\\jsmith\\My Documents\\Studio 2014\\Projects\\2");
            }
        });
        JButton browse3 = new JButton(new AbstractAction("Browse 3") {
            public void actionPerformed(ActionEvent arg0) {
                selectionLabel3.setText("C:\\Documents and Settings\\jsmith\\My Documents\\Studio 2014\\Projects\\3");
            }
        });

        labCnst.gridx = 0;
        labCnst.gridy = 0;
        panel.add(title, labCnst);
        labCnst.gridy = 1;
        panel.add(title2, labCnst);
        labCnst.gridy = 2;
        panel.add(title3, labCnst);

        labCnst.weightx = 1;
        labCnst.fill = GridBagConstraints.HORIZONTAL;
        labCnst.gridx = 1;
        labCnst.gridy = 0;
        panel.add(selectionLabel1, labCnst);
        labCnst.gridy = 1;
        panel.add(selectionLabel2, labCnst);
        labCnst.gridy = 2;
        panel.add(selectionLabel3, labCnst);

        labCnst.weightx = 0;

        labCnst.gridx = 3;
        labCnst.gridy = 0;
        panel.add(browse1, labCnst);
        labCnst.gridy = 1;
        panel.add(browse2, labCnst);
        labCnst.gridy = 2;
        panel.add(browse3, labCnst);

        add(panel, BorderLayout.CENTER);
        pack();

    }

    private void setPreferredWidth(JComponent c, int w) {
        Dimension d = c.getPreferredSize();
        d.width = w;
        c.setPreferredSize(d);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                GridBagLayoutDemo demo = new GridBagLayoutDemo();
                demo.setLocationRelativeTo(null);
                demo.setVisible(true);
            }
        });
    }
}

答案 3 :(得分:-1)

正如John所说,在标签中放置一个空格和/或将其设置为setMinimumSize()

如果要在以后的UI活动中填充标签,则最小大小非常有用..防止UI在最初选择任何内容时压缩成丑陋状态。