2016-03-21 45 views
0

我有GridBagLayout,其中我添加了JLabelJTextfield和两个JButtons with和图像,图像是25x25像素。无论何时我显示或隐藏按钮,整个布局都会移动。我试图setSize(),setMinimumSize(),setPreferredSize()setMaximumSize()但它会忽略那个调整大小的JLabelJTextField。我怎样才能为这两个组件设置修复大小,或者让GridBagLayout中的所有单元格的大小相同。与JTextField和JButton的GridbagLayout,当JButton可见时重新格式化

Demo

JPanel panel = new JPanel(); 
panel.setLayout(new GridBagLayout()); 

GridBagConstraints c = new GridBagConstraints(); 
c.fill = GridBagConstraints.HORIZONTAL; 
c.weightx = 0.5; 

c.gridx = 0; 
c.gridy = 0; 
panel.add(new JLabel("Auftrag Nummer:"), c); 

JTextField orderNumberField = new JTextField(); 
c.gridx = 1; 
c.gridy = 0; 
panel.add(orderNumberField, c); 

JButton searchButton = DefaultLayouts.imageButton("SEARCH"); 
c.gridx = 0; 
c.gridy = 1; 
c.insets = new Insets(10, 0, 0, 0); 
panel.add(searchButton, c); 

JButton checkButton = DefaultLayouts.imageButton("CHECK"); 
c.gridx = 1; 
c.gridy = 1; 
c.insets = new Insets(10, 0, 0, 0); 
panel.add(checkButton, c); 

DefautlLayouts.imageButton获取路径和工具提示,并设置一些默认

public static JButton imageButton(String propertiesName) { 
    JButton button = DefaultLayouts.button(); 
    button.setIcon(new ImageIcon(imagesProperties.getProperty(propertiesName + "_PATH"))); 
    button.setToolTipText(imagesProperties.getProperty(propertiesName + "_TOOLTIP")); 

    button.setContentAreaFilled(false); 
    button.setFocusPainted(false); 
    button.setBorder(BorderFactory.createEmptyBorder()); 

    return button; 
} 
+0

不,这是非常期望的行为,因为不可见的组件不用于计算布局要求。也许使用空白图像或组件代替 – MadProgrammer

+0

1)为了更快地获得更好的帮助,请发布[MCVE]或[简短,独立,正确的示例](http://www.sscce.org/)。 2)以最小尺寸提供ASCII艺术或简单的GUI图形*图形,并且如果可调整大小,则具有更大的宽度和高度。 (也可以应用该逻辑来确定组件是否因其可见性而被切换。) –

回答

1

一个你必须选择是,你可以与具有固定大小的JPanel信封的按钮移到,那么如果你隐藏按钮,JPanel仍然会在那里保存空间。

+1

*“具有恒定大小的JPanel”*请参阅[我是否应避免在Java Swing中使用set(Preferred | Maximum | Minimum)Size方法? http://stackoverflow.com/q/7229226/418556)(是的。)在该面板上使用'CardLayout'的OTOH可能具有所需的效果。具有卡片布局的容器将与添加到卡片上的最宽的组件/容器一样宽,并且与最高的一样高 - 不管哪个卡片可见。 [这个答案](http://stackoverflow.com/a/5786005/418556)包含一个简单的演示。的布局。 –

+0

您可以使用ipadx和ipady约束来代替更改容器本身的大小 – MadProgrammer

0

我用25x25像素的空png解决了这个问题,它与显示和隐藏的按钮位于相同的位置。

将在未来更新此更好的解决方案。

编辑

我用DesigneGridLayout来解决这个问题。

JPanel panel = DefaultLayouts.panel(); 
DesignGridLayout layout = new DesignGridLayout(panel); 

JTextField orderNumberField = new JTextField(); 
JButton searchButton = DefaultLayouts.imageButton("SEARCH"); 
JButton checkButton = DefaultLayouts.imageButton("CHECK"); 

layout.row().grid().add(new JLabel("Auftrag Nummer:")).add(orderNumberField); 
layout.emptyRow(); 
layout.row().grid().add(searchButton).add(checkButton); 
0

除了设置其尺寸,你想在一个JPanel保持静态与指定的尺寸,如果布局是在框架上占主导地位的一个组件,请尝试使用frame.setResizable(false);