13. oktober 2004 - 18:08Der er
16 kommentarer og 1 løsning
GridBagLayout problemer
Jeg har lavet et javaprogram med grafisk brugerflade, som benytter GridBagLayout. Jeg har både buttons, labels, comboboxes og et textarea i mit vindue. Nogle af komponenterne breder sig over flere rækker og/eller kolonner. Jeg vil gerne have sådan, at alle kolonner har samme bredde og alle rækker har samme højde (også selvom nogle komponenter evt. skjules). Lige nu bliver kolonnerne brede, hvis de f.eks. har en knap med meget tekst og smalle, hvis der er en knap med lidt tekst. På samme måde varierer rækkernes højde efter hvilke komponenter der er i rækken. Hvordan får jeg alle kolonner lige brede og alle rækker lige høje ??
Hvis jeg ellers har forstået dit spørgsmål rigtigt, så ville jeg mene at du skal skifte dit GridBagLayout ud med et GridLayout, dette layout giver dig automatisk lige store kolonner/rækker.
Jeg kan ikke lige umiddelbart få det til at virke. Komponenterne bliver indsat efter hinanden og ikke på en bestemt position. Bruger jeg GridLayout forkert, eller kan den ikke bruges, når komponenterne ikke bliver indsat i rækkefølge og ikke skal komme lige efter hinanden ??
Du kan ikke indsætte dem på en bestemt position i cellen, hver komponent fylder hele cellen ud, GridLayout starter med at fylde op i første række og fortsætter med næste række når der ikke er mere plads i den første.
Skal de positioneres i cellen, er vi tilbage til GridBagLayout
public class JFrame_11 extends javax.swing.JFrame {
public JFrame_11() { initComponents(); }
private void initComponents() { jButton1 = new javax.swing.JButton("Bøf med løg"); jButton2 = new javax.swing.JButton("Ingen løg"); jButton3 = new javax.swing.JButton("Burger"); jButton4 = new javax.swing.JButton("Det skal bare være med det hele");
I et GridBagLayout kan du positionere en komponent INDENFOR cellen, men du kan kun positionere den i fht. verdenshjørner, du kan ikke samtidig positionere den på din frame, rækker/kolonner vil sandsynligvis aldrig blive lige store, da disse tilpasses den største komponent i rækken/kolonnen.
GridLayout deler framen op så alle komponeter, om muligt kan få samme størrelse
Er det vigtigt for dig at give komponenterne en nøjagtig position, må du bruge null Layout
public static void main(String[] args) { myWindow = new JFrame(); myWindow.setSize(400,250); myWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); myWindow.getContentPane().setLayout(new GridBagLayout()); myWindow.setForeground(Color.green); myWindow.setResizable(false);
jButton01 = new JButton("Te"); jButton02 = new JButton("Test"); jButton03 = new JButton("Testte"); jButton04 = new JButton("Testtest"); jButton05 = new JButton("Testtestte"); jButton06 = new JButton("Testtesttest"); jButton07 = new JButton("Testtesttestte"); jButton08 = new JButton("Testtesttesttest"); jLabel01 = new JLabel("Tes");jLabel01.setHorizontalAlignment(SwingConstants.RIGHT); jLabel03 = new JLabel("Testtestt");jLabel03.setHorizontalAlignment(SwingConstants.CENTER); jComboBox01 = new JComboBox(); textArea01 = new TextArea("",1,1);
for (int i=0;i<7;i++){ JButton testBut = new JButton(",.,.,.,.,.,.,.,.,.,.,.,."); myWindow.getContentPane().add(testBut,cb(i, 0, 1, 1)); } for (int i=1;i<8;i++){ JButton testBut = new JButton(".");testBut.setSize(400,400); myWindow.getContentPane().add(testBut,cb(0, i, 1, 1)); }
private static GridBagConstraints cb( int x, int y, int width, int height) { GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = x; gbc.gridy = y; gbc.gridwidth = width; gbc.gridheight = height; gbc.fill = GridBagConstraints.BOTH; gbc.weightx=width; gbc.weighty=height; return gbc; } }
Koden laver et vindue, hvor alle rækker og kolonner er stort set lige brede/højde, fordi der i toppen og siden er indsat nogle knapper, som sætter bredden/højden. Selvom andre komponenter er bredere eller smallere, bliver bredden fastholdt. Det samme vil jeg gerne lave uden de to for-løkker.
Det kan du ikke i et GridBagLayout, prøv at gøre følgende med dit eksempel
Udkommenter følgende linier //gbc.fill = GridBagConstraints.BOTH; //gbc.weightx=width; //gbc.weighty=height;
Så vil du se at kolonners/rækkers højde/bredde sættes efter den komponent som fylder mest i kolonnen/rækken, ved at bruge gbc.fill = GridBagConstraints.BOTH; opnår du at de komponenter som IKKE ville kunne fylde hele cellen ud, nu pludselig kommer til det
Dette er iøvrigt forbudt, da weightx og weighty skal have en værdi mellem 0 og 1 gbc.weightx=width; gbc.weighty=height;
Her er et eksempel på null Layout, hvilket bare er en Frame uden nogen LayoutManager
public class T extends javax.swing.JFrame {
public T() { initComponents(); }
private void initComponents() { jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); jButton3 = new javax.swing.JButton(); jButton4 = new javax.swing.JButton();
Ja, det ser faktisk rimeligt godt ud med null layout. Det kan godt være, at det var det jeg har brug for. Med hensyn til mit eksempel med GridBagLayout, kan du så ikke godt se, at det virker med de knapper der er indsat i kanten, så kolonnerne er lige bredde og rækkerne er lige høje ?? Er det ikke muligt at lave det uden knapperne i kanten ??
Det ser sådan ud, men er synsbedrag og skyldes udelukkende at du bruger gbc.fill = GridBagConstraints.BOTH;, som får dine knapper til at fylde hele cellen ud.
>>>Er det ikke muligt at lave det uden knapperne i kanten ?? Nej - du kan hverken lave det med eller uden knapper. Bredde/højde styres af den største komponent i kolonnen/rækken
GridBagLayout is one of the most flexible — and complex — layout managers the Java platform provides. A GridBagLayout places components in a grid of rows and columns, allowing specified components to span multiple rows or columns. Not all rows necessarily have the same height. Similarly, not all columns necessarily have the same width. Essentially, GridBagLayout places components in rectangles (cells) in a grid, and then uses the components' preferred sizes to determine how big the cells should be.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.