【问题标题】:How can I change label color in Java?如何在 Java 中更改标签颜色?
【发布时间】:2011-08-29 09:31:03
【问题描述】:

我在 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);
            }
        }
    }

【问题讨论】:

  • 不要在应用程序代码中调用 repaint - 大多数时候,即使这似乎是一个解决方案,但在其他地方存在更深层次的问题

标签: java swing concurrency jlabel


【解决方案1】:

JLabel 是默认的non-Opaque,即使你设置了BackGround(whatever),那么没有myLabel.setOpaque(true); 的定义不是JLabel'area 着色,另一种方法是使用CustomPaint 覆盖paintComponetn(),例如

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

编辑:

您发布的 void 与 Concurency in Swing 有太多问题,那么从 BackGroung Tasks 到 GUI 的所有输出都必须包装到 invokeLater() 中,并且代码块中的最后一行代码将是 revalidate () 和 @987654333 @ 用于填充 JComponents 可见容器内

【讨论】:

  • 是的,我已经将 setOpaque() 值更改为 true。但它并没有给出解决方案。
  • 我编辑了我的帖子,这是另一个问题,我认为与 JLabel 的 setBackGroung 无关
【解决方案2】:

三件事: 1) 使用 setBackground 设置背景颜色应该会导致它用新颜色重新绘制自己,而无需调用重新绘制(假设它是不透明的)。 2) 我建议为此使用javax.swing.Timer 类。确保你知道这个和java.util.Timer 类之间的区别。 3) 调用 setBackground(null) 应该恢复“默认颜色”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多