Jak powstrzymać JLabel przed zmianą rozmiaru po zmianie tekstu?
Generuję niektóre JComponents w kodzie i wykorzystuję układ GridBag, aby je rozmieścić. Mój układ składa się z 12 wierszy i 3 kolumn, przy czym każdy wiersz składa się z JSlider, JCheckBox i JLabel. Oto kod, którego używam do generowania interfejsu użytkownika:
final int NUM_MOTORS = 12;
// This is the panel I'm adding the components to.
pnlMotorSliders.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
for (int i = 0; i < NUM_MOTORS; ++i) {
c.gridy = i;
// Create the slider
JSlider slider = new JSlider(SwingConstants.HORIZONTAL, 10, 4085, 10);
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.weightx = 0.9;
pnlMotorSliders.add(slider, c);
// Create the checkbox
JCheckBox checkBox = new JCheckBox();
checkBox.setOpaque(true);
checkBox.setBackground(Color.blue);
c.fill = GridBagConstraints.NONE;
c.gridx = 1;
c.weightx = 0.1;
pnlMotorSliders.add(checkBox, c);
// Create the current label
JLabel label = new JLabel("0");
label.setBorder(BorderFactory.createLineBorder(Color.red));
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 2;
c.weightx = 0.2;
pnlMotorSliders.add(label, c);
}
Problem, jaki mam, polega na tym, że kiedy ustawiam tekst w którymkolwiek z etykiet JLab, zmieniają one swoją szerokość i wpływają na resztę układu, nawet jeśli szerokość tekstu, którą ustawiam, wydaje się być znacznie mniejsza niż szerokość JLabel. Poniższe dwa zrzuty ekranu pokazują, co mam na myśli (czerwone i niebieskie obramowania służyły do debugowania):
Ustawiłem tekst na dole JLabel na „-12”. Nawet jeśli JLabel wydaje się być znacznie szerszy niż tekst, zmienił swój rozmiar, wpływając na resztę układu.
Dlaczego tak się dzieje i co mogę zrobić, aby temu zapobiec?