Avatar billede stigc Nybegynder
05. oktober 2004 - 20:43 Der er 7 kommentarer og
1 løsning

GridBagLayout og at fordele 50/50

jeg bruger GridBagLayout og placerer to JPanels der skal dele bredden med 50% hver. Panelerne indeholder tekster, der bliver sat løbende. Koden ser sådan her ud, hvor p1 og p2 er de to paneler.

        c.gridx = 0;
        c.gridy = ++row;
        c.gridwidth = 1;
        c.weighty = 0;       
        c.weightx = 0.5;
        getContentPane().add(p1, c);
        c.gridx = 1;
        getContentPane().add(p2, c);
   
Problemet er at de ikke deler bredden 50/50, men at fordelingen ændre sig basert på hvilket panel der indeholder den længeste tekst. Hvordan undgår jeg dette?
Avatar billede _carsten Nybegynder
05. oktober 2004 - 22:30 #1
Når du bruger c.weighty og c.weightx skal du som udgangspunkt sætte størrelsen på dine paneler, det gælder alle 3.
  setPreferredSize()
  setMinimumSize()
  setMaximumSize()

c.weightx = 0.5;  er faktisk en meget høj værdi, prøv at ændre til c.weightx = 0.01;
                  hvilket vil give langt bedre performance, og når vi snakker 50/50
                  er 0.01 rigeligt.



Alternativet er GridLayout
Avatar billede _carsten Nybegynder
05. oktober 2004 - 22:37 #2
Glemte måske lige at du selvfølgelig skal lade panelerne fylde hele cellen

c.fill = java.awt.GridBagConstraints.BOTH
Avatar billede 5floor Nybegynder
05. oktober 2004 - 22:43 #3
Jeg bruger selv null-layout (se ex. http://javabog.dk/OOP/kapitel11.html#afsn11.6.1) til placering af forskellige paneler, buttons osv.
Ved godt at det ikke besvarer dit spørgsmål, men nævner det alligevel, da jeg personligt finder det x100 nemmere at sætte tingene op med samt redigere i.
God arbejdslyst.

Mads
Avatar billede _carsten Nybegynder
05. oktober 2004 - 22:55 #4
Så vanskeligt er det nu heller ikke

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


public class Exp547213 extends javax.swing.JFrame {
   
    public Exp547213() {
        initComponents();
    }
   
    private void initComponents() {
        GridBagConstraints gbc = new GridBagConstraints();

        jPanel1 = new JPanel();
        jPanel2 = new JPanel();
        jLabel1 = new JLabel();
        jLabel2 = new JLabel();

        getContentPane().setLayout(new GridBagLayout());

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
                exitForm(evt);
            }
        });

        jPanel1.setBackground(new Color(255, 51, 0));
        jPanel1.setPreferredSize(new Dimension(300,300));
        jPanel1.setMaximumSize(new Dimension(300,300));
        jPanel1.setMinimumSize(new Dimension(300,300));
        jLabel2.setText("Kort tekst");
        jPanel1.add(jLabel2);

        gbc = new GridBagConstraints();
        gbc.fill = gbc.BOTH;
        gbc.weightx = 0.01;
        gbc.weighty = 0.01;
        getContentPane().add(jPanel1, gbc);

        jPanel2.setBackground(new Color(51, 153, 255));
        jPanel2.setPreferredSize(new Dimension(300,300));
        jPanel2.setMaximumSize(new Dimension(300,300));
        jPanel2.setMinimumSize(new Dimension(300,300));
        jLabel1.setText("Dette er en temmelig lang tekst");
        jPanel2.add(jLabel1);

        gbc = new GridBagConstraints();
        gbc.fill = gbc.BOTH;
        gbc.weightx = 0.01;
        gbc.weighty = 0.01;
        getContentPane().add(jPanel2, gbc);

        pack();
    }

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

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

    private JLabel jLabel1;
    private JLabel jLabel2;
    private JPanel jPanel1;
    private JPanel jPanel2;
}
Avatar billede stigc Nybegynder
06. oktober 2004 - 17:54 #5
Hej Carsten. Jeg fandt også ud af at jeg kunne få en helt lige fordeling ved at bruge setMaximumSize. Men jeg vil godt lade mit paneler vokse (i hvert tilfælde i højden) alt efter indhold. Internet i panelet bruges BoxLayout.Y_AXIS, hvilket afskærer tekster i bredden, når de er breddere end panelet, og samtidigt tilpasser højden efter antal linier.

Mener du det med "weightx" og at man skal bruge lave værdier? Hvis ja, så begrund det, så jeg forstår!
Avatar billede stigc Nybegynder
06. oktober 2004 - 17:57 #6
Og det var "setMinimumSize" der gav mig en lige fordeling. Men dermed skal jeg også opgive højden! Det ønsker jeg ikke.
Avatar billede _carsten Nybegynder
06. oktober 2004 - 22:29 #7
Ja, jeg mener man skal bruge lave x/y værdier men, at begrunde det på en forståelig måde, er straks meget værre. Du vil opleve betydningen af lave/høje x/y værdier i en tung gui med et GridBagLayout som indeholder flere end 2 x 2 celler og hvor hver komponent skal have forskellig dimension og tillige er forskellige mht. om de skal fylde cellen ud i henholdsvis højde og/eller bredde. Her vil du, godt nok kun i brøkdele af sekunder kunne opleve at komponenterne lige som "glider" ud på deres respektive pladser. Så min erfaring med GridBagLayout, siger lave værdier.

Hvis du har sat din komponent til at fylde hele cellen ud, vil den ALTID gøre det, UANSET hvad du har sat MinimumSize, MaximumSize og PreferredSize til og du vil derfor altid kunne ydnytte hele højden/ bredden. Så du opgiver/ mister altså ikke højden når du bruger setMaximumSize.

En min/max størrelse er nødvendig for at GridBagLayoutet kan finde ud af hvor den eventuelle EKSTRA plads skal anvendes.


Jeg sætter altid PreferredSize på mine komponenter på "normal" vis,
min. og max. gøres efter følgende model

            java.awt.Component[] c = panel.getComponents();
           
            for(int i = 0; i < c.length; i++){
                c[i].setMinimumSize( c[i].getPreferredSize() );
                c[i].setMaximumSize( c[i].getPreferredSize() );
            }
Avatar billede _carsten Nybegynder
06. oktober 2004 - 22:32 #8
Det er nok det tætteste jeg kommer på en forklaring
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