2012-01-26 8 views
2

Я хочу, чтобы макет моего JPane так:Как использовать GridBagConstraints для создания макета?

------- 
|  | 
|  | 
|  | 
------- 
|  | 
------- 

Таким образом, верхняя часть больше/выше, чем в нижней части (верхняя часть состоит из другой JPanel и использует графический объект для отображения изображения, в то время как нижняя часть также состоит из другого JPanel, но использует объект Graphics для рисования некоторых строк и текста).

Я слышал, что лучший способ сделать это - использовать GridBagLayout и GridBagConstraints.

Я пытаюсь найти подходящие свойства для GridBagConstraints, и у меня возникают некоторые трудности. Это то, что я до сих пор ...

В верхней части, у меня есть:

gridx = 0 
gridy = 0 
weighty = 1.0; // expand downwards, because the bottom should never expand in the Y direction 
fill = GridBagConstraints.BOTH 

В нижней части, у меня есть:

gridx = 0 
gridy = 1 
fill = GridBagConstraints.HORIZONTAL 
anchor = GridBagConstraints.PAGE_END 

К сожалению, все концы вверх появляется большой серый прямоугольник (у меня есть белый фон для приложения) - загрузка изображений, никаких строк/текста не появляется.

Что мне делать? Что мне нужно настроить?

Я читал несколько руководств, но это кажется действительно запутанным, я получил его в своем первом приложении, но теперь, когда я пытаюсь это сделать, он просто не работает для меня.

+1

Можете ли вы дать [SSCCE] (HTTP://sscce.org/), который показывает проблему? Из того, что вы указали, даже не ясно, добавляются ли панели к чему-либо ... –

+0

Пожалуйста, разместите весь код, который вы используете для настройки панели. –

+0

-1, 'Я слышал, что лучший способ сделать это - использовать GridBagLayout и GridBagConstraints.' Это не совет, который вы получили, когда задавали этот вопрос 3 часа назад: http://stackoverflow.com/questions/ 9012976/java-awt-gui-container-to-hold-a-top-and-bottom-half – camickr

ответ

4

В общем, для GridBag макете

  • если вы хотите составную шкалу, вы должны дать направление его масштаб веса и любых размеров (ширина/высота), установленного для этого направления будет проигнорировано диспетчер компоновки.

  • Если вам не нужен шкала компонентов, компонент должен иметь свой размер (если вы хотите, вы можете вставить эту тему в документы java). В вашем случае нижней панели вам нужно дать, по крайней мере, предпочтительную высоту.

Это может работать, как ваши ожидания

pnlTop.setBackground(Color.WHITE); 
pnlBottom.setBackground(Color.BLUE); 

// Because you don't want the bottom panel scale, you need to give it a height. 
// Because you want the bottom panel scale x, you can give it any width as the 
// layout manager will ignore it. 
pnlBottom.setPreferredSize(new Dimension(1, 20)); 


getContentPane().setLayout(new GridBagLayout()); 
GridBagConstraints cst = new GridBagConstraints(); 
cst.fill = GridBagConstraints.BOTH; 
cst.gridx = 0; 
cst.gridy = 0; 
cst.weightx = 1.0; // --> You miss this for the top panel 
cst.weighty = 1.0; 
getContentPane().add(pnlTop, cst); 

cst = new GridBagConstraints(); 
cst.fill = GridBagConstraints.HORIZONTAL; 
cst.gridx = 0; 
cst.gridy = 1; 
cst.weightx = 1.0; // You miss this for the bottom panel 
cst.weighty = 0.0; 
getContentPane().add(pnlBottom, cst); 

Более того, если вы хотите использовать раскладку GridBag, я рекомендую вам попробовать библиотеку безболезненным-GridBag http://code.google.com/p/painless-gridbag/ (Я автор этой библиотеки). Она не решает эту проблему для вас (как ваша проблема касается размера хозяйствующего компонента в макете GridBag), но это сэкономит вам много печатать и сделать код легче поддерживать

pnlBottom.setPreferredSize(new Dimension(1, 20)); 

PainlessGridBag gbl = new PainlessGridBag(getContentPane(), false); 
gbl.row().cell(pnlTop).fillXY(); 
gbl.row().cell(pnlBottom).fillX(); 
gbl.done(); 
+0

Безболезненная решетка выглядит очень красиво ... отличный человек ... –

0

Если вы можете использовать 3-е партии libs, вы можете также рассмотреть FormLayout. Он позволяет указать высоту каждой строки и поведение изменения размера.

Я не проверял это, но

FormLayout layout = new FormLayout( 
"pref", //columns 
"50dlu:grow(0.2)","25dlu:grow(0.1)" //rows 
); 

может сделать трюк.Более подробную информацию о синтаксисе можно найти в the JGoodies Forms pdf

2

не уверен, из вашего вопроса, возможно, поможет вам Top 70%, Bottom на 30%

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.*; 

public class BorderPanels extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public BorderPanels() { 
     getContentPane().setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     JPanel panel1 = new JPanel(); 
     Border eBorder = BorderFactory.createEtchedBorder(); 
     panel1.setBorder(BorderFactory.createTitledBorder(eBorder, "70pct")); 
     gbc.gridx = gbc.gridy = 0; 
     gbc.gridwidth = gbc.gridheight = 1; 
     gbc.fill = GridBagConstraints.BOTH; 
     gbc.anchor = GridBagConstraints.NORTHWEST; 
     gbc.weightx = gbc.weighty = 70; 
     getContentPane().add(panel1, gbc); 
     JPanel panel2 = new JPanel(); 
     panel2.setBorder(BorderFactory.createTitledBorder(eBorder, "30pct")); 
     gbc.gridy = 1; 
     gbc.weightx = 30; 
     gbc.weighty = 30; 
     gbc.insets = new Insets(2, 2, 2, 2); 
     getContentPane().add(panel2, gbc); 
     pack(); 
    } 

    public static void main(String[] args) { 
     new BorderPanels().setVisible(true); 
    } 
} 
Смежные вопросы