2016-03-21 75 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);