2013-09-08 2 views
0

Я пытаюсь создать пользовательский интерфейс с помощью следующей компоновки панели:GridBagLayout: панели распространяются на другие панели

http://i.imgur.com/jrYUxRO.jpg

Однако, когда я заполнить белую панель с изображениями (которые находятся на JLabels) следующих происходит:

http://i.imgur.com/3ECRndH.jpg

ли проблема в том, что сами изображения не изменять размеры, чтобы вызвать панель «соответствовать»? Если да, можно ли их легко изменить, или мне нужно будет найти размер, который GridBag присваивает ему, а затем масштабировать каждое изображение в соответствии с этим?

EDIT: То, что я пытаюсь сделать здесь, - это сохранить панель 1 (белый) того же размера, что и на первом изображении, когда я фактически добавляю свои изображения. Я не хочу, чтобы панель изменяла размер и захватывала некоторые другие панели.

GridBagLayout gb = new GridBagLayout(); 
    gb.columnWeights = new double[] {0.25,0.25,0.25,0.25}; 
    gb.rowWeights = new double[] {0.5,0.5}; 
    setLayout(gb); 
    GridBagConstraints gc = new GridBagConstraints(); 

    gc.fill = GridBagConstraints.BOTH; 

    gc.gridx = 0; 
    gc.gridy = 0; 
    gc.gridwidth = 3; 
    add(new WhitePanel(), gc); 

    gc.gridx = 3; 
    gc.gridy = 0; 
    gc.gridwidth = 1; 
    add(new RedPanel(), gc); 

    gc.gridx = 0; 
    gc.gridy = 1; 
    gc.gridwidth = 1; 
    add(new GreenPanel(), gc); 

    gc.gridx = 1; 
    gc.gridy = 1; 
    gc.gridwidth = 2; 
    add(new BluePanel(), gc); 

    gc.gridx = 3; 
    gc.gridy = 1; 
    gc.gridwidth = 1; 
    add(new YellowPanel(), gc); 

Ниже мой WhitePanel конструктор:

public WhitePanel() 
    { 
     setBackground(new Color(1f,1f,1f,1f)); 

     setLayout(new GridBagLayout()); 
     GridBagConstraints gc = new GridBagConstraints(); 

     gc.gridx = 0; 
     gc.gridy = 0; 
     gc.weightx = 1; 
     gc.weighty = 1; 
     gc.anchor = GridBagConstraints.CENTER; 

     for (int type = 0; type < 4; type++) 
     { 
      for (int tier = 0; tier < 7; tier++) 
      { 
       gems[type][tier] = new D3Gem(type, tier, 0); 
       add(new JLabel(new ImageIcon(gems[type][tier].getImage())),gc); 
       gc.gridx++; 
      } 
      gc.gridx = 0; 
      gc.gridy++; 
     } 
    } 

EDIT EDIT: Я надеялся на белой панели, чтобы оставаться такой же размер и для JLabels себя, чтобы изменить размер (т.е. есть пустое пространство между метками для усадки), чтобы соответствовать этой панели.

Примечание: Если у меня нет линии gc.fill = GridBagConstraints.BOTH;, изображения на белой панели занимают лишь небольшую часть белой панели (достаточно, чтобы они не перекрывались). В результате я предположил, что gc.fill = GridBagConstraints.BOTH; прекрасно заполнит белую панель.

РЕДАКТИРОВАНИЕ «РЕШЕНИЕ»: Хорошо, у меня, похоже, есть решение, хотя и шаткий. Я просто добавил setPreferredSize(new Dimension(1,1)); к конструктору белой панели, и в результате он остался тем размером, который я хотел. Если кто-нибудь захочет уточнить, что происходит, я был бы признателен :)

+2

Это как GridBagLayout работы - он пытается использовать предпочтительные размеры ваших компонентов, чтобы соответствовать им наилучшим образом и по размеру. Подумайте, 1) показывая соответствующий код, желательно [sscce] (http://sscce.org) и 2) показывая, на что вы хотите, чтобы нижний gui выглядел, когда он держит все изображения. –

+1

'' Я пытаюсь сделать здесь панель 1 (белый) того же размера, что и на первом снимке, когда я действительно добавляю свои изображения. Я не хочу, чтобы панель изменяла размер и захватывала некоторые другие панели. «' - так какое поведение вы хотите, когда изображения занимают больше размера, чем показывает компонент? Вы хотите, чтобы некоторые изображения не отображались? Пожалуйста, предоставьте нам как можно больше информации, чтобы мы могли понять проблему. –

+0

Отредактировано снова выше, извините за отсутствие информации. – pIjIN

ответ

2

Вы можете определить ipadx для красного (или желтый) Панель-х GridBagConstraint

От Javadoc

/** 
* This field specifies the internal padding of the component, how much 
* space to add to the minimum width of the component. The width of 
* the component is at least its minimum width plus 
* <code>ipadx</code> pixels. 
* <p> 
* The default value is <code>0</code>. 
* @serial 
* @see #clone() 
* @see java.awt.GridBagConstraints#ipady 
*/ 
public int ipadx; 
+0

Я довольно новичок в GridBagLayout, так что простите меня за ложные предположения, но наверняка GridBagLayout резервирует определенное пространство для размещения моих компонентов в белой панели? Почему добавление изображений на панель приводит к ее расширению? Я проверил, что он делает, и кажется, что это добавляет пробел между каждой из JLabels на белой панели. Есть ли способ уменьшить это пространство? – pIjIN

+0

добавленные изображения - предпочтительный размер изменен - ​​макет приспосабливает детей к hmmm, комфорт их размеров pref – StanislavL