AlignmentY bei FlowLayout

fjk88

Mitglied
Mein Problem ist simple, dennoch habe ich noch keine Lösung gefunden.

Ich habe ein kleines Testprogramm geschrieben, dass 3 Buttons (unterschiedlicher Größe) in einem Flowlayout anzeigt.

db0dbb8168.png


das Program sieht wie folgt aus:

Java:
import java.awt.* ;
import javax.swing.*;

public class XAxisAlignY extends JFrame
{
   private JButton button1 = new JButton("Button 1");
   private JButton button2 = new JButton("Button 2");
   private JButton button3 = new JButton("Button 3");

   public XAxisAlignY()
   {
      this.getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT, 20, 20));

      button1.setBackground( Color.cyan );
      button1.setPreferredSize( new Dimension(80,60) ) ;
      this.getContentPane().add(button1);

      button2.setBackground( Color.yellow );
      button2.setPreferredSize( new Dimension(120,40) ) ;
      this.getContentPane().add(button2, BorderLayout.NORTH);

      button3.setBackground( Color.green );
      button3.setPreferredSize( new Dimension(100,80) ) ;
      this.getContentPane().add(button3, BorderLayout.EAST);

      initFrame() ;
   }

   private void initFrame()
   {
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
      setSize(500,250);
      setVisible(true);
   }

   public static void main (String[] args)
   {
     new XAxisAlignY();
   }
}


Ich möchte allerdings, dass alle Buttons von der obersten Position weg gezeichnet werden, Also ein TOPAlignment.
In dem oberen Bild ist das YAlignment CENTER, in dem folgenden Bild, ist das YAlignment TOP, genau soetwas will ich haben.


5890f21355.png
 
Zuletzt bearbeitet:

fjk88

Mitglied
die Frage lautet: wie lassen sich alle Auttons in einem Flowlayout so anordnen, dass alle an der obersten Linie beginnen siehe 2. Bild.
 
S

SlaterB

Gast
in der Tat nicht so leicht, FlowLayout hast du dir in der API hoffentlich angeschaut,
da gibt es noch setAlignOnBaseline(), was aber wohl eher nur nach unten was bewirkt, wenn überhaupt,
ist Java 1.6, kann ich grad nicht testen

ansonsten brauchst du wohl ein anderes Layout, notfalls GridBagLayout,
als Denkanstoß noch eine Bastellei, füge alle Buttons mit dieser Methode hinzu und schaue dir das Ergebnis an
Java:
    private void addB(JButton b) {
        JPanel p = new JPanel();
        p.add(b);
        p.setPreferredSize(new Dimension(b.getPreferredSize().width,100));
        p.setBorder(BorderFactory.createLineBorder(Color.BLUE));
        getContentPane().add(p);
    }

Lesson: Laying Out Components Within a Container (The Java™ Tutorials > Creating a GUI With JFC/Swing)
 

fjk88

Mitglied
als Denkanstoß noch eine Bastellei, füge alle Buttons mit dieser Methode hinzu und schaue dir das Ergebnis an
Java:
    private void addB(JButton b) 
    {
        JPanel p = new JPanel();
        p.add(b);
        p.setPreferredSize(new Dimension(b.getPreferredSize().width,100));
        p.setBorder(BorderFactory.createLineBorder(Color.BLUE));
        getContentPane().add(p);
    }


hab das Programm kurz probiert und es funktioniert! Allerdings verstehe ich nicht, wieso man die PreferredSize des ButtonPanels nicht gleich der, des Buttons lassen kann.

Java:
setPreferredSize(new Dimension(b.getPreferredSize().width,b.getPreferredSize().height+5));

wenn ich das +5 für die Höhe nicht dazuaddiere, wird nicht der komplette Button gezeichnet (das gleiche gilt, wenn ich nur 4, 3, 2, oder 1 addiere, es müssen mindestens 5 sein, bis der Button richtig gezeichnet wird).

Wieso ist das so?


Hier noch das gesamte Programm:

Java:
import java.awt.* ;
import javax.swing.*;

public class XAxisAlignY extends JFrame
{
   private JButton button1 = new JButton("Button 1");
   private JButton button2 = new JButton("Button 2");
   private JButton button3 = new JButton("Button 3");

   public XAxisAlignY()
   {
     JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT, 20, 20));

      button1.setPreferredSize( new Dimension(80,60) ) ;
      addB(button1, panel);

      button2.setPreferredSize( new Dimension(120,40) ) ;
      addB(button2, panel);

      button3.setPreferredSize( new Dimension(100,80) ) ;
      addB(button3, panel);
      
      
      this.getContentPane().add(panel);

      initFrame() ;
   }

   private void initFrame()
   {
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
      setSize(500,250);
      setVisible(true);
   }
   
   
   private void addB(JButton b, JPanel panel) 
   {
     JPanel p = new JPanel();
     p.add(b);
     p.setPreferredSize(new Dimension(b.getPreferredSize().width,b.getPreferredSize().height+5));
     panel.add(p);
 }

   public static void main (String[] args)
   {
     new XAxisAlignY();
   }
}
 
S

SlaterB

Gast
so ist der Standard

