festlegen Größe der Komponente in container mit BoxLayout
Konfrontiert mit dem problem der Verwendung von BoxLayout
In meinem Beispiel, ich versuche, verringern Sie die Höhe des Textfeld, und ändern Sie die Breite der buttons (siehe grüne Markierung im Bild). Ich weiß über die Techniken setPrefferedSize () und setMaximumSize (), aber es hat nicht funktioniert, wie es sollte. Die Zeile add(Box.createHorizontalGlue ()) auch nicht helfen.
Vielen Dank für jede Idee
public class Testy extends JPanel {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
constructGUI();
}
});
}
private static void constructGUI() {
JFrame frame = new JFrame("Testy");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel centerPanel = new JPanel();
centerPanel.setBackground(Color.DARK_GRAY);
centerPanel.setPreferredSize(new Dimension(100, 400));
frame.add(centerPanel, BorderLayout.CENTER);
Testy eastPanel = new Testy();
frame.add(eastPanel, BorderLayout.EAST);
frame.pack();
frame.setVisible(true);
}
public Testy() {
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
JButton button = new JButton("Button ...... 1");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
add(button);
button = new JButton("Button 2");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
add(button);
button = new JButton("Button ........... 3");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
add(button);
JLabel label = new JLabel("Label");
//label.setPreferredSize(...);
//label.setMaximumSize(...);
add(label);
JTextField textField = new JTextField();
//textField.setPreferredSize(...);
//textField.setMaximumSize(...);
add(textField);
button = new JButton("Button 4");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
add(button);
//add(Box.createHorizontalGlue());
}
}
- Als schnelle Abhilfe können Sie mit geschachtelten layouts, in dem Sinne, dass auf der rechten Seite, erstellen Sie eine
JPanel
mitBorderLayout
, setzen Sie einenJPanel(say centerPanel)
amCENTER
und einJPanel(say buttonPanel)
beiPAGE_END
Lage. Verwenden jetzt eine neueJPanel(say compPanel)
mitGridLayout
und legen Sie alle Komponenten auf Sie, und legen Sie diesecompPanel
innencenterPanel
. OrtJButton(button4)
innenbuttonPanel
wie Sie ist. Ich denke, das wird funktionieren 🙂 - Für bessere Hilfe früher, nach einem SSCCE. Ein SSCCE sollte umfassen Importe, eine Klasse definition & ein
main
Methode.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuerst müssen Sie erkennen, dass die Komponente die position und Größe in Java Swing, hängt von der Layout-manager (wenn die layout-manager gesetzt ist) nicht auf die Komponente selbst. Die Komponente, die Anfragen der manager für die Größe.
Für diesen Fall würde ich mit unterschiedlichen Layouts - eine Kombination von GridLayout und BorderLayout ist genug, und sehr einfach und unkompliziert. Aber wenn Sie wollen, verwenden Sie BoxLayout, dann...
Dokumentation sagt:
Dann set-Komponenten maximale Größe:
c.setMaximumSize(new Dimension(Integer.MAX_VALUE, c.getMinimumSize().height));
(c
bedeutetbutton
,label
undtextField
in deinem Beispiel)Edit 1:
Hier arbeitet die source-code:
Edit 2:
Wenn Sie möchten, legte Sie die Taste 4 an der Unterseite der rechten Spalte fügen Sie diese Zeile
add(Box.createVerticalGlue());
zwischenadd(textField);
undbutton = new JButton("Button 4");
.Als schnelle Abhilfe können Sie mit geschachtelten layouts, in dem Sinne, dass auf der rechten Seite, erstellen Sie eine
JPanel
mitBorderLayout
, setzen Sie einenJPanel(say compPanel)
amCENTER
und einJPanel(say buttonPanel)
beiPAGE_END
Lage. Verwenden jetzt eine neueJPanel(say panel)
mitGridLayout
und legen Sie alle Komponenten auf Sie, und legen Sie diesecompPanel
innencenterPanel
. OrtJButton(button4)
innenbuttonPanel
wie Sie ist.BoxLayout
im Gegenteil, er respektiert die bevorzugte Größe derJComponent
, die in der Regel berechnet auf der Grundlage der Inhalte derJComponent
hält oder ausdrücklich gegeben, also Komponenten, die nicht dazu neigen zu richten sowie mit Bezug auf andere Komponenten gegeben.Hier ist das Beispiel :
AUSGABE :
Dieser sollte in der Nähe erhalten, basierend auf Ihren zeichnen, nur arbeiten müssen, dass die Komponente
unter dem JLabel (mit setPreferredSize()):
new GridLayout(0, 1)
bedeutet es, eine beliebige Anzahl von Zeilen, die aber genau einer Spalte - es hat eine bessere Bedeutung. Ja, ich weiß nicht, was passiert, wenn ich mehr als 6 Komponenten.