2017-02-18 21 views
2

Так что я создал GUI Java, как на рисунке внизу (Извинения для ужасно окрашенного отдыха):Перемещение JPanels использованием TimerTask

Layout для Java GUI

Target GUI

Все JPanel, являются равный размер (не показан на чертеже). То, что я пытаюсь сделать, это сделать так, что, когда я что-то делаю с индикаторами выполнения (чтение I.E некоторых текстовых файлов), JPanels будет циклически переходить. Как и в красном, вы пойдете на дно, оранжевый пойдет на вершину и, таким образом, продолжит движение в этом цикле. Я бы хотел, чтобы они меняли каждую половину секунды и ждали через 2 секунды после того, как программа открыта, чтобы начать движение. Я также хотел бы, чтобы они остановились, когда один из индикаторов прогресса достиг 100%.

После некоторого чтения я думаю, что класс Java TimerTask был бы хорош для этого, но у меня нет опыта с ним, и я не совсем уверен, как я буду делать что-то подобное с ним.

Любые подсказки или идеи о том, как это сделать, будем очень благодарны!

+2

* «После выполнения некоторых чтении я думаю, что класс Java TimerTask будет хорошо подходит для этого» * ​​- На самом деле, Swing 'Timer' будет более безопасным – MadProgrammer

+0

@MadProgrammer, ладно. Я думаю, что смогу сделать эту работу, поскольку я знаю некоторые основы Timer. Однако есть ли у вас какие-либо идеи о том, как я должен действительно продвигать JPanels? Я никогда не пробовал переместить их раньше. Сейчас у меня все сидят на главной панели с раскладкой Box. Должен ли я изменить это на GridLayout и изменить столбцы, в которых они находятся, чтобы переместить их? Или есть более простой способ сделать это, чтобы я отсутствовал? –

+0

Это может быть очень сложно, вы можете использовать макет «прокси», продемонстрированный [здесь] (http://stackoverflow.com/questions/14540080/animations-when-using-gridbag-layout/14541651#14541651), [здесь ] (http://stackoverflow.com/questions/32368190/too-many-jpanels-inside-a-jpanel-with-gridbaglayout/32372506#32372506) и [здесь] (http://stackoverflow.com/questions/27463989/java-moving-jlabel-two-using-timer/27466801 # 27466801), или вы можете использовать один из доступных lirabries, упомянутых здесь [http://stackoverflow.com/questions/17625475/sliding-any-jpanel/17625831 # 17625831) – MadProgrammer

ответ

2

Было бы гораздо проще сохранить модель цветов (и текст, если «Красный JPanel» является частью того, что видит пользователь) & просто меняет цвета BG существующих панелей, соответствующих счетчику, используемому в качестве индекса к массиву этих цветных (/ текстовых) комбо.

Как упомянуто @MadProgrammer, A Swing Timer было бы более уместным, так как таймер Swing гарантирует, что обновления будут сделаны на EDT. Вернее, два таймера. Первый будет таймером с одним выстрелом, чтобы задержать две секунды. Второй будет цитировать цвета.

Как это (настройка цвета и цифры нужно):

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

Это именно то, что я искал! Спасибо огромное! –

+0

Добро пожаловать. :) –