【发布时间】:2011-11-16 06:15:24
【问题描述】:
我正在尝试动态地重新绘制 JLabel,但我终其一生都无法弄清楚如何去做。一旦我调整屏幕大小,下面的代码将按预期执行,但不会自行执行代码。
JLabel 左侧有一个小圆圈,绘制在文本左侧的边框区域。圆圈的颜色应根据 FTP 连接(未显示)的健康状况而变化。监控FTP连接的线程在健康发生变化时调用setStatus(int)方法。
圆圈是在 JLabel 初始化期间绘制的,我正在尝试使用 repaint() 重新执行此代码。
编辑:我也试过玩revalidate()、invalidate()和validate(),但无济于事。
编辑:感谢您指出这一点,我从使用 paintComponent() 开始,然后在不起作用时更改为 paint()。因此,将其作为答案并不荣耀(抱歉,请与 Oracle 讨论)
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;
}
}
}
【问题讨论】:
-
我强烈建议您使用
enum而不是interface来代替FTPConnectionListenable。
标签: java swing components repaint