Avatar billede rapstam Nybegynder
04. december 2004 - 13:17 Der er 15 kommentarer og
1 løsning

placering i swing

Jeg har et problem med at swing ikke rigtigt viser de ting jeg vil have vist - Layoutet er bygget op som borderlayout med north, center, south og center delen er inddelt i north og south.

kortfattet kode:

hoveddelen:
    public Main(){
        ...
    ReserveLayout r = new ReserveLayout();       
    Container content = frame.getContentPane();   
    JTabbedPane pane = new JTabbedPane();
        pane.add("Reserve", r.center);
        ...
}

layout til center delen

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//implements ActionListener

class ReserveLayout extends JPanel  {

    JPanel center, bottom;
    JButton submitButton, resetButton;

    ReserveLayout(){
        Reserve r = new Reserve();
        center = new JPanel();
        bottom = new JPanel();
        center.setLayout(new BorderLayout());

       
        // sets up the SOUTH area
        submitButton = new JButton("Submit");
        resetButton  = new JButton("Reset");
        bottom.add(submitButton);
        bottom.add(resetButton);
        bottom.setBorder(BorderFactory.createEtchedBorder());
       
        // set the current element to center panel       
        center.add(r, BorderLayout.NORTH);
        center.add(bottom, BorderLayout.SOUTH);
    }
}

og selve teksten der fucker up:

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

class Reserve extends JPanel {   
    JPanel panel;
    JLabel nameLabel;
    JLabel passengerLabel;
   
    JTextField nameField;
    JTextField passengerField;


    Reserve(){   
    panel = new JPanel();
    nameLabel = new JLabel("Flightname");
    nameField = new JTextField();
    passengerLabel = new JLabel("Passengers");
    passengerField = new JTextField();
   
    add(nameLabel);
    add(nameField);
    add(passengerLabel);
    add(passengerField);
    }
   
    public void doLayout(){       
    nameLabel.setBounds(10,10,160,30);
    nameField.setBounds(120,15,270,20);
    passengerLabel.setBounds(10,40,160,30);
    passengerField.setBounds(120,45,30,20);   
    }
   
    public void reset(){
    nameField.setText("");   
    passengerField.setText("");   
    }
   
}

problemet ligger i at jeg kun kan se feltet nameLabel og nameFiled - har prøvet mig frem med alverdens forskellige parametre, men uden succes
Avatar billede mikkelbm Nybegynder
04. december 2004 - 13:23 #1
Prøv lige:

public void doLayout()
{
    setLayout(null);       
    nameLabel.setBounds(10,10,160,30);
    nameField.setBounds(120,15,270,20);
    passengerLabel.setBounds(10,40,160,30);
    passengerField.setBounds(120,45,30,20);   
}
Avatar billede mikkelbm Nybegynder
04. december 2004 - 13:24 #2
Eller måske bedre at sætte layout inden du adder dem:
...
setLayout(null);

add(nameLabel);
add(nameField);
add(passengerLabel);
add(passengerField);
...
Avatar billede mikkelbm Nybegynder
04. december 2004 - 13:26 #3
Og jeg synes heller ikke jeg lige umiddelbart kan se, at du kalder din doLayout() nogen steder !?
Avatar billede mikkelbm Nybegynder
04. december 2004 - 13:27 #4
Så måske din constructor skal se sådan her ud:

Reserve(){   
    panel = new JPanel();
    nameLabel = new JLabel("Flightname");
    nameField = new JTextField();
    passengerLabel = new JLabel("Passengers");
    passengerField = new JTextField();
 
    setLayout(null); // Sætter null-layout så du selv kan bestemme koordinater
   
    add(nameLabel);
    add(nameField);
    add(passengerLabel);
    add(passengerField);

    doLayout(); // Denne kan jeg ikke se andre steder
    }
Avatar billede rapstam Nybegynder
04. december 2004 - 13:28 #5
Så forsvinder teksten helt .. for begge tilfælde med setLayout(null)
Avatar billede mikkelbm Nybegynder
04. december 2004 - 13:29 #6
Ja, hvis du sætter null-layout bliver du tvunget til at sætte koordinater på hver komponent. Men det har du jo også gjort i din doLayout() - som du dog aldrig kalder. Derfor bliver de ikke placeret nogle steder.
Avatar billede rapstam Nybegynder
04. december 2004 - 13:31 #7
Så vidt jeg forstår skal doLayout bare overrides - så den eksekveres automatisk, men umiddelbart lyder setLayout(null), fint, men det medfører bare at der ikke bliver skrevet noget
Avatar billede mikkelbm Nybegynder
04. december 2004 - 13:34 #8
Hmmm - ja, du har vist ret mht doLayout() (har dog aldrig selv brugt den på den måde)
Prøv lige at kald den metode noget andet og kald den så i din contructor som jeg viste i mit eksempel. Så burde det virke.
Avatar billede rapstam Nybegynder
04. december 2004 - 13:35 #9
hov ... har fået det til at virke - problemet er at man også skal override to andre:

    public Dimension getPreferredSize(){       
        return new Dimension(300, 200);       
    }
   
    public Dimension getMinimumSize() {
        return new Dimension(300, 200);   
    }
Avatar billede rapstam Nybegynder
04. december 2004 - 13:35 #10
men tak for hjælpen anyway - pointene er dine
Avatar billede mikkelbm Nybegynder
04. december 2004 - 13:36 #11
Ja, eller bare sætte preferredsize :)
Måske lidt mere naturligt.

setPreferredSize (300, 200);
Avatar billede mikkelbm Nybegynder
04. december 2004 - 13:38 #12
Prøv lige at lave:

center.add(r, BorderLayout.NORTH);

om til

center.add(r, BorderLayout.CENTER);

Og slet så dine overskrevne metoder med størrelsen
På den måde tror jeg også det virker...
Avatar billede rapstam Nybegynder
04. december 2004 - 13:38 #13
det virker - men den har det nu bedst med getPref.. og get Mini.. Overriding er og bliver djævlens værk - udelukkende implementeret i sproget så java.sun.com for tusindevis at daglige hits :)
Avatar billede rapstam Nybegynder
04. december 2004 - 13:41 #14
jep - det virker når det bliver smidt ind på CENTER istedet - tnx
Avatar billede mikkelbm Nybegynder
04. december 2004 - 13:41 #15
Arv og overskrivning af metoder mener jeg er en af de helt store fordele ved et sprog som Java. Man skal bare lige finde fidusen i det ;)
Avatar billede rapstam Nybegynder
04. december 2004 - 13:42 #16
Korrekt - det er essensen, men det er netop også det der giver grå hår :)
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