Il serait beaucoup plus simple de conserver un modèle de couleurs (et du texte, si 'Red JPanel' fait partie de ce que l'utilisateur voit) & il suffit de changer les couleurs BG des panneaux existants appropriés à un compteur utilisé comme index à un tableau de ces combinaisons de couleurs (/ texte).
Comme mentionné par @MadProgrammer, un Swing Timer
serait plus approprié, car le minuteur Swing assure que les mises à jour sont faites sur l'EDT. Ou plutôt deux timers. Le 1er serait une minuterie à un coup pour retarder deux secondes. Le 2ème ferait défiler les couleurs.
Vous aimez cette (ajuster les couleurs et les numéros de besoin):
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class ColorCycler {
private JComponent ui = null;
Color[] colors = {
Color.RED,
Color.ORANGE,
Color.YELLOW,
Color.GREEN,
Color.CYAN.darker(),
Color.MAGENTA.darker(),
Color.MAGENTA.darker().darker()
};
int counter = 0;
JPanel[] panels = new JPanel[colors.length];
ColorCycler() {
initUI();
}
public void initUI() {
if (ui!=null) return;
ui = new JPanel(new BorderLayout(4,4));
ui.setBorder(new EmptyBorder(4,4,4,4));
ui.setBackground(Color.CYAN);
ui.add(new JLabel(
"Clock", SwingConstants.CENTER), BorderLayout.PAGE_START);
ui.add(new JLabel(
"Progress Bars", SwingConstants.CENTER), BorderLayout.PAGE_END);
JPanel colorPanel = new JPanel(new GridLayout(0, 1));
Border border = new EmptyBorder(new Insets(10, 200, 10, 200));
for (int ii=0; ii<colors.length; ii++) {
JPanel p = new JPanel();
p.setBorder(border);
panels[ii] = p;
colorPanel.add(p);
}
ui.add(colorPanel, BorderLayout.CENTER);
ActionListener colorListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
counter++;
setColors();
}
};
final Timer colorCycleTimer = new Timer(50, colorListener);
ActionListener delayListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
colorCycleTimer.start();
}
};
Timer delayTimer = new Timer(2000, delayListener);
delayTimer.setRepeats(false);
delayTimer.start();
setColors();
}
private void setColors() {
for (int ii=0; ii<colors.length; ii++) {
panels[(counter+ii)%colors.length].setBackground(colors[ii]);
}
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
ColorCycler o = new ColorCycler();
JFrame f = new JFrame(o.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
* « Après avoir fait un peu de lecture, je pense que la classe Java TimerTask serait un bon moyen pour ce » * - En fait, Swing 'Timer' serait plus sûr – MadProgrammer
@MadProgrammer, d'accord. Je pense que je pourrais faire ce travail car je connais certaines des bases de la classe Timer. Cependant, avez-vous des idées sur la façon dont je devrais réellement déplacer les JPanels? Je n'ai jamais essayé de les déplacer avant. Je les ai tous assis dans un panneau principal avec une disposition de boîte en ce moment. Devrais-je changer cela en GridLayout et modifier les colonnes dans lesquelles ils se trouvent pour les déplacer? Ou y a-t-il une méthode plus simple pour faire cela que je manque? –
Cela pourrait être très compliqué, vous pouvez utiliser une disposition "proxy", démontré [ici] (http://stackoverflow.com/questions/14540080/animations-when-using-gridbag-layout/14541651#14541651), [ici ] (http://stackoverflow.com/questions/32368190/too-many-jpanels-inside-a-jpanel-with-gridbaglayout/32372506#32372506) et [ici] (http://stackoverflow.com/questions/27463989)/java-moving-jlabel-two-using-timer/27466801 # 27466801) ou vous pouvez utiliser l'un des lirabries disponibles mentionné [ici] (http://stackoverflow.com/questions/17625475/sliding-any-jpanel/17625831 # 17625831) – MadProgrammer