3 Stimmen

Wie korrigiert/zentriert man das GridLayout mit Standard-Java-Layout-Managern?

Der folgende Code stellt das Problem dar. Da ich die Höhen der nördlichen und südlichen Panels eingestellt habe, geht der Rest des Codes an das mittlere Panel mit GridLayout. Ich denke, dass, da es die übrig gebliebenen Pixel nicht gleichmäßig auf seine Zeilen verteilen kann, es sie einfach stehen lässt. Daher haben wir im untenstehenden Code eine hässliche weiße Linie über dem Süd-Panel.

Meine Frage ist hier: Wie kann sichergestellt werden, dass das GridLayout, wenn es nicht den gesamten Platz einnimmt, zumindest zentriert ist?

Normalerweise würde ich TableLayout verwenden und die Situation ist sortiert, aber da ich eine Antwort schrieb, wollte ich nur Standardmanager verwenden. Zu wissen, dies wäre sehr nützlich für mich danke im Voraus.

Ejemplo:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class AligningButonsTest
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {                   
                JFrame f = new JFrame();
                f.setSize(800, 600);
                double CONSTANT_FACTOR = .1;
                int noOfRows = 5;
                JPanel centerP = new JPanel(new GridLayout(noOfRows,1));

                for(int i = 0; i < noOfRows; i++)
                {   
                    BoxPanel bP = new BoxPanel();
                    centerP.add(bP);
                }
                JPanel contentPane = new JPanel(new BorderLayout());                
                f.setContentPane(contentPane);
                contentPane.add(centerP, BorderLayout.CENTER);
                JPanel southP = new JPanel();
                southP.setBackground(Color.RED.darker());//southP.setOpaque(false);
                southP.setPreferredSize(new Dimension(1, (int)(CONSTANT_FACTOR* f.getHeight())));
                contentPane.add(southP, BorderLayout.SOUTH);
                JPanel northP = new JPanel();
                northP.setBackground(Color.RED.darker());//northP.setOpaque(false);
                northP.setPreferredSize(new Dimension(1, (int)(CONSTANT_FACTOR* f.getHeight())));
                contentPane.add(northP, BorderLayout.NORTH);            
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
            }
        });
    }   
}

class BoxPanel extends JPanel
{
    public BoxPanel()
    {
        setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.RED));
        setBackground(Color.DARK_GRAY);
    }   
}

4voto

camickr Punkte 315810

Wie kann sichergestellt werden, dass das GridLayout, wenn es nicht den gesamten Platz einnimmt, zumindest zentriert ist?

JPanel wrapper = new JPanel( new GridBagLayout() );
wrapper.add( centerP );
contentPane.add(wrapper, BorderLayout.CENTER);  
//contentPane.add(centerP, BorderLayout.CENTER);

3voto

trashgod Punkte 199887

BoxLayout leistet gute Arbeit bei der Aufteilung des Platzes zwischen den Komponenten mit Box.createVerticalGlue() . Dieses Beispiel verwendet Box.createVerticalStrut() , oben und unten. Die Abstandshalter sind beschrieben in Wie man BoxLayout verwendet: Unsichtbare Komponenten als Füller verwenden .

Nachtrag: BoxTest2 ist eine Variante, bei der BoxLayout um Randplatten mit fester Größe zu erstellen und vertikale Kleber, um den Raum gleichmäßiger zu verteilen. Box.Filler kann auch verwendet werden, um den "übrig gebliebenen" vertikalen Raum zu kontrollieren.

/** @see http://stackoverflow.com/questions/6072956 */
public class BoxTest2 {

    private static final int WIDE = 480;
    private static final int HIGH = WIDE / 8;
    private static final int ROWS = 5;
    private static final Box center = new Box(BoxLayout.Y_AXIS);

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                center.setOpaque(true);
                center.setBackground(Color.lightGray);
                center.add(Box.createVerticalGlue());
                center.add(new EdgePanel());
                for (int i = 0; i < ROWS; i++) {
                    center.add(new BoxPanel());
                }
                center.add(new EdgePanel());
                center.add(Box.createVerticalGlue());
                f.add(center, BorderLayout.CENTER);
                f.pack();
                f.setVisible(true);
            }
        });
    }

    private static class EdgePanel extends JPanel {

        public EdgePanel() {
            Dimension d = new Dimension(WIDE, 2 * HIGH / 3);
            setPreferredSize(d);
            setBackground(Color.red.darker());
        }
    }

    private static class BoxPanel extends JPanel {

        public BoxPanel() {
            setPreferredSize(new Dimension(WIDE, HIGH));
            setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.red));
            setBackground(Color.darkGray);
        }
    }
}

2voto

msj121 Punkte 2720

Könnten Sie vielleicht versuchen, dieses mittlere Panel entweder in einem BorderLayout.North oder vielleicht sogar in einem FlowLayout.Center zu verschachteln.

Ich meine damit: JPanel holder = new JPanel(new BorderLayout()); holder.add(centerP,BorderLayout.NORTH); contentPane.add(holder, BorderLayout.CENTER);

Ich kann mir Ihr Problem nicht genau vorstellen, daher ist es schwer, eine Lösung zu schreiben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X