我正在为学校的项目制作GUI。我正在使用GridBagLayout。
我希望有一个标签指示输入(文件类型@ x = 0,y = 0),然后是另一个标签(实际文件名一旦被选中@ x = 1, y = 0
),然后是浏览文件选择器的按钮(@ x = 2, y = 0
)。 (1,0)
处的标签最初是空白的,但是当标签不包含文本时,我希望文本占用的区域占用一些空间。我还希望(0,0)
处的标签与(2,0)
处的按钮之间的空格保持不变。
为实现这一目标,我试图将标签放在面板上,然后使用布局。但是我无法缝合以达到预期的效果。有人可以提供一些建议吗? GridBagLayout的下三行将以完全相同的方式布局。
以下是GUI屏幕截图的链接。
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);
答案 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
最适合您的工作示例:
如果你没有得到我们说的话,这个例子我只设置了首选大小来解决你的问题。但由于我没有设置最小尺寸,请尝试调整窗口大小以符合上述说明。
源代码:
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在最初选择任何内容时压缩成丑陋状态。