2017-02-18 1 views
2

J'ai donc mis en place une interface graphique Java comme celui présenté ci-dessous (excuses pour les loisirs horriblement peint):Moving JPanels à l'aide TimerTask

Mise en page pour Java GUI

Target GUI

Toutes les JPanels sont taille égale (pas bien représentée sur le dessin). Ce que j'essaie de faire, c'est de faire en sorte que lorsque je fais quelque chose avec les barres de progression (je lis des fichiers texte), les JPanels passent à travers. Comme dans le rouge ira vers le bas, l'orange ira vers le haut, et continuera ainsi dans ce cycle. Je voudrais qu'ils changent toutes les demi-secondes et attendent 2 secondes après que le programme soit ouvert pour commencer à bouger. Je voudrais aussi qu'ils s'arrêtent quand l'une des barres de progression atteint 100%. Après avoir fait quelques lectures, je pense que la classe Java TimerTask serait un bon choix, mais je n'en ai aucune expérience et je ne suis pas vraiment sûr de la façon dont je ferais quelque chose comme ça avec ça.

Des conseils ou des idées sur la façon de procéder à ce sujet seraient grandement appréciés!

+2

* « 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

+0

@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? –

+0

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

Répondre

2

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):

enter image description here

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

C'est exactement ce que je cherchais! Merci beaucoup! –

+0

De rien. :) –