Avatar billede akjaer Nybegynder
04. august 2005 - 23:04 Der er 10 kommentarer

Layout problem

Jeg har kun relativ begrænset erfaring med layout managers i Java. Jeg har via et SpringLayout og via klassen SpringUtilities (http://java.sun.com/docs/books/tutorial/uiswing/layout/example-1dot4/SpringUtilities.java) lavet en form til indtastning af oplysninger.

Panelet, der er lavet via klassen ”StandardForm extends JPanel”, ser ud på følgende måde:

JLabel: JTextField
JLabel: JTextField
JLabel: JTextField
...
...
JLabel: JTextField

Antallet af linjer bestående af en JLabel og et JTextField afhænger af de argumenter, som constructoren bliver fodret med.

Jeg har her på nedenstående billede indsat 3 instanser af StandardForm med forskellige antal linjer i et FlowLayout. På billedet ses det, hvordan de 3 forme bliver placeret, og samtidigt ses det også, hvordan jeg ønsker, at de skal placeres:

http://www.akjaer.dk/pic1.PNG

Alle forms skal altså alle starte i samme niveau. At de starter i samme niveau må dog ikke medføre, at de har ændret størrelse. Placeringen skal altså være på præcis samme måde, som den ”klippe-klistrede” del af billede, der er lavet i paint.

Er der en Layout Manager, en bestemt indstilling eller et eller andet, der gør, at jeg på en relativ nem måde opnår det ønskede?
Avatar billede jesper2009 Nybegynder
05. august 2005 - 06:43 #1
Hej
Det ser ud til at du kan bruge metoden i SpringLayout der ser således ud:
putConstraint(String e1, Component c1, int pad, String e2, Component c2)

F.ek.s:

SpringLayout layout;
...
// Placer mit tekstfelt (myTF) 5 pixels fra toppen af den Component den ligger
// inde i (parent).   
layout.putConstraint(SpringLayout.NORTH, myTF, 5, SpringLayout.NORTH, parent);

// Placer mit tekstfelt (myTF) 5 pixels fra venstresiden af den Component den ligger
// inde i (parent).   
layout.putConstraint(SpringLayout.WEST, myTF, 5, SpringLayout.WEST, parent);

Se makeGrid metoden - her sendes parent med ned.

Håber det hjælper lidt?
/J
Avatar billede jesper2009 Nybegynder
05. august 2005 - 06:45 #2
Avatar billede akjaer Nybegynder
05. august 2005 - 17:20 #3
Jeg har nu prøvet at lege lidt med det. Placeringen ser perfekt ud. Problemet er bare, at pack() i min JFrame ikke virker. Dvs. min frame bliver lavet i en størrelse, hvor man kun kan se x'et oppe i højre hjørne og intet andet. Hvilke constraints skal jeg smide på for at få pack til at virke?

Min kode ser sådan her ud:

public class MainPanel extends JPanel{

    protected MainPanel(){
       
        setLayout(new BorderLayout());
       
        SpringLayout centerLayout = new SpringLayout();
       
        JPanel centerPanel = new JPanel(centerLayout);
       
       
        StandardForm form1 = new StandardForm(new String[] {"linje 1", "linje 2"},10,false);
        centerLayout.putConstraint(SpringLayout.WEST, form1, 5, SpringLayout.WEST, centerPanel);
        centerLayout.putConstraint(SpringLayout.NORTH, form1, 5, SpringLayout.NORTH, centerPanel);
        centerPanel.add(form1);
       
        StandardForm form2 = new StandardForm(new String[] {"linje 1", "linje 2", "linje 3"},10,false);
        centerLayout.putConstraint(SpringLayout.WEST, form2, 5, SpringLayout.EAST, form1);
        centerLayout.putConstraint(SpringLayout.NORTH, form2, 5, SpringLayout.NORTH, centerPanel);
        centerPanel.add(form2);

       
        StandardForm form3 = new StandardForm(new String[] {"linje 1", "linje 2", "linje 3", "linje 4"},10,false);
        centerLayout.putConstraint(SpringLayout.WEST, form3, 5, SpringLayout.EAST, form2);
        centerLayout.putConstraint(SpringLayout.NORTH, form3, 5, SpringLayout.NORTH, centerPanel);
        centerPanel.add(form3);
                               
        add(centerPanel, "Center");

   
       
    }
} // MainPanel
Avatar billede akjaer Nybegynder
06. august 2005 - 00:28 #4
Hvis jeg giver points, så bliver det nok først efter mandag 8 dage. Jeg får nemlig ikke lige den store mulighed for online-tid inden da.

jesper2009 - jeg accepterer, hvis du kan løse ovenstående problem mht. pack, der ikke virker :)
Avatar billede jesper2009 Nybegynder
06. august 2005 - 10:36 #5
Nu kan jeg ikke helt se hvad der sker men kalder du pack som det sidste du gør med din JFrame? Du kan også kigge på om de indre komponenter bliver layoutet før pack kaldes.
Avatar billede akjaer Nybegynder
16. august 2005 - 00:02 #6
Så er jeg tilbage :)

Jeg kalder pack som det sidste.

De 3 formes komponenter har alle et layout
Avatar billede jesper2009 Nybegynder
16. august 2005 - 10:53 #7
Avatar billede akjaer Nybegynder
16. august 2005 - 14:39 #8
Jeg skulle mene, at alle komponenter har et layout.

Her er constructoren til min klasse, der bruges til mine forms:

========================================================
========================================================

public class StandardForm extends JPanel{
   
    // Number of text fields and number of labels
    private int formHeight;
   
    // Text fields to enter information
    private JTextField[] textFields;
   
    // Labels for the text fields
    private JLabel[] labels;
   
    /**************************************************************
    * Constructor
    * labelText         = text for the labels
    * textFieldWidth     = the width of each JTextField
    * trailing            => labels: align right
    ****************************************************************/
    protected StandardForm(String[] labelText, int textFieldWidth, boolean trailing){
       
        super(new SpringLayout());
       
       
        formHeight = labelText.length;

        labels         = new JLabel[formHeight];
        textFields     = new JTextField[formHeight];
       
       
        // Makes the labels and the text fields
        for (int i = 0; i < formHeight; i++) {
           
            if(trailing) // align right
                labels[i] = new JLabel(labelText[i],JLabel.TRAILING);
           
            else // align left
                labels[i] = new JLabel(labelText[i]);
               
            add(labels[i]);
            textFields[i] = new JTextField(textFieldWidth);
            labels[i].setLabelFor(textFields[i]);
            add(textFields[i]);
        }
       
        // SpringerLayout settings using the SpringerUtilities class
        SpringUtilities.makeCompactGrid(
        this,
                formHeight, 2,     //rows, cols
                6, 6,            //initX, initY
                6, 6        //xPad, yPad
        );   

       
   
    } // Constructor

========================================================
========================================================

Udover det har jeg bare min MainFrame, der viser mit MainPanel i "Center" og en klasse, der indeholder en main-metode.
Avatar billede jesper2009 Nybegynder
20. august 2005 - 11:40 #9
pack() bliver ikke kaldt efter du har kaldt makeCompactGrid. Generelt skal man bede swing/awt faktisk om at lave layoutet. Det gøres med doLayout() eller - som det ser ud til med pack().
Avatar billede akjaer Nybegynder
20. august 2005 - 13:42 #10
Jeg kalder pack i min frame.

At tilføje doLayout på mine forskellige paneler og på min frame gør ingen forskel.
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