让几个'JPanel'逐个更改颜色,而不是全部使用JavaSwing
我有一个让几个'JPanel'逐个更改颜色,而不是全部使用JavaSwing,java,swing,jlabel,Java,Swing,Jlabel,我有一个JPanel,上面有几个(25)JLabels,它们使用计时器每2秒改变一次颜色(所有面板都变为相同的颜色),根据随机顺序,我只看到这个顺序,因为我在每次改变时都添加了文本打印,但颜色会一起改变,即使我在每次改变之间加上了一个延迟(以防我的眼睛看不到逐渐的变化),但这并没有起到任何作用,经过更长时间的等待后,它们都一起改变了颜色 我如何让它们一个接一个地改变颜色 守则: public class Billboard extends JFrame{ private JPanel
JPanel
,上面有几个(25)JLabel
s,它们使用计时器每2秒改变一次颜色(所有面板都变为相同的颜色),根据随机顺序,我只看到这个顺序,因为我在每次改变时都添加了文本打印,但颜色会一起改变,即使我在每次改变之间加上了一个延迟(以防我的眼睛看不到逐渐的变化),但这并没有起到任何作用,经过更长时间的等待后,它们都一起改变了颜色
我如何让它们一个接一个地改变颜色
守则:
public class Billboard extends JFrame{
private JPanel board;
private ArrayList<Panel> panels;
public Billboard()
{
super("Billboard");
this.board = new JPanel();
setBounds(100,100,250,160);
this.panels = new ArrayList<Panel>(0);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container con=this.getContentPane(); // inherit main frame
con.add(board); // add the panel to frame
//The timer that is responsible to changing the colors
ColorGenerator cg = ColorGenerator.getInstance();
RandomNotifier note = new RandomNotifier();
cg.setNotificator(note);
JLabel l;
Panel p;
for (int i=0; i<25; i++) {
// create label
l= new JLabel (" ");
l.setOpaque(true);
// add label to screen
board.add(l);
// create panel
p = new Panel("p" + i,l);
// link ColorGenerator to panel
cg.addObserver(p);
// add panel to panels list
panels.add(p);
}
setVisible(true); // display the frame
//starts the timer
cg.start();
}
public static void main(String args[]) {new Billboard();}
}
public class Panel implements Observer{
private String _name;
private Color _color;
private JLabel _label;
public Panel (String name, JLabel l) {
this._name = name;
this._color= new Color(0,0,0);
this._label = l;
this._label.setBackground(this._color);
checkRep();
}
//updates the color of the label
public void update(Observable o, Object arg) {
ColorGenerator cg = (ColorGenerator) o;
setColor(cg.getColor());
this._label.setBackground(this.getColor());
System.out.println(this.getName() + " has changed its color.");
}
private void setColor(Color c) {
this._color = c;
}
private Color getColor () {
return this._color;
}
}
public class ColorGenerator extends Observable {
private Notifier _notifier;
private Color _color;
private Timer _timer;
private ArrayList<Panel> _observers;
//hold the link to the only ColorGenerator
private static ColorGenerator _cg = null;
public static ColorGenerator getInstance() {
if (_cg == null) {
_cg = new ColorGenerator();
}
return _cg;
}
protected ColorGenerator () {
ActionListener changeColorTask = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
Random rand_gen = new Random();
_color = new Color (rand_gen.nextInt(256),rand_gen.nextInt(256),rand_gen.nextInt(256));
setChanged();
notifyObservers();
}
};
this._color = new Color(0,0,0);
this._timer = new Timer(2000, changeColorTask);
this._timer.setInitialDelay(0);
this._observers = new ArrayList<Panel>();
this._notifier = null;
}
public void start() {
this._timer.start();
}
public Color getColor () {
return this._color;
}
@Override
public void addObserver(Observer o) {
//...
}
@Override
public void deleteObserver(Observer o) {
//...
}
@Override
public void deleteObservers() {
//...
}
@Override
public int countObservers() {
//...
}
@Override
public void notifyObservers(){
if (!hasChanged())
return;
if (this._notifier == null) {
System .out.println ("Notificator has not set for ColorGenerator, can't notify observers");
return;
}
this._notifier.notifyAll(this,this._observers);
clearChanged();
}
public void setNotifier (Notifier n) {
if (n == null)
return;
this._notifier = n;
}
}
公共类广告牌扩展JFrame{
私人JPanel董事会;
私人ArrayList小组;
公共广告牌()
{
超级(“广告牌”);
this.board=new JPanel();
立根(100100250160);
this.panels=新的ArrayList(0);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container con=this.getContentPane();//继承主框架
con.add(board);//将面板添加到框架
//负责更改颜色的计时器
ColorGenerator cg=ColorGenerator.getInstance();
RandomNotifier note=新的RandomNotifier();
cg.设置通知器(注);
JLabel;
p小组;
对于(int i=0;i当需要更改颜色时,需要在JFrame或JPanel上调用repaint()
。需要调用repaint()
当您希望更改颜色时,请在JFrame或JPanel上显示颜色生成器的代码。请向我们显示颜色生成器的代码。为了更快地获得帮助,请发布一个。RandomNotifier是什么样子的?它以随机顺序查看面板列表,并调用每个面板的更新方法。还有其他顺序,因此有几种类型的通知程序,acc根据通知的顺序。请向我们展示ColorGenerator的代码。为了更快地获得更好的帮助,请发布一个。RandomNotifier是什么样子的?它以随机顺序浏览面板列表,并调用每个面板的更新方法。还有其他顺序,因此根据通知的顺序,有几种类型的通知程序.