[java] wątki, gui

0

rozwijam sobie mój program do wyłączania komputera i chcę teraz aby wyświetlał on aktualną godzinę. Problem mam z tym aby godzina odświeżała się cały czas. Niby wątek jak wypisuje godzinę pokazuję poprawną (przez System.out...) ale gdy przekazuję ją do gui to nie jest ona wyświetlana.

public class Time implements Runnable {

    Calendar calendar = new GregorianCalendar();

    public Time() {
       
        Thread w = new Thread(this);
        w.start();
    }

    @Override
    public void run() {
         GUI gui = new GUI();
        //System.out.println(hourOfDay + ":" + minute);
        while (true) {
            int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY);
            int minute = calendar.get(Calendar.MINUTE);
            String czas = hourOfDay + ":" + minute;
            //System.out.println(hourOfDay + ":" + minute);
              gui.getTimeLabel().setText(hourOfDay + ":" + minute);
             
            
            
            
            try {
                Thread.sleep(1000);
            } catch (Exception ek) {
            }


        }
    }
}
0

Zapewne brakuje tam jakiegoś repaint()

0

próbowałem już repaint() i całego gui i samego labela gdzie ma się wyświetlać info i nie daje to żadnego efektu

0

Masz dwa poważne błędy:
1, Zakładasz, że obiekt typu GregorianCalendar (u Ciebie calendar) działa jak zegar. On tak nie działa, skoro został utworzony raz, to cały czas jego metoda get będzie zwracała to samo.
2. Wewnątrz klasy Time, tworzysz nowy (zapewne niewidoczny) obiekt typu GUI i w tym obiekcie zmieniasz napis na JLabel, a nie w oryginalnym istniejącym oknie.

Powinieneś też poprawić format wyświetlanego czasu (poczytaj o klasie SimpleDateFormat). Nie ma sensu odświeżanie co sekundę, skoro wyświetlasz tylko godziny i minuty.
Prościej można zrobić to co chcesz przy pomocy klasy javax.swing.Timer.

import java.util.*;

public class Time implements Runnable {    
    Gui gui = null; 
    public Time(Gui gui) {
        this.gui = gui;
        Thread w = new Thread(this);
        w.start();
    }
 
    @Override
    public void run() {
         
        while (true) {
            Calendar calendar = new GregorianCalendar(); 
            int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY);
            int minute = calendar.get(Calendar.MINUTE);
            String czas = hourOfDay + ":" + minute;
            gui.getTimeLabel().setText(czas);
            gui.repaint();
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
            }
 
 
        }
    }
}
0

dziękuje śmiga wszytko teraz

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.