Как я могу изменить цвет метки в Java? - PullRequest
2 голосов
/ 29 августа 2011

У меня есть набор меток в вызове LinkList «l», и мне нужно изменить цвет фона этих меток.Мне нужно поместить интервал в 2 секунды между каждым изменением цвета, поэтому я попытался использовать метод перекраски следующим образом, но он не дает мне требуемого результата.Пожалуйста, кто-нибудь может дать мне решение этой проблемы?

    public static void changeColor(LinkedList l,JFrame f){

    for (int i = 0; i < l.size(); i++) {
        try {
            final JLabel xx = (JLabel) l.get(i);
            xx.setBackground(Color.red);
            f.repaint();
            xx.setText("B");
            System.out.println(i);
            new thread().run();
            xx.setBackground(Color.GRAY);
            xx.setText("A");
            f.repaint();

            } catch (Exception ex) {
               Logger.getLogger(TestView.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

Ответы [ 2 ]

5 голосов
/ 29 августа 2011

JLabel по умолчанию non-Opaque, даже если вы установили BackGround (что угодно), то без определения для myLabel.setOpaque(true); не JLabel'area не раскрасили, другой способ использует CustomPaint с оверидой paintComponetn(), например

enter image description here

import java.awt.*;
import javax.swing.*;

public class LabelBackGround {

    private JFrame frame;

    public LabelBackGround() {
        JLabel lblWest = new JLabel();
        lblWest.setPreferredSize(new Dimension(50, 150));
        lblWest.setOpaque(true);
        lblWest.setBackground(Color.red);
        JLabel lblEast = new JLabel();
        lblEast.setPreferredSize(new Dimension(50, 150));
        lblEast.setOpaque(true);
        lblEast.setBackground(Color.red);
        frame = new JFrame();
        frame.add(new CustomColoredComponents(), BorderLayout.NORTH);
        frame.add(new CustomColoredComponents(), BorderLayout.SOUTH);
        frame.add(lblWest, BorderLayout.WEST);
        frame.add(lblEast, BorderLayout.EAST);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocation(100, 100);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                LabelBackGround gridBadFrame = new LabelBackGround();
            }
        });
    }
}

class CustomColoredComponents extends JLabel {

    private static final long serialVersionUID = 1L;

    @Override
    public Dimension getMinimumSize() {
        return new Dimension(200, 20);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 30);
    }

    @Override
    public void paintComponent(Graphics g) {
        int margin = 10;
        Dimension dim = getSize();
        super.paintComponent(g);
        g.setColor(Color.blue);
        g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
    }
}

РЕДАКТИРОВАТЬ:

и недействительным, что вы опубликовали слишком много проблем с Конкуренция в Swing, тогда весь вывод из BackGroung Tasks в GUI должен быть заключен в invokeLater(), а последние строки кода в вашем блоке кода будут revalidate () и repaint() для заполнения JComponents внутри видимого контейнера

1 голос
/ 29 августа 2011

Три вещи: 1) Установка цвета фона с помощью setBackground должна привести к его перекрашиванию в новый цвет без вызова перерисовки (при условии, что он непрозрачный).2) Я бы предложил использовать класс javax.swing.Timer для этого.Убедитесь, что вы знаете разницу между этим и классом java.util.Timer.3) Вызов setBackground (null) должен восстановить «цвет по умолчанию».

...