Я испробовал все возможное, чтобы исправить размер JLabel, но он продолжает меняться, и это приводит к тому, что другие элементы в графическом интерфейсе перемещаются.Java Swing как исправить размер JLabel
Я указал как размер, так и расстояние между компонентами. В соответствии с GridBagLayout, ipadx
и ipady
«Задает внутреннее заполнение: сколько добавить в размер компонента». Согласно сообщению this, setMinimumSize
и setMaximumSize
позволяют установить фактический размер компонента. Поскольку я исправил как размер, так и интервал, как возможно, что компоненты продолжают прыгать, когда текст появляется в JLabel?
Я смог решить это на практике, добавив пробел в пустой текст, но это продолжает прослушивать меня. Что я не понимаю об этом?
Это SSCCE, демонстрирующий проблему. Он имеет элементы, расположенные в GridBagLayout, и изменение содержимого одной JLabel в одной ячейке приводит к перемещению всех элементов.
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("");
}
}
}
Где ваш [mcve]? PS: 'setPreferedSize (int)' может помочь (я помещаю три «предпочтительных, минимальных, максимальных» в одно и то же значение) на фиксированный размер – AxelH
Извините за пример, я случайно удалил слишком много, когда пытался создать минимальный пример. –
Вы правы, minimumSize и maximumSize было недостаточно. Добавление preferredSize фиксировало его. –