Я пытаюсь перекрасить JLabel динамически и не могу понять, как это сделать. Приведенный ниже код будет работать, как и ожидалось, после изменения размера экрана, но сам код не будет выполняться.
JLabel имеет маленький круг слева, который рисуется в области границы слева от текста. Цвет круга должен меняться в зависимости от работоспособности FTP-соединения (не показано). Поток, отслеживающий соединение FTP, вызывает метод setStatus(int)
при изменении состояния.
Круг закрашивается во время инициализации JLabel, и я пытаюсь повторно выполнить этот код, используя repaint()
.
РЕДАКТИРОВАТЬ: Я также пытался играть с revalidate()
, invalidate()
и validate()
безрезультатно.
РЕДАКТИРОВАТЬ: Спасибо за указание на это, я начал с использования paintComponent()
и изменил на paint()
, когда это не сработало. Так что нет никакой славы за то, что дал это как ответ (извините, возьмите это с Оракулом)
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import com.my.package.io.ftp.FTPConnectionListenable;
class StatusLabel extends JLabel implements FTPConnectionListenable {
private Integer status;
// Constructor
StatusLabel(final String text) {
super(text);
setFont(new Font("Dialog", Font.PLAIN, 10));
setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0));
}
@Override
public void paintComponent(final Graphics g) {
super.paintComponent(g);
g.setColor(getColor());
g.fillArc(0, this.getHeight()/4, 8, 8, 0, 360);
}
@Override
public void setStatus (final int status) {
this.status = status;
if (status !=0)
repaint(); // Doesn't work :(
}
private Color getColor () {
switch (status) {
case FTPConnectionListenable.STATUS_OK:
return Color.GREEN;
case FTPConnectionListenable.STATUS_WARNING:
return Color.ORANGE;
case FTPConnectionListenable.STATUS_ERROR:
return Color.RED;
default:
return Color.PINK;
}
}
}