изменение фона в компонентах смещения JLabel
-
21-09-2019 - |
Вопрос
Код, который я использую:
public class Test extends JFrame implements ActionListener {
private static final Color TRANSP_WHITE =
new Color(new Float(1), new Float(1), new Float(1), new Float(0.5));
private static final Color TRANSP_RED =
new Color(new Float(1), new Float(0), new Float(0), new Float(0.1));
private static final Color[] COLORS =
new Color[]{TRANSP_RED, TRANSP_WHITE};
private int index = 0;
private JLabel label;
private JButton button;
public Test() {
super();
setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
label = new JLabel("hello world");
label.setOpaque(true);
label.setBackground(TRANSP_WHITE);
getContentPane().add(label);
button = new JButton("Click Me");
button.addActionListener(this);
getContentPane().add(button);
pack();
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(button)) {
label.setBackground(COLORS[index % (COLORS.length)]);
index++;
}
}
public static void main(String[] args) {
new Test();
}
}
Когда я нажимаю кнопку, чтобы изменить цвет меток, графический интерфейс выглядит следующим образом:
Есть идеи, почему?
Решение
Вы задаете JLabel полупрозрачный фон, но указываете, что он непрозрачен.Это означает, что Swing не будет рисовать компоненты под ним, пока не предоставит JLabel объект Graphics для использования для рисования.Предоставленная графика содержит мусор, который, как ожидается, JLabel перезапишет при рисовании фона.Однако когда он рисует фон, он становится полупрозрачным, поэтому мусор остается.
Чтобы решить эту проблему, вам нужно создать расширение JLabel, которое не будет непрозрачным, но будет иметь переопределенный метод PaintComponent, который будет рисовать нужный вам фон.
РЕДАКТИРОВАТЬ:Вот пример:
public class TranslucentLabel extends JLabel {
public TranslucentLabel(String text) {
super(text);
setOpaque(false);
}
@Override
protected void paintComponent(Graphics graphics) {
graphics.setColor(getBackground());
graphics.fillRect(0, 0, getWidth(), getHeight());
super.paintComponent(graphics);
}
}
Другие советы
Фоны с прозрачностью предоставляет принятое вами решение, но также предоставляет вам решение, которое вы можете использовать без расширения JLabel, что может представлять интерес.