2015-09-09 3 views
1

Я хочу, чтобы это было, когда я нажимаю кнопку, время будет обновляться. Могу ли я получить подсказку или помочь в том, как я это выполнил, если то, что я хочу, вообще возможно.время обновления при нажатии кнопки

Я изо всех сил старался сделать это в течение последних двух дней, поэтому любая помощь будет принята с благодарностью.

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.*; 
import javax.swing.*; 
import static javax.swing.BoxLayout.X_AXIS; 
import static javax.swing.BoxLayout.Y_AXIS; 

public class CountdownNBA2K16 extends JFrame implements ActionListener{ 

     JLabel displayDate ; 
     JLabel displayDateS ; 
     JLabel displayDateM ; 
     JLabel displayDateH ; 
     JLabel displayDateD ; 

     JPanel Mili = new JPanel(); 
     JPanel Sec = new JPanel(); 
     JPanel minute = new JPanel(); 
     JPanel hours = new JPanel(); 
     JPanel day = new JPanel(); 
     JPanel cd = new JPanel(); 
     JPanel combine = new JPanel(); 

     JButton button = new JButton("update time"); 

     Calendar releaseDate; 
     Calendar todayDate; 

     long diff; 
     long diffSec; 
     long days; 
     long secDays; 
     long secs; 
     long min; 
     long hour; 

     int SECONDS_IN_A_DAY = 24 * 60 * 60; 

     String ms; 
     String s; 
     String m; 
     String h; 
     String d; 

    public CountdownNBA2K16() { 
     super("COUNTDOWN TO NBA2K16");//sets title of app 

     setLayout(new FlowLayout()); 

       button.addActionListener(this); 

       releaseDate = Calendar.getInstance(); 
       releaseDate.set(Calendar.DAY_OF_MONTH,25); 
       releaseDate.set(Calendar.MONTH,8); 
       releaseDate.set(Calendar.YEAR,2015); 

       todayDate = Calendar.getInstance(); 
       diff = releaseDate.getTimeInMillis() - todayDate.getTimeInMillis(); 
       diffSec = diff/1000; 

       days = diffSec/SECONDS_IN_A_DAY; 
       secDays = diffSec % SECONDS_IN_A_DAY; 
       secs = secDays % 60; 
       min = (secDays%60) %60; 
       hour = (secDays/3600); 

       s = String.valueOf(secs); 
       displayDateS = new JLabel("seconds:"+s + ""); 

       m = String.valueOf(min); 
       displayDateM = new JLabel("minutes:"+m +""); 

       h = String.valueOf(hour); 
       displayDateH = new JLabel("hours:"+h+""); 

       d = String.valueOf(days); 
       displayDateD = new JLabel("days:"+d+""); 

       Sec.add(displayDateS); 
       minute.add(displayDateM); 
       hours.add(displayDateH); 
       day.add(displayDateD); 

       cd.add(day); 
       cd.add(hours); 
       cd.add(minute); 
       cd.add(Sec); 
       cd.setLayout(new BoxLayout(cd ,X_AXIS)); 

       combine.add(button); 
       combine.add(cd); 
       combine.setLayout(new BoxLayout(combine ,Y_AXIS)); 

       add(combine); 

       pack(); 

       setSize(300,300); 
       setResizable(false);//doesnt let user resize the gui 
     setLocationRelativeTo(null);//sets location relative to nothing 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//makes the applictaion close when the gui is closed 

    } 
     @Override 
    public void actionPerformed(ActionEvent e) { 

      displayDateS.getText(); 
      displayDateM.getText(); 
      displayDateH.getText(); 
      displayDateD.getText();  
     } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new CountdownNBA2K16().setVisible(true); 
      } 
     }); 
    } 

} 
+0

Время будет обновлено до какого? Текущее время? Не совсем ясно, в какой части вы застряли - хотя стоит отметить, что у вас есть * много полей в этом классе, большинство из которых, вероятно, будут лучше, чем локальные переменные. (И другим было бы лучше использовать что-то вроде 'java.time.Duration', а не иметь отдельные поля в течение нескольких дней, часов и т. Д.). –

ответ

1

Начните с использования чего-то вроде Java 8 Time API или Joda-Time для расчета продолжительности.

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

Что-то вроде ...

protected void updateDuration() { 
    System.out.println(LocalDateTime.now()); 
    Duration d = Duration.between(releaseDate.atStartOfDay(), LocalDateTime.now()); 
    System.out.println(d.toMillis()); 
    long days = d.toDays(); 
    d = d.minusDays(days); 
    long hours = d.toHours(); 
    d = d.minusHours(hours); 
    long mins = d.toMinutes(); 
    d = d.minusMinutes(mins); 
    long seconds = d.toMillis()/1000; 

    displayDateS.setText("Seconds: " + seconds); 
    displayDateM.setText("Minutes: " + mins); 
    displayDateH.setText("Hours: " + hours); 
    displayDateD.setText("Days: " + days); 
} 

, например (только убедитесь, что вы создали ярлыки, прежде чем вы это называете)

Вы могли бы также взглянуть на How to use Swing Timers обновить выход автоматически.

0

Аналогия просто. Потому что до сих пор я не могу опубликовать комментарий, поэтому я ответил вам. В методе actionPerformed просто установите текст ярлыков так, как вы хотите.

public class CountdownNBA2K16 extends JFrame implements ActionListener { 

    JLabel displayTime; 
    JButton button = new JButton("Update time"); 

    public CountdownNBA2K16() { 
     super("Time"); 
     setLayout(new FlowLayout()); 
     button.addActionListener(this); 
     displayTime = new JLabel("Just to see the updates ..." + System.currentTimeMillis()); 
     setSize(300, 300); 
     add(displayTime); 
     add(button); 
     pack(); 
     setResizable(false); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     displayTime.setText("Just to see the updates ..." + System.currentTimeMillis()); 
    } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new CountdownNBA2K16().setVisible(true); 
      } 
     }); 
    } 

} 
Смежные вопросы