Ich habe mein Bestes versucht, um eine JLabel Größe zu beheben, aber es ändert sich ständig und das verursacht andere Elemente in der GUI zu verschieben.Java Swing, wie JLabel Größe zu beheben
Ich habe sowohl die Größe und den Abstand der Komponenten angegeben. Laut GridBagLayout documentation, ipadx
und ipady
"Gibt die interne Auffüllung: wie viel hinzufügen auf die Größe der Komponente." Nach this Post, setMinimumSize
und setMaximumSize
können Sie die tatsächliche Größe der Komponente festlegen. Da ich sowohl die Größe als auch den Abstand festgelegt habe, wie ist es möglich, dass die Komponenten herumspringen, wenn Text in JLabel erscheint?
Ich konnte das in der Praxis lösen, indem ich einen Leerraum in den leeren Text fügte, aber das nervt mich immer wieder. Was versteh ich da nicht?
Hier ist ein SSCCE, der das Problem demonstriert. Es verfügt über Elemente, die in einem GridBagLayout angeordnet sind. Wenn Sie den Inhalt eines JLabels in einer Zelle ändern, werden alle Elemente verschoben.
import javax.swing.*;
import java.awt.*;
import java.io.*;
public class F {
public static void main(String[] args) throws IOException, InterruptedException {
JFrame frame = new JFrame();
JPanel mainView = new JPanel();
mainView.setPreferredSize(new Dimension(300, 300));
mainView.setLayout(new GridBagLayout());
JPanel contents = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(1,3,3,3);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.ipady = 2;
gbc.anchor = GridBagConstraints.EAST;
JLabel text1 = new JLabel("Some text: ");
contents.add(text1, gbc);
gbc.gridy++;
JLabel text2 = new JLabel("More text: ");
contents.add(text2, gbc);
gbc.gridy++;
JLabel text3 = new JLabel("Third line: ");
contents.add(text3, gbc);
gbc.gridx++;
gbc.gridy = 0;
JTextField textField1 = new JTextField(10);
contents.add(textField1, gbc);
gbc.gridx++;
gbc.gridy++;
gbc.gridx--;
JTextField textField2 = new JTextField(10);
contents.add(textField2, gbc);
gbc.gridy++;
JLabel sitePass = new JLabel("");
sitePass.setMaximumSize(new Dimension(100, 15));
sitePass.setMinimumSize(new Dimension(100, 15));
//sitePass.setPreferredSize(new Dimension(100, 15)); // <-- this line fixes the problem
contents.add(sitePass, gbc);
mainView.add(contents);
frame.add(mainView);
frame.setSize(400, 400);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
while (true) {
Thread.sleep(1000);
sitePass.setText("Pushup time");
Thread.sleep(1000);
sitePass.setText("");
}
}
}
Wo ist dein [MCVE]? PS: 'setPreferedSize (int)' könnte helfen (ich setze die drei 'prefered, minimal, maximum' auf den gleichen Wert) um eine Größe zu fixieren – AxelH
Sorry über das Beispiel, ich habe versehentlich zu viel gelöscht, als ich versuchte ein Minimum zu erstellen Beispiel. –
Sie haben Recht, minimumSize und maximumSize war nicht genug. Hinzufügen preferredSize hat es behoben. –