Качели JLabel: перекрасить () - PullRequest
       13

Качели JLabel: перекрасить ()

2 голосов
/ 13 сентября 2011

Я пытаюсь перекрасить 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;
        }
    }
}

Ответы [ 6 ]

4 голосов
/ 13 сентября 2011

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

}

Кстати, это одна маленькая дуга.

3 голосов
/ 13 сентября 2011

Вы должны переопределить paintComponent и вызвать метод super, прежде чем делать что-либо еще:

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

}
2 голосов
/ 13 сентября 2011

Если он не перерисовывается, вероятно, проблема в том, что вы выполняете ваше FTP-соединение в потоке диспетчеризации событий, который блокирует и не позволяет перерисовать графический интерфейс.FTP-соединение.Прочитайте раздел из учебника по Swing по Concurrency для получения дополнительной информации и решения с использованием SwingWorker.

2 голосов
/ 13 сентября 2011

Вместо переопределения paint(), вы, вероятно, просто хотите переопределить paintComponent().

Кроме того, вызов super.paint(g) должен быть выполнен в начале вашего метода, в противном случае любая выполняемая вами картина может быть перезаписана собственной картиной JLabel.

2 голосов
/ 13 сентября 2011

Первое, что я заметил, это то, что вы должны переопределять paintComponent, а не paint.

0 голосов
/ 13 сентября 2011

Состояние должно быть изменчивым, чтобы поток обработки событий видел новое значение, установленное потоком ftp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...