簡體   English   中英

Swing JLabel:強制重繪()

[英]Swing JLabel: Force repaint()

我試圖動態重繪一個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,你的代碼適合我,所以你可能在其他地方有一個bug。 我是如何測試的,

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

}

順便說一句,這是一個弧。

在執行任何其他操作之前,您應該覆蓋paintComponent並調用super方法:

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(getColor());
    g.fillArc(0, this.getHeight()/4, 8, 8, 0, 360);

}

我注意到的第一件事是你應該重寫paintComponent而不是paint

您可能只想覆蓋paintComponent() ,而不是覆蓋paint() paintComponent()

此外,對super.paint(g)的調用應該在方法的開頭進行,否則你執行的任何繪畫都可能被JLabel自己的繪畫覆蓋。

如果它沒有重新繪制,則問題很可能是您在事件調度線程上進行FTP連接,該線程阻塞並阻止GUI重新繪制。

您需要為FTP連接使用單獨的線程。 閱讀有關並發的Swing教程中的部分以獲取更多信息和使用SwingWorker的解決方案。

狀態需要是volatile,以確保Event Dispatch Thread看到ftp線程設置的新值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM