gpt4 book ai didi

java - Swing JLabel : Force repaint()

转载 作者:行者123 更新时间:2023-12-02 09:21:27 25 4
gpt4 key购买 nike

我正在尝试动态地重新绘制 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;
}
}
}

最佳答案

Klong,你的代码对我有用,所以很可能你在其他地方有错误。我是如何测试的,

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;


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();
}

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;
}
}

public static void main(String[] args) {
final StatusLabel statusLabel = new StatusLabel("Foo");
statusLabel.setStatus(FTPConnectionListenable.STATUS_OK);
new Timer(1000, new ActionListener() {
int counter = 0;
@Override
public void actionPerformed(ActionEvent e) {
counter++;
counter %= 4;
statusLabel.setStatus(counter);
}
}).start();

JOptionPane.showMessageDialog(null, statusLabel);
}
}

interface FTPConnectionListenable {

static final int STATUS_ERROR = 0;
static final int STATUS_WARNING = 1;
static final int STATUS_OK = 2;
void setStatus(int status);

}

顺便说一句,这是一个弧。

关于java - Swing JLabel : Force repaint(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7403866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com