Layout-Manager-Java preferredSize
Ich bin immer noch versuchen zu lernen, wie layout-Manager arbeiten. Ich machte ein Bild mit zwei JPanels.
Die erste enthält eine textArea mit einem boxLayout.
Die zweite enthält ein flow-layout mit einer Taste.
Ich die preferredSize des jedes panel entsprechend, verpackt Sie, bekam aber unerwartete Ergebnisse.
import java.awt.*;
import javax.swing.*;
public class LayoutMgrTest
{
public static void main(String[] args)
{
TableBasic frame = new TableBasic();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.setVisible(true);
frame.getContentPane().setLayout(new GridLayout(2,1));
JPanel controlPane = new JPanel();
JPanel buttonPane = new JPanel();
controlPane.setLayout(new BoxLayout(controlPane, BoxLayout.PAGE_AXIS));
controlPane.setPreferredSize(new Dimension(200, 200));
controlPane.add(new JScrollPane(new JTextArea()));
buttonPane.setLayout(new FlowLayout(FlowLayout.LEFT));
buttonPane.setPreferredSize(new Dimension(100,20));
buttonPane.add(new JButton("Button1"));
buttonPane.add(new JButton("Button2"));
frame.getContentPane().add(controlPane, BorderLayout.NORTH);
frame.getContentPane().add(buttonPane, BorderLayout.SOUTH);
frame.setSize(new Dimension(500,500));
frame.pack();
}
}
Was ich Tue, wenn ich ein grid-Layout, es scheint immer reservieren Sie die Hälfte der zur Verfügung stehenden Flächen für jedes Steuerelement. Mir wurde gesagt, dass:
Die Höhe der einzelnen Zeilen ist abhängig von der Höhe der einzelnen Komponenten
Hinzugefügt in jeder Zeile.
Den buttonpane Höhe ist 20. Es ist die Zuweisung viel mehr als das:
Was ist falsch an diesem code?
Ich möchte zu verlassen, die zwei JPanels intakt bitte. Es ist einfach, fügen Sie einfach die textbox und die buttons direkt auf den Rahmen, aber ich muss es tun mit JPanels (weil ich werden das hinzufügen von Grenzen und andere Dinge).
InformationsquelleAutor David | 2011-08-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist das Ergebnis der Verwendung von GridLayout als layout-manager. Ändern Sie es zu BorderLayout:
Zum Beispiel, dieser code (ich änderte ein wenig, wie möglich aus dem original):
Erzeugt diesen Rahmen:
schnelle Hände, Mann, sind Sie herzlich willkommen
Danke für deine Antwort. Ein wenig spät, diese Zeit mKorbel 😛 Sie sind in der Regel immer eine große Hilfe mit Swing-GUI 🙂
bitte Lesen Sie wenig crypted Vorschlag durch (@camickr) == nicht, nie und nimmer etwas als setSize(), setBounds() +1
Siehe auch Wie erstelle ich ein screenshot als illustration für ein post? für einige Tipps machen einen großen Screenshot.
InformationsquelleAutor MByD
Dass ist ein anderes problem. Sie sollte NICHT die bevorzugte Größe. Das ist die Aufgabe des layout MANAGERS. Nur fügen Sie Ihre Komponenten, um die Platten und lassen Sie den layout-manager seinen job tun.
Meisten compnents standardmäßig die bevorzugte Größe. Für einige, die Sie benötigen, um ihm einen kleinen Tipp.
Zum Beispiel, wenn Sie mit einem text-Bereich, das würde Ihnen eine "vorgeschlagen" bevorzugte Größe:
Nicht wahr, die preferredSize ist einer der Werte, die layout-Manager stützen sich bei Ihren Berechnungen auf (nicht alle, obwohl). Das Ergebnis Ihrer Berechnungen ist die size-Eigenschaft, nicht preferredSize.
Ich stehe zu meiner commnent. Das Plakat sollte NICHT das setzen der bevorzugten Größe der
controlPane
oder diebuttonPane
. Der layout-manager bestimmt die bevorzugte Größe der diese Platten basieren auf den Komponenten Hinzugefügt. Diese Informationen werden dann verwendet, um die pack() frame auf der Grundlage der bevorzugten Größe von allen Platten Hinzugefügt, um den frame. Und ja, dann wird der layout-manager wird die Größe/Position der einzelnen panel.Hm, du hast Recht im Kontext: setzen der bevorzugten Größe der Container, layout-Manager ist nicht sinnvoll, Meine Aussage wäre korrekt für den regulären Komponenten.
Sie sollten nicht set size (min, max, pref oder tatsächlichen) auch für stand-alone-Komponenten, da die meisten Swing Komponenten kennen, wie Sie errechnen Ihre eigenen min,pref,max-Größen, basierend auf deren Inhalt; dann ist es die LayoutMnager die Aufgabe, berechnen Sie Ihre tatsächliche Größe (und Lage).
InformationsquelleAutor camickr
Wenn du LayoutManager, sollten Sie nicht von einer Größe auf eine Komponente, mit Ausnahme des Rahmens.
die Größe der Komponenten wird berechnet aus den verschiedenen layout-Managern.
finden Sie weitere infos unter http://download.oracle.com/javase/tutorial/uiswing/layout/howLayoutWorks.html
in Ihrem code, Sie hinzufügen können das panel mit der textarea, BorderLayout.CENTER. dies sollte Ihr problem lösen. die Komponenten im BorderLayout.CENTER nimmt den ganzen Raum, außer den Platz für die Komponenten, die im NORDEN, OSTEN, SÜDEN und WESTEN.
InformationsquelleAutor Dragon8