2014-07-13 12 views
6

Mam JFrame, którego korzeń JPanel jest tworzony z GridBagLayout. W czasie pracy, płyta jest wypełniona składników opartych na niektórych opis, szerokość, wysokość, a x, y koordy podano w opisie do stosowania z gridwidth, gridheight, gridx i gridy pól GridBagConstraints. Same komponenty mogą być również JPanel s z ich własnymi komponentami potomnymi i GridBagConstraints, GUI jest opisane w drzewie, więc Ramka jest rekursywnie wypełniana.Czy komponenty siatki mogące wyświetlać ramkę rodzica po zmianie rozmiaru?

Problem polega na tym, że podczas zmiany rozmiaru ramki wewnętrzne komponenty nie są rozciągane, aby wypełnić podane szerokości i wysokości. Podałem przykład kodu układu poniżej ze zrzutami ekranu.

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

public class GridBagTest extends JPanel { 

    private final GridBagConstraints gbc = new GridBagConstraints(); 

    public GridBagTest(){ 

     setLayout(new GridBagLayout()); 
     add(gbcComponent(0,0,1,2), gbc);  
     add(gbcComponent(1,0,2,1), gbc);    
     add(gbcComponent(1,1,1,1), gbc);    
     add(gbcComponent(2,1,1,1), gbc);    

    } 

    //Returns a JPanel with some component inside it, and sets the GBC fields 
    private JPanel gbcComponent(int x, int y, int w, int h){ 

     gbc.gridx = x; 
     gbc.gridy = y; 
     gbc.gridwidth = w; 
     gbc.gridheight = h; 
     gbc.fill = GridBagConstraints.BOTH; 
     JPanel panel = new JPanel(); 
     JTextField text = new JTextField("(" + w + ", " + h + ")"); 
     panel.setBorder(new TitledBorder("(" + x + ", " + y + ")"));   
     panel.add(text); 
     return panel; 

    } 

    public static void main (String args[]){ 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(new GridBagTest()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

When running it After stretching

muszę ją więc na rysunku 2, wewnętrzne JPanel s posiadający komponenty są przeskalowane w celu wypełnienia odpowiedniej szerokości i wysokości na GridBagLayout, idealnie rozciąganie ich komponentów, jak również.

Odpowiedz

7

Jest to zwykle spowodowane brakiem wagi i ciężkich wiązań.

Spróbuj:

gbc.gridx = x; 
gbc.gridy = y; 
gbc.gridwidth = w; 
gbc.gridheight = h; 

// **** add here: 
gbc.weightx = 1.0; 
gbc.weighty = 1.0; 

To pozwoli na GUI, aby rozwinąć w X i Y kierunkach, jeśli zajdzie taka potrzeba.

+0

Wygląda na to! Nie mogę uwierzyć, że nigdy wcześniej tego nie próbowałem. Czy jest jakiś sposób, że wewnętrzne panele, które mają tylko jeden komponent, mają ten rozmiar rozciągający się, by go wypełnić? tj. szerokości pól tekstowych są rozciągnięte? –

+1

@ adnan_252: tak, ale musisz podać te wewnętrzne menedżery układów JPanels, które pozwalają na takie opcje, jak GridBagLayout lub BorderLayout, lub ... Obecnie twoje wewnętrzne JPanele używają tylko domyślnego FlowLayout, a ten układ jest dość prosty i nie nie rozciągać komponentów. –

+0

jeszcze raz dziękuję, to było naprawdę przydatne! –

0

Możesz ustawić columnWidths i rowHeights przy zmianie rozmiaru swojego JPanel. Spójrz na tę próbkę. Zmodyfikowałem kod dla dwóch kolumn:

public GridBagTest(){ 

    setLayout(new GridBagLayout()); 
    add(gbcComponent(0,0,1,2), gbc);  
    add(gbcComponent(1,0,1,1), gbc); 

    addComponentListener(new java.awt.event.ComponentAdapter() { 
     @Override 
     public void componentResized(java.awt.event.ComponentEvent evt) { 
      GridBagLayout layout = (GridBagLayout) getLayout(); 
      JPanel panel = (JPanel)evt.getComponent(); 
      int width = panel.getWidth(); 
      int height = panel.getHeight(); 
      int wGap = panel.getInsets().left+panel.getInsets().right; 
      int hGap = panel.getInsets().top+panel.getInsets().bottom; 
      layout.columnWidths = new int[]{width/2-wGap, width/2-wGap}; 
      layout.rowHeights = new int[]{height-hGap}; 
     } 
    }); 

} 

W zależności od kolumn i liczby wierszy, można to zmienić. Oto wynik: enter image description here enter image description here

Powiązane problemy