2016-04-05 4 views
0

У меня есть класс под названием Gui. Здесь я помещаю все свои ярлыки и кнопки. Он также содержит кнопку button.addactionlistener. При нажатии кнопки начинается другой поток (секундомер). Это когда секундомер входит в цикл, который продолжает обновлять мс, сек, мин в цикле while.обновление gui из потока (другой класс)

Секундомер - еще один файл класса. Секундомер содержит мс, сек, мин.

Как обновить метку gui секундомером ms, sec, min?

public class Gui { 

JFrame swFrame = new JFrame("Stopwatch"); 
Stopwatch sw = new Stopwatch(); 
Thread t1 = new Thread(sw); 
private JPanel p; 
private JButton b1; 
private JButton b2; 
private JButton b3; 
private JLabel l1; 
private JLabel l2; 


public Gui() 
{ 
    SwingUtilities.invokeLater(new Runnable() 
    { 
     public void run() 
     { 

      swFrame.setSize(500,400); 
      swFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      p = new JPanel(); 

      b1 = new JButton("StartStop"); 
      b2 = new JButton("LapTime"); 
      b3 = new JButton("Reset"); 

      l1 = new JLabel("bla"); 
      l2 = new JLabel("blala"); 

      p.add(b1); 
      p.add(b2); 
      p.add(b3); 
      p.add(l1); 
      p.add(l2); 

      swFrame.add(p); 
      b1.setActionCommand("StartStop"); 
      b2.setActionCommand("LapTime"); 
      b3.setActionCommand("Reset"); 
      b1.addActionListener(new ButtonClickListener()); 
      b2.addActionListener(new ButtonClickListener()); 
      b3.addActionListener(new ButtonClickListener()); 

     } 
    }); 
} 

private class ButtonClickListener implements ActionListener 
{ 
     public void actionPerformed(ActionEvent e) 
     { 
     String command = e.getActionCommand(); 
     if(command.equals("StartStop")) 
     { 
      if(t1.isAlive()) 
      { 
       t1.interrupt(); 
      } 
      else 
      { 
       t1.start(); 
       !!!//How to update the jlabel from the moment t1.starts?!!!! 
      } 
     } 
     else if(command.equals("LapTime")) 
     { 
      l2.setText("Submit Button clicked."); 
     } 
     else if(command.equals("Reset")) 
     { 

     } 

     }  
    } 

класс Секундомер

public class Stopwatch implements Runnable 
{ 

private int min; 
private int sec; 
private long ms; 
Timer timerSW = new Timer(); 
JLabel l1; 


public void run() 
{ 
    ms = System.currentTimeMillis(); 



    while(!Thread.currentThread().isInterrupted()) 
    { 
     int seconds = (int) (ms/1000) % 60 ; 
     int minutes = (int) ((ms/(1000*60)) % 60); 

    } 
} 

У меня также есть класс программ, который содержит основной метод. Это называет Gui.

public class Program { 

public static void main(String[] args) 
{ 
    SwingUtilities.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      Gui gui = new Gui(); 
      gui.swFrame.setVisible(true); 
     } 
    }); 

} 

}

ответ

2

Как обновить этикетку графический интерфейс с секундомером мс, с, мин?

Осторожно, Swing не является потокобезопасным, и вы не должны изменять его состояние вне контекста Event Dispatching Thread.

Один из подходов состоит в использовании Observer Pattern, где по таймеру запускаются обновления, на которые может отвечать пользовательский интерфейс.

Более простое решение может использовать свинг Timer над Thread, потому что свинг Timer является выполняет свои уведомления в контексте EDT

Рассмотрите возможность взглянуть на Concurrency in Swing и How to use Swing Timers для получения более подробной информации

+0

Для это упражнение я должен создать секундомер. Тема, которая обновляет время. И использование компонентов java swing. Я удалил SwingUtilities.invokeLater (новый Runnable() в классе Gui на данный момент. Что вы предлагаете мне делать? –

+0

Верните его. Я бы рекомендовал шаблон наблюдателя, поэтому каждый раз, когда ваш таймер обновляется , вы уведомляете наблюдателя, который нуждается в обновлении UI. – MadProgrammer

+0

Хорошо, спасибо, я попробую. –