Ich habe ein merkwürdiges Verhalten beim Setzen der Hintergrundfarbe von JLabels. Ich habe das Problem mal auf ein kleines Testprogramm reduziert.
Bei einem Button-Click wird bei 400 Labels die Hintergrundfarbe gesetzt. Die Performance ist dabei allerdings sehr schlecht. Man kann es mit dem bloßen Auge sehen, wie die Labels nacheinander eingefärbt werden. Auf meinem Rechner dauert es ca. eine halbe Sekunde.
Interessant sind die Zeilen die ich mit A, B und C kommentiert habe. Wenn ich Zeile A und B rausnehme (also zu Beginn keine Border und PreferredSize setze) wird die Einfärbung in 1 ms durchgeführt. Wenn ich zusätzlich Zeile C rausnehme (also beim Klick keine Border setze), habe ich wieder die schlechte Performance.
Ein Wechsel vom GridBagLayout zum GridLayout hat keinen Erfolg gebracht. Dort tritt das Problem sogar immer auf.
Hat irgendjemand eine Idee wie ich das Problem lösen kann ohne die Zeilen A und B rauszunehmen? Oder kann sich jemand das Problem erklären?
Java:
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.border.BevelBorder;
public class Test {
public static void main(String[] args) {
final List<JComponent> labels = new ArrayList<>();
final JPanel panel = new JPanel(new GridBagLayout());
for (int i = 0; i < 20; i++) {
for (int j = 0; j < 20; j++) {
JLabel label = new JLabel((char) (i + 65) + "" + (char) (j + 65));
label.setOpaque(true);
label.setBorder(BorderFactory.createLineBorder(Color.BLACK)); // Zeile A
label.setPreferredSize(new Dimension(32, 32)); // Zeile B
labels.add(label);
panel.add(label,
new GridBagConstraints(i, j, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(1, 1, 1, 1), 0, 0));
}
}
final JButton button = new JButton("Click me");
button.addActionListener(actionEvent -> {
for (JComponent label : labels) {
label.setBackground(Color.GREEN);
label.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); // Zeile C
}
});
final JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel, BorderLayout.CENTER);
frame.add(button, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
Interessant sind die Zeilen die ich mit A, B und C kommentiert habe. Wenn ich Zeile A und B rausnehme (also zu Beginn keine Border und PreferredSize setze) wird die Einfärbung in 1 ms durchgeführt. Wenn ich zusätzlich Zeile C rausnehme (also beim Klick keine Border setze), habe ich wieder die schlechte Performance.
Ein Wechsel vom GridBagLayout zum GridLayout hat keinen Erfolg gebracht. Dort tritt das Problem sogar immer auf.
Hat irgendjemand eine Idee wie ich das Problem lösen kann ohne die Zeilen A und B rauszunehmen? Oder kann sich jemand das Problem erklären?