Java:
 private void addB(JButton b)
    {
        JPanel p = new JPanel();
        FlowLayout f = (FlowLayout)p.getLayout();
        System.out.println(f.getVgap());

wenn du die Höhe aber so eng fasst, dann geht doch der ganze Effekt verloren, es muss schon gleich Höhe für alle Panel sein
 

fjk88

Mitglied
so ist der Standard

Java:
 private void addB(JButton b)
    {
        JPanel p = new JPanel();
        FlowLayout f = (FlowLayout)p.getLayout();
        System.out.println(f.getVgap());

wenn du die Höhe aber so eng fasst, dann geht doch der ganze Effekt verloren, es muss schon gleich Höhe für alle Panel sein

das ist mir schon bewusst, nur weiß ich trotzdem nicht wieso man nicht die maximale Höhe der Buttons nehmen kann, sondern die max. Höhe +5.

Button1 ist 80x60 px²
Button2 ist 120x40 px²
Button3 ist 100x80 px²

Das würde bedeuten die ButtonPanels müssten theoretisch alle 80px hoch sein.
Die korrekte Anzeige funktioniert aber erst bei 85, wieso?

PS.
Ausgabe von vGap = 20.
 
S

SlaterB

Gast
vGap = 20 gilt in dem Panel, in welchem du selber das FloyLayout manuell angelegt hast,
wie in meinem Code zweifelsfrei zu sehen meinte ich aber die neuen Panel pro Buttons,

dort sind 5 Pixel Abstand oben, wie in jedem JPanel mit Standard-Layout (auch FlowLayout),
dass bei 5 Pixel Abstand oben + 80 Pixel Button das neue JPanel 85 hoch sein muss statt 80 ist meiner Ansicht nach einleuchtend,
kann ich nicht weiter erklären..
 

fjk88

Mitglied
vGap = 20 gilt in dem Panel, in welchem du selber das FloyLayout manuell angelegt hast,
wie in meinem Code zweifelsfrei zu sehen meinte ich aber die neuen Panel pro Buttons,

dort sind 5 Pixel Abstand oben, wie in jedem JPanel mit Standard-Layout (auch FlowLayout),
dass bei 5 Pixel Abstand oben + 80 Pixel Button das neue JPanel 85 hoch sein muss statt 80 ist meiner Ansicht nach einleuchtend,
kann ich nicht weiter erklären..

alles klar, ich dachte du meinst das Panel, dass die 3 ButtonPanels added.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
frager2345 JTextLabel im Flowlayout verschieben AWT, Swing, JavaFX & SWT 4
A hilfe für flowlayout AWT, Swing, JavaFX & SWT 6
T Swing Größe einer Komponente in einem BoxLayout / FlowLayout festlegen AWT, Swing, JavaFX & SWT 7
P LayoutManager TextField.setSize(); in einem FlowLayout AWT, Swing, JavaFX & SWT 3
I BoxLayout, FlowLayout und Komponentengrößen AWT, Swing, JavaFX & SWT 1
R LayoutManager JSeparator in FlowLayout AWT, Swing, JavaFX & SWT 4
M Problem mit FlowLayout, JLabel und JButton AWT, Swing, JavaFX & SWT 4
B FlowLayout Buttons verschieben? AWT, Swing, JavaFX & SWT 13
B Swing JScrollBar in einem JPanel mit FlowLayout AWT, Swing, JavaFX & SWT 15
M FlowLayout Alignment?! AWT, Swing, JavaFX & SWT 9
P LayoutManager Komponenten einfügen (FlowLayout, BoxLayout) AWT, Swing, JavaFX & SWT 2
D Komponente im FlowLayout nicht mittig sondern rechts. Wie? AWT, Swing, JavaFX & SWT 4
C JPanel mit FlowLayout in JScrollPane - keinen Scrollbalken AWT, Swing, JavaFX & SWT 2
E LayoutManager FlowLayout mit angepassetr PreferedSize? AWT, Swing, JavaFX & SWT 3
aze FlowLayout:Lücken "schließen" AWT, Swing, JavaFX & SWT 2
O FlowLayout Button Event zuweisen? AWT, Swing, JavaFX & SWT 7
R FlowLayout: 1 Objekt pro Zeile AWT, Swing, JavaFX & SWT 5
N JTable in FlowLayout verweigert änderungen AWT, Swing, JavaFX & SWT 3
hdi FlowLayout Alternative AWT, Swing, JavaFX & SWT 10
0 Vertikales FlowLayout ? AWT, Swing, JavaFX & SWT 4
M Problem mit jPanel (FlowLayout) in ScrollPane AWT, Swing, JavaFX & SWT 4
E Mysthische Punkte auf JFrame(FlowLayout) nach Komboboxklick AWT, Swing, JavaFX & SWT 5
D Toolbars und Zeilenumbruch (benutze FlowLayout) AWT, Swing, JavaFX & SWT 2
I Vertical FlowLayout AWT, Swing, JavaFX & SWT 1
G position im FlowLayout AWT, Swing, JavaFX & SWT 11
rgubler Umbrechendes Flowlayout AWT, Swing, JavaFX & SWT 2
O Zeilenumbruch erzwingen (FlowLayout? AWT, Swing, JavaFX & SWT 1
K FlowLayout AWT, Swing, JavaFX & SWT 2
F FlowLayout in BorderLayout AWT, Swing, JavaFX & SWT 4
B FlowLayout ausrichtung | "Wasserzeichen" im JFrame AWT, Swing, JavaFX & SWT 8
R FlowLayout-Problem AWT, Swing, JavaFX & SWT 17
L LayoutManager ähnlich wie FlowLayout AWT, Swing, JavaFX & SWT 5
N Problem mit JScrollPane und JPane(FlowLayout) AWT, Swing, JavaFX & SWT 4
S toolbar - flowlayout problem AWT, Swing, JavaFX & SWT 5
M FlowLayout in BorderLayout einbinden? AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen


Oben