Wie zu beheben/center GridLayout-Objekt mit standard-Java-layout-Manager?
Den code unten repräsentiert das problem. Da ich die Höhen des Nord-und Süd-panels einstellen, der rest geht an das center-panel mit GridLayout. Ich denke, da es nicht teilen kann, die übrig gebliebenen Pixel gleichmäßig unter Ihren Reihen, es bleibt nur Sie. Deshalb wird im folgenden code haben wir hässliche weiße Linie über die south-panel.
Meine Frage hier ist: Wie stellen Sie sicher, dass, wenn das GridLayout ist nicht der ganze Raum ist es zumindest zentriert?
Normalerweise würde ich TableLayout und situation sortiert, aber da war ich schriftlich eine Antwort wollte ich nur standard-Manager. Dies zu wissen wäre sehr hilfreich für mich vielen Dank im Voraus.
Beispiel:
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);
}
}
- es gibt problem, dass einige LayoutManager ignoriert, auf die Größe für die PrefferedSize (BorderLayout, GridLaoyut), da sind wraped zu den Standorten oder Raster, wie ich weiß, nur GridBag können Anker + PrefferedSize direkt und gemeinsam, sicher, dass es existieren muss, einfach hack/workaroud für das ...
- +1 @camicker @msj121 @trashgod ich gebe dir die Punkte morgen, ich habe alles für heute. Ich halte die Zentrierung Ausgabe sortiert Dank. Jetzt würde ich gerne wissen, wie füllen Sie Links über den Raum. Von dem, was ich verstehe, das ist jenseits der Fähigkeiten von GridLayout. Also, ich Frage mich, wie um sicherzustellen, dass z.B. GridBagLayout wird, füllen Sie alle Platz, z.B. der ersten und/oder letzten Zeile. Ich habe versucht, GridBagConstraints.gewichtigen = 1.0, wie in dem tutorial-Beispiel, aber nicht gut. Obwohl im Gegensatz zu tutorial Beispiel meine Breite ist immer perfekt gefüllt. Ist das problem spezifisch für dieses layout?
Du musst angemeldet sein, um einen Kommentar abzugeben.
BoxLayout
hat einen ziemlich guten job der Verteilung der Raum zwischen den Komponenten mitBox.createVerticalGlue()
. Dieses Beispiel verwendetBox.createVerticalStrut()
, oben und unten. Die Abstandhalter sind beschrieben in die How to Use BoxLayout: Mit Unsichtbaren Komponenten, die als Füller.Nachtrag:
BoxTest2
ist eine Variante, die verwendetBoxLayout
zu erstellen mit fester Größe Rand der Paneele und der vertikalen Kleber zu verteilen, die den Raum gleichmäßig.Box.Filler
kann auch verwendet werden, um die "überbleibsel" der vertikale Raum.GridLayout
versucht einzuteilen Raum gleichmäßig, doch IhrnoOfRows
kann nicht ein ganzzahliges Vielfaches der center-panel-Höhe. Im obigen Beispiel habe ich auskommentiert das Streben hervorheben die Wirkung. Als Sie das Fenster vergrößern, werden Sie sehen, 0...4 hellgrauen Zeilen erscheinen zyklisch über den unteren Rand der center-panel.EdgePanel
.Könnte Sie es vielleicht versuchen nesting-das Zentrum-panel entweder in einem BorderLayout.Nord-oder vielleicht sogar ein FlowLayout.Center.
Damit meine ich:
JPanel Inhaber = new JPanel(new BorderLayout());
Halter.add(centerP,BorderLayout.NORTH);
contentPane.add(Inhaber, BorderLayout.CENTER);
Kann ich nicht genau visualisieren Sie Ihr problem so ist es schwer zu schreiben eine Lösung.