2016-04-06 32 views
0

Şu anda bir sorun yaşıyorum çünkü her şey düzgün çalışıyor ve sadece kolay bir sistem saati ve tarih kurulumu oluşturmak için bir kod ile deney yapıyordum. Bir şekilde tamir edebilecek bir sorunum var. Bu yüzden bir etiket belirledim (JLabel değil) ve çalıştırılabilir bir boşlukla çalıştırmayı denediğimde, sistemin tam zamanını güncellemek için metni ayarlamaya çalıştığımda hata görünüyor. Yani örnekte Time.setText (zaman); zaman bir dize olarak tanımlanacak ama sadece hatalar ve işe yaramıyor.Neden bir runnable kullanırken Etiketim Java SWT Gui uygulamam için değişmiyor?

import java.util.Calendar; 
import java.util.GregorianCalendar; 

import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 
import org.eclipse.swt.widgets.Label; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.widgets.Composite; 

public class HomeScreen { 

protected Shell shell; 
private Label Date; 
private Label Time; 
private Composite composite; 


/** 
* Launch the application. 
* @param args 
*/ 
public static void main(String[] args) { 
      try { 
       HomeScreen window = new HomeScreen(); 
       window.open(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

/** 
* Open the window. 
*/ 
public void open() { 
    Display display = Display.getDefault(); 
    createContents(); 
    shell.open(); 
    shell.layout(); 
    Date(); 
    Time(); 
    while (!shell.isDisposed()) { 
     if (!display.readAndDispatch()) { 
      display.sleep(); 
     } 
    } 
} 

/** 
* Create contents of the window. 
*/ 
protected void createContents() { 
    shell = new Shell(); 
    shell.setSize(450, 300); 
    shell.setText("Project Serenity"); 

    composite = new Composite(shell, SWT.NONE); 
    composite.setBounds(0, 0, 470, 278); 

    Time = new Label(composite, SWT.NONE); 
    Time.setLocation(10, 192); 
    Time.setSize(169, 31); 
    Time.setText("Time"); 

    Date = new Label(composite, SWT.NONE); 
    Date.setLocation(10, 217); 
    Date.setSize(169, 38); 
    Date.setText("Date"); 

} 
public void Date() 
{ 
    Thread Date2 = new Thread() 
    { 
     @Override 
     public void run() 
     { 
      try { 
       for(;;){ 
        Calendar cal = new GregorianCalendar(); 
        int day = cal.get(Calendar.DAY_OF_MONTH); 
        int month = cal.get(Calendar.MONTH); 
        int year = cal.get(Calendar.YEAR); 
        Time.setText(day + ", " + month + " " + year);   
       sleep(1000); 
       } 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }; 
    Date2.start(); 
} 
public void Time() 
{ 
    Thread Time2 = new Thread() 
    { 
     @Override 
     public void run() 
     { 
      try { 
       for(;;){ 
       Calendar cal = new GregorianCalendar(); 
       int second = cal.get(Calendar.SECOND); 
       int minute = cal.get(Calendar.MINUTE); 
       int hour = cal.get(Calendar.HOUR); 
       int am_pm = cal.get(Calendar.AM_PM); 
       sleep(1000); 
       Time.setText(hour + ":" + minute + ":" + second + " " + am_pm); 
       } 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }; 
    Time2.start(); 
} 

}

cevap

1

Kullanıcı Arayüzü nesnelere tüm erişim Kullanıcı Arayüzü parçacığı yapılmalıdır

Thx pixl. Başka bir iş parçacığında bunlara erişmeye çalışmak bir istisna atar.

UI iş parçacığı içinde Runnable yürütmek için DisplayasyncExec yöntemini kullanabilirsiniz. Bunun yerine sadece yapıyor: Arka plan iş parçacığı içinde

Time.setText(day + ", " + month + " " + year);   

yapın:

Display.getDefault().asyncExec(() -> Time.setText(day + ", " + month + " " + year)); 

Eğer Java eski bir sürümünü kullanıyorsanız yukarıdaki, Java 8 içindir kullanın:

Display.getDefault().asyncExec(new Runnable() { 
    @Override 
    public void run { 
    Time.setText(day + ", " + month + " " + year);   
    } 
}); 

Not: Lütfen Java adlandırma kurallarını kullanmayı öğrenin - değişkenler küçük harfle başlar Timetime olmalıdır.

Ayrıca, uygulamadan çıktığınızda güncelleştirme iş parçacığınızı durdurmak için hiçbir şey yapmıyorsunuz. Ana kullanıcı arayüzü iş parçacığı durduktan sonra kontrollere erişim size bir hata verecektir. Uygulamanın durduğunu söyleyen Time kontrolünün elden çıkarılıp kaldırılmadığını test edebilirsiniz.

if (Time.isDisposed()) { 
    // TODO exit the thread 
} 
+0

@Pixlation Aynı argüman, yöntem adları için de geçerlidir. – Baz

+0

Baz tamam evet, bu mantıklı geliyor – Pixlation

+0

Uygulamayı kapattığımda da hatalar atılıyor ... – Pixlation