2015-04-27 3 views
0

enter image description hereВесомая не работает в GridBagLayout

Над то, что я хочу добиться:

  1. на востоке JFrame фиксированный 400 ширина JPanel.
  2. панель использует GridBagLayout.
  3. компонента в этой панели все тянется горизонтально
  4. последнего компонент заполняет Лишние Y пространства
  5. последнего компонентом является JscrollPane обертыванием JTable.

У меня было много испытаний, все потерпели неудачу:

  1. Я попытался setPreferredSize панели, то внутренние компоненты не будут растягиваться по горизонтали. (Я знаю, как использовать GridBagConstraints, или я думаю, что знаю)
  2. Я попытался установить размер панели, а размер фактически определяется JscrollPane.
  3. Я попытался деформировать JscrollPane в другой JPanel (потому что я не очень доверяю JScrollPane), бесполезно.
  4. GridBagContraints.weighty никогда не функционирует в этом проекте, однако функционирует хорошо в другом месте.

Поэтому я думаю, что проблема связана с JTable, она всегда делает прокси. 300 * 300, как показано на красной линии. enter image description here

Сегодня еще один плохой день с множеством поворотаPreferredSize и setSize и все эти проблемы с размером. Надеюсь, кто-нибудь может помочь, спасибо!

private JPanel buildInfoPanel() { 
     JPanel panel = new JPanel(); 
     panel.setVisible(false); 

     GridBagLayout gbl = new GridBagLayout(); 
     GridBagConstraints constraints = new GridBagConstraints(); 
     constraints.fill = GridBagConstraints.HORIZONTAL; 
     constraints.gridx = 0; 
     panel.setLayout(gbl); 

     label_player = new JLabel("label_player"); 
     label_player.setBackground(Color.RED); 
     constraints.gridy = 0; 
     constraints.anchor = GridBagConstraints.NORTH; 
     gbl.setConstraints(label_player, constraints); 
     panel.add(label_player); 

     label_deck = new JLabel("label_deck"); 
     label_deck.setBackground(Color.BLUE); 
     constraints.gridy++; 
     gbl.setConstraints(label_deck, constraints); 
     panel.add(label_deck); 

     JTable table = new JTable(new ShipTableModel()); 
     table.setAutoCreateRowSorter(true); 
     table.setFillsViewportHeight(true); 
     table.getRowSorter().toggleSortOrder(2); 

     JScrollPane scrollPane = new JScrollPane(table); 
     scrollPane.setBorder(new LineBorder(Color.red)); 
     constraints.gridy++; 
     constraints.weighty = 1; 
     gbl.setConstraints(scrollPane, constraints); 
     panel.add(scrollPane); 
     return panel; 
    } 

    class ShipTableModel extends AbstractTableModel { 

     private Ship[] ships = new Ship[0]; 
     private String[] columnNames = {"id", "name", "lv", "hp", "舰队", "舰种", "mId"}; 

     @Override 
     public String getColumnName(int col) { 
      return columnNames[col]; 
     } 

     @Override 
     public int getRowCount() { 
      return ships.length; 
     } 

     @Override 
     public int getColumnCount() { 
      return columnNames.length; 
     } 
    } 
+0

Не могли бы вы высказать свой текущий код? Лучшая попытка, которую вы достигли. – StanislavL

+0

На самом деле все, что вам нужно, это вызвать setPreferredSize для прокрутки, содержащей JTable, и установить весовое значение и установить fill = BOTH. – StanislavL

ответ

0

Просто установите constraints.fill = GridBagConstraints.VERTICAL для JScrollPane.

Смежные вопросы