Avatar billede r.hegaard Nybegynder
13. oktober 2004 - 18:08 Der 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 ??
Avatar billede _carsten Nybegynder
13. oktober 2004 - 19:23 #1
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.

http://java.sun.com/docs/books/tutorial/uiswing/layout/grid.html
Avatar billede r.hegaard Nybegynder
13. oktober 2004 - 19:51 #2
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 ??
Avatar billede _carsten Nybegynder
13. oktober 2004 - 19:57 #3
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
Avatar billede r.hegaard Nybegynder
13. oktober 2004 - 19:59 #4
OK, hvordan kan jeg så gøre, så cellerne får samme højde og bredde ??
Avatar billede _carsten Nybegynder
13. oktober 2004 - 20:03 #5
Du sætter bare størrelsen på én af komponenterne med setPreferredSize(80,80)

Så får alle komponenter den størrelse
Avatar billede _carsten Nybegynder
13. oktober 2004 - 20:08 #6
Her er et eksempel

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");

        getContentPane().setLayout(new java.awt.GridLayout(2, 2));

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jButton1.setText("jButton1");
        jButton1.setPreferredSize(new java.awt.Dimension(250, 250));
        getContentPane().add(jButton1);

        jButton2.setText("jButton2");
        getContentPane().add(jButton2);

        jButton3.setText("jButton3");
        getContentPane().add(jButton3);

        jButton4.setText("jButton4");
        getContentPane().add(jButton4);

        pack();
    }

    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

    public static void main(String args[]) {
        new JFrame_11().show();
    }

    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton4;
}
Avatar billede _carsten Nybegynder
13. oktober 2004 - 20:13 #7
Hov - glemte lige at fjerne disse linier:  jButton1.setText("jButton...");
Avatar billede r.hegaard Nybegynder
13. oktober 2004 - 20:18 #8
Ja, men det er jo også med GridLayout ??
Avatar billede _carsten Nybegynder
13. oktober 2004 - 20:22 #9
Skulle det ikke være det ???
Avatar billede r.hegaard Nybegynder
13. oktober 2004 - 20:29 #10
Nej, det virkede jo ikke, da det hele så blev placeret i rækkefølge - og så skrev du, at så måtte vi tilbage til GridBagLayout.
Avatar billede _carsten Nybegynder
13. oktober 2004 - 20:52 #11
Tror jeg har misforstået dig

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

Ellers fatter jeg ikke en bjælde!
Avatar billede r.hegaard Nybegynder
14. oktober 2004 - 17:10 #12
Hej Carsten
Her er et eksempel på en kode:

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

public class TestWindow
{
    private static JFrame      myWindow;
    private static JButton      jButton01;
    private static JButton      jButton02;
    private static JButton      jButton03;
    private static JButton      jButton04;
    private static JButton      jButton05;
    private static JButton      jButton06;
    private static JButton      jButton07;
    private static JButton      jButton08;
    public  static JLabel      jLabel01;
    public  static JLabel      jLabel03;
    public  static JComboBox    jComboBox01;
    private static TextArea    textArea01;

    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));
        }

        myWindow.getContentPane().add(jButton01,    cb( 3, 1, 2, 1));
        myWindow.getContentPane().add(jButton02,    cb( 5, 1, 2, 1));
        myWindow.getContentPane().add(jLabel01,    cb( 1, 2, 2, 1));
        myWindow.getContentPane().add(jComboBox01,  cb( 3, 2, 2, 1));
        myWindow.getContentPane().add(jButton03,    cb( 5, 2, 2, 1));
        myWindow.getContentPane().add(jButton04,    cb( 4, 3, 2, 1));
        myWindow.getContentPane().add(jLabel03,    cb( 1, 4, 4, 1));
        myWindow.getContentPane().add(textArea01,  cb( 5, 4, 2, 4));
        myWindow.getContentPane().add(jButton05,    cb( 1, 5, 2, 1));
        myWindow.getContentPane().add(jButton06,    cb( 3, 5, 2, 1));
        myWindow.getContentPane().add(jButton07,    cb( 1, 6, 3, 1));
        myWindow.getContentPane().add(jButton08,    cb( 2, 7, 2, 1));
        myWindow.setVisible(true);
    }
   
    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.

Hvad er null Layout ??
Avatar billede _carsten Nybegynder
14. oktober 2004 - 21:51 #13
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();

        getContentPane().setLayout(null);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jButton1.setText("jButton1");
        getContentPane().add(jButton1);
        jButton1.setBounds(0, 0, 100, 23);

        jButton2.setText("jButton2");
        getContentPane().add(jButton2);
        jButton2.setBounds(110, 0, 100, 23);

        jButton3.setText("jButton3");
        getContentPane().add(jButton3);
        jButton3.setBounds(220, 0, 100, 23);

        jButton4.setText("jButton4");
        getContentPane().add(jButton4);
        jButton4.setBounds(0, 30, 320, 23);

        pack();
    }
   

    public static void main(String args[]) {
        new T().setVisible(true);
    }

    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton4;
}
Avatar billede r.hegaard Nybegynder
15. oktober 2004 - 09:18 #14
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 ??
Avatar billede _carsten Nybegynder
15. oktober 2004 - 11:09 #15
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

http://java.sun.com/docs/books/tutorial/uiswing/layout/gridbag.html

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.
Avatar billede _carsten Nybegynder
15. oktober 2004 - 11:13 #16
Du kunne jo egentlig også tage et kig på SpringLayout

http://java.sun.com/docs/books/tutorial/uiswing/layout/spring.html
Avatar billede r.hegaard Nybegynder
15. oktober 2004 - 11:22 #17
OK, tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester