Toon posts:

[JAVA] Swing: JLabel bottom alignment?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben hier een beetje aan't knutselen met Java's Swing library. Hier is de situatie:

In een JFrame heb ik een Jpanel met hierin enkele JLabels (met elk een foto in met verschillende afmetingen). Nu wil ik die JLabels in het JPanel uitlijnen op de bodem. Ik heb in de Java API docs gezocht en met google... Mijn beste gok hiervoor is de volgende code:
code:
1
label.setAlignmentY(BOTTOM_ALIGNMENT);

Dit heeft echter geen effect... Kan iemand mij soms een hint in de goeie richting geven?

Alvast bedankt.

ps: ik gebruik hier een default FlowLayout... BoxLayout heb ik ook geprobeerd maar z'n Y_AXIS geeft ook niet het gewenste resultaat.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Kijk nou eens goed naar de documentatie

Verwijderd

Topicstarter
public void setVerticalTextPosition(int textPosition)Sets the vertical position of the label's text, relative to its image.
The default value of this property is CENTER.

public void setVerticalAlignment(int alignment)
Sets the alignment of the label's contents along the Y axis.
The default value of this property is CENTER.
Parameters:
alignment - One of the following constants defined in SwingConstants: TOP, CENTER (the default), or BOTTOM
Zorgt dus voor de uitlijning van de INHOUD in het JLabel... Hetgene ik wil bekomen is dat de HELE JLabels allemaal op de bodem uitgelijnd zijn van het JPanel (standaard zijn deze gecentreerd op de Y-as van het JPanel). Het zou dus misschien eerder de volgende code zijn (alhoewel deze ook niet het gewenste resultaat geeft):

Java:
1
paneel.setAlignmentY(BOTTOM_ALIGNMENT);

[ Voor 14% gewijzigd door Verwijderd op 15-10-2003 20:02 ]


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ok.. Ik zou dan gewoon een panel maken met een borderlayout en daar in de south een nieuwe panel plaatsen (met een flow layout bv) waarin je componenten komen te staan.

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Volgens mij wil hij geen informatie over hoe de tekst in de Jlabels te alignen, maar hoe de JLabels te alignen in een JPanel. Als dat het geval is, moet je even kijken naar de constructor van JPanel. Daarin staat een verwijzing naar LayoutManagers en daarin kun je als child vinden BorderLayout.

Over hoe hem te gebruiken heb je deze tutorial en dan vooral dit stuk

Als Alarmnummer toch de info geeft die je bedoeld, dan heb ik dit voor jan lul getiept :P
edit:
Jupz, voor lul getiept dus :+

Verwijderd

Topicstarter
Alarmnummer schreef op 15 oktober 2003 @ 17:54:
Ok.. Ik zou dan gewoon een panel maken met een borderlayout en daar in de south een nieuwe panel plaatsen (met een flow layout bv) waarin je componenten komen te staan.
Heb het geprobeerd, maar dit geeft echter hetzelfde visueel resultaat als een gewoon FlowLayout...

1. panel1 (FlowLayout of BorderLayout) met foto's staat in het gedeelte SOUTH van het panel2 (BorderLayout)

2. de componenten in panel1 staan echter nog altijd gecentreerd op de Y-as ipv uitgelijnd op de bodem...

:/ :?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Maak anders ff een tekening zodat we zien wat je wil.

Kijk trouwens ook eens naar FormLayout van http://www.jgoodies.com. Dit is een extreem krachtige layoutmanager.

Verwijderd

Topicstarter
Alarmnummer schreef op 15 October 2003 @ 18:53:
Maak anders ff een tekening zodat we zien wat je wil.

Kijk trouwens ook eens naar FormLayout van http://www.jgoodies.com. Dit is een extreem krachtige layoutmanager.
Hier is een tekening van het JFrame dat ik nu heb (JLabels gecentreerd op Y-as):

Afbeeldingslocatie: http://users.skynet.be/RS/ftp/default.gif


Hier is een tekening van het JFrame dat ik wil verkrijgen (JLabels uitgelijnd op bodem van JPanel):

Afbeeldingslocatie: http://users.skynet.be/RS/ftp/jframe.gif

FormLayout ziet er knap uit, maar dit probleem moet met de Swing LayoutManagers toch ook op een eenvoudige manier kunnen, denk ik? Het probleem lijkt me niet echt iets revolutionairs...

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Hmmz.. het snelste wat me nu te binnenschiet is het volgende.. Als je iets wilt allignen aan de onderkant.. dan dump je het in de south van een borderlayout panel. Als je dit met je plaatjes doet, dan heb je ze in ieder geval altijd onderin een panel zitten.

Nu hoef je alleen deze borderlayoutpanels te dumpen in een flowlayout panel (links naar rechts)

Verwijderd

Topicstarter
Hmmz.. het snelste wat me nu te binnenschiet is het volgende.. Als je iets wilt allignen aan de onderkant.. dan dump je het in de south van een borderlayout panel. Als je dit met je plaatjes doet, dan heb je ze in ieder geval altijd onderin een panel zitten.
De JLabels (met de verschillende foto erin) zitten elk in de south van een appart boderlayout panel. De foto's hebben elk appart een bottom alignment... Dus tot hier gaat het "goed"...
Nu hoef je alleen deze borderlayoutpanels te dumpen in een flowlayout panel (links naar rechts)
De borderlayout panels worden in een flowlayout panel naast elkaar gezet, MAAR hier worden de borderlayout panels DEFAULT gecentreerd op de Y-as... Alhoewel de foto's elk in de south van hun eigen panel staan... Dit komt omdat de panels van de foto's niet even hoog zijn...

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Probeer dit eens:
Afbeeldingslocatie: http://glimi.dezeserver.nl/got/jframe.jpg
Daarbij neem ik wel aan dat je het Groene JPanel op BorderLayout.SOUTH plaatst :)
Het Groene JPanel heeft intern gewoon een FlowLayout

[edit]
|:( Nee dan gooit ie het tweede zwarte JPanel natuurlijk naar boven. Ander zet je in het groene JPanel het zwarte JPanel links op BoderLayout.WEST, de middenste op SOUTH en de rechtse op EAST

[ Voor 50% gewijzigd door Glimi op 15-10-2003 21:20 ]


Verwijderd

Topicstarter
Glimi schreef op 15 October 2003 @ 21:13:
Probeer dit eens:
[afbeelding]
Daarbij neem ik wel aan dat je het Groene JPanel op BorderLayout.SOUTH plaatst :)
Het Groene JPanel heeft intern gewoon een FlowLayout

[edit]
|:( Nee dan gooit ie het tweede zwarte JPanel natuurlijk naar boven. Ander zet je in het groene JPanel het zwarte JPanel links op BoderLayout.WEST, de middenste op SOUTH en de rechtse op EAST
Nope zelfde resultaat... Ik heb het volgende geprobeerd:

1. Alle foto's (in een JLabel) elk in hun eigen BoderLayout.SOUTH panel
2. Deze 3 panels heb ik in het Groene BorderLayout.SOUTH panel geplaatst

Zoals je zegt... Alles wat er in het Groene BorderLayout.SOUTH panel geplaatst wordt, gedraagt zich alsof het gewoon in een FlowLayout staat... Alhoewel ze dus in een BorderLayout.SOUTH staan, zijn ze gecentreerd op de Y-as binnenin deze BorderLayout.SOUTH....

Zoals ik in 1 van m'n vorige post al zei... We zouden dit moeten oplossen met iets dat lijkt (en liefst ook werkt >:) ) als de volgende code:

code:
1
GroenPanel.setAlignmentVanAlleComponentenDieIkBevat(BOTTOM_ALIGNMENT);


Nu is de vraag met welke methode dit mogelijk is...

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Zo dan ;)

Afbeeldingslocatie: http://glimi.dezeserver.nl/got/jpanel2.gif
Dit heb ik aan de praat hier:
• Zwart omrand (niet echt goed te zien) zijn JPanels met de JButton op BorderLayout.SOUTH
• Groen omrand is een JPanel met een GridLayout met één rij en 3 kolommen. In deze kolommen zitten de zwart omrande JPanels
• Rood het JFrame met een BorderLayout en het groene JPanel op BorderLayout.SOUTH.

Hier de code.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class TestInterface extends JFrame {

    public static void main( String[] args ) {

        new TestInterface();
    }

    public TestInterface( ) {

        super("TestInterface");
        build();
        show();
    }

    public void build( ) {

        getContentPane().add( getGreenPanel() );
        setSize( 400,400 );

        addWindowListener( new WindowAdapter(){

            public void windowClosing(WindowEvent p_event){

                System.exit(0);
            }
        });
    }

    public JComponent getGreenPanel() {

        JPanel l_panel = new JPanel( new GridLayout(1, 3) );

        l_panel.add( getBlackPanel());
        l_panel.add( getBlackPanel());
        l_panel.add( getBlackPanel());
        return l_panel;
    }

    public JComponent getBlackPanel() {

        JPanel l_panel = new JPanel( new BorderLayout());
        l_panel.add( new JButton( "TestButton"), BorderLayout.SOUTH);
        return l_panel;
    }
}

Verwijderd

Topicstarter
Glimi schreef op 15 October 2003 @ 21:52:
Zo dan ;)

[afbeelding]
Dit heb ik aan de praat hier:
• Zwart omrand (niet echt goed te zien) zijn JPanels met de JButton op BorderLayout.SOUTH
• Groen omrand is een JPanel met een GridLayout met één rij en 3 kolommen. In deze kolommen zitten de zwart omrande JPanels
• Rood het JFrame met een BorderLayout en het groene JPanel op BorderLayout.SOUTH.

Hier de code.
Aha we zijn al een stap verder... Met die buttons krijg je een mooi resultaat omdat deze even groot zijn. De GridLayout neemt de grootte aan van het grootste component dat erin geplaatst wordt. Omdat ik dus met foto's van verschillende grootte werk krijg ik het volgende resultaat:

Afbeeldingslocatie: http://users.skynet.be/RS/ftp/jframe2.gif

Nu moet ik nog proberen om een VASTE spatie (vb. 20 pixels) tussen de foto's te krijgen... Dit lukte wel zonder de GridLayout dmv:

code:
1
label.setBorder(BorderFactory.createEmptyBorder(0,10,0,10));

Verwijderd

Topicstarter
Pffft... eindelijk heb ik hem zoals ik het wil!

BoxLayout was de goeie manager blijkbaar. Hier is de code die ik heb gebruikt:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Test extends JFrame{
    
    public Test(String titel, ImageIcon[] afb){
        super(titel);

        Container container = getContentPane();
        JPanel paneel = new JPanel();
        paneel.setLayout(new BoxLayout(paneel, BoxLayout.X_AXIS));
        paneel.add(Box.createRigidArea(new Dimension(20,0)));

        for (int i = 0; i < afb.length; i++){
            JLabel fotoLabel = new JLabel(afb[i]);
            fotoLabel.setAlignmentY(BOTTOM_ALIGNMENT);
            paneel.add(fotoLabel);
            paneel.add(Box.createRigidArea(new Dimension(20,0)));
        }
        container.add(paneel);
        pack();
    }
}


M'n eerste gedachte om de volgende code te gebruiken was dus blijkbaar toch niet zo'n slechte :D :

code:
1
fotoLabel.setAlignmentY(BOTTOM_ALIGNMENT);


Alleen heeft die dus geen invloed bij de default FlowLayout |:(

Toch bedankt om mee te zoeken naar de oplossing voor dit probleem!

Cheers. ;)
Pagina: 1