Avatar billede hobz Nybegynder
09. marts 2005 - 11:52 Der er 13 kommentarer og
1 løsning

Problemer med setLayout

Jeg henter et JPanel fra en klasse over i en anden klasse, og lægger JPanelet ind i et nyt panel i denne anden klasse.
Mit problem er, at jeg tilsyneladende KUN kan bruge LayoutManageren FlowLayout og ingen andre.
Hvis ikke JPanel fra klasse nr. 1 ikke er FlowLayout, vises det simpelthen ikke i klasse nr. 2.

Hvordan kan jeg få et JPanel med setLayout(null) fra klasse1, addet til et andet JPanel i klasse2?
Avatar billede kalp Novice
09. marts 2005 - 12:03 #1
" og lægger JPanelet ind i et nyt panel i denne anden klasse. "

hvad med der ligger et panel i forvejen men bliver erstattet af det nye? måske virker det.

Og hvilket layout har dit panel i klasse 2?
Avatar billede hobz Nybegynder
09. marts 2005 - 12:06 #2
Jeg bruger en en del klasser der allesammen lavet en JPanel, som lægges ind i et 'masterpanel' der kan sætte hvilket et af dem der skal være synligt.
Jeg skal altså ikke overskrive nogle panels, kun add'e til masterpanelet.

Masterpanelet har null layout.
Avatar billede kalp Novice
09. marts 2005 - 12:08 #3
okay:) det kan jeg ikke komme med nogen fornuftige bud på lige nu uden selv lige at prøve mig frem men sidder ikke med mine værktøjer lige nu:|
Avatar billede _carsten Nybegynder
09. marts 2005 - 13:14 #4
Du ved godt at du skal bruge setBounds(x,y,w,h) når du bruger nullLayout - eller hvad ???
Avatar billede _carsten Nybegynder
09. marts 2005 - 13:32 #5
Eks:

I masterpanel, hvor du har addet panel XXXPanel

XXXPanel.setBounds(40,40,200,200);
Avatar billede hobz Nybegynder
10. marts 2005 - 09:25 #6
Det afhjælper ikke problemet.
Avatar billede _carsten Nybegynder
10. marts 2005 - 09:37 #7
Så er vi der henne hvor vi skal se noget kode, men jeg får tidligst kigget på det til aften.
Avatar billede _carsten Nybegynder
13. marts 2005 - 22:09 #9
Ja - det blev så lige aften et par gange.

Du skal nok starte med at kigge i lærebogen en gang mere, du får rodet tingene lidt sammen, jeg vil ikke kommentere hele koden eller rette i den, men istedet give et eksempel.

Lad os tage udgangspunkt i din egen klasse SubPanel, hvis SubPanel skal give sig ud for at være et panel, skal du lade klassen extende JPanel og bruge den som et JPanel, men det tjener kun et formål hvis det JPanel skal have tilføjet/ændret sin oprindelige funktionalitet, det kunne være en masse komponenter man ville tilføje og derefter adde panelet til en JFrame

Eks.

import javax.swing.*;

public class SubPanel extends JPanel{
    public SubPanel(){
      add(new JLabel("TEST 1");
      add(new JLabel("TEST 2");
      add(new JLabel("TEST 3");
    }
}

public class MyFrame extends JFrame{
    public MyFrame(){
        getContentPane().add(new SubPanel());
    }

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

Klassen SubPanel er nu at betragte som et JPanel, jeg har bare ændret lidt i funktionaliteten, da dette JPanel ALTID indeholder 3 JLabels - ved ikke om det fremmer forståelsen, men bedre kan jeg ikke gøre det
Avatar billede hobz Nybegynder
15. marts 2005 - 15:11 #10
Okay, nu har jeg fået det til at virke.
Dog er et nyt problem opstået. Jeg kan ikke skifte visibility på panlerne inde fra LoginPanel.

Hvordan laver man normalt det, at kunne loade forskellige panels ind i een JFrame?
Avatar billede _carsten Nybegynder
15. marts 2005 - 20:24 #11
Der er mange måder at gøre det på, det afhænger meget af hvad du har gang i, normalt ville jeg aldrig skifte paneler i en gui, da det kan give flimmer, skulle jeg endelig gøre det ville jeg bruge CardLayout, hvilket indebærer at mine paneler får nøjagtig den samme størrelse. En nem løsning er dog (hvis man kan leve med det) simpelthen bare at adde og remove de JPanels der er behov for, når det er gjort kommer det aller vigtigste, nemlig at få valideret sit layout igen.

Eks

JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
JPanel panel3 = new JPanel();
JPanel panel4 = new JPanel();

add(panel1);
add(panel2);
add(panel3);
add(panel4);

Her kan du bytte ud

remove(panel2);
remove(panel4);

getLayout().validate();  // VIGTIGT
Avatar billede hobz Nybegynder
15. marts 2005 - 20:31 #12
Ok. Jeg siger mange tak for dine input og din tid.
Hvis du lægger svar kan jeg komme af med pointene.
Avatar billede hobz Nybegynder
15. marts 2005 - 20:47 #13
Hvordan ville du så lave en gui?
Avatar billede _carsten Nybegynder
15. marts 2005 - 21:04 #14
Hvis du skal skifte mellem mange paneler, så brug CardLayout, det fungerer på samme måde som et spil kort, kun det øverste er synligt, alle kort har samme størrelse og et hvilket som helst kort kan hives ud af bunken og lægges øverst.
Så du laver bare nogle paneler som så fungerer som kort i et CardLayout.

Du har selvfølgelig også mulighed for at bruge faner (JTabbedPane).

For at gøre en gui "rolig" er det vigtigt at alle komponenter forbliver på samme plads og ikke ændrer størrelse og kun om nødvendigt gøres synlige/usynlige, ellers bruges en af ovenstånde muligheder, derved tvinges brugeren til selv at ændre skærmbilledet, og det bliver derfor en naturlig oplevelse for brugeren.
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