我在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);
}
}
}
答案 0 :(得分:5)
JLabel是defalut non-Opaque
,即使你setBackGround(无论如何),然后没有myLabel.setOpaque(true);
的定义不是JLabel'area
着色,另一种方式是使用{{3} }}覆盖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对CustomPaint有太多问题,那么从BackGroung Tasks
到GUI的所有输出都必须包装到invokeLater()
中,你代码块中的最后一行代码行将是revalidate ()
和repaint()
填充JComponents
在可见容器内
答案 1 :(得分:1)
三件事:
1)使用setBackground设置背景颜色应该导致它使用新颜色重新绘制自己而不调用重绘(假设它是不透明的)。
2)我建议使用javax.swing.Timer
类。确保您知道这与java.util.Timer
课程之间的区别。
3)调用setBackground(null)应恢复“默认颜色”。