別のスレッド内からラベルを更新する

アーブリー

私は最近Javaを手に入れ、時間管理アプリに取り組んでいます(私たちは皆、最近、それらの恐ろしいタイムシートに記入する必要があります...)。

私は順調に進歩しており、EclipseのWindow Builderはかなり素晴らしいと感じていますが、ToDoリストの最後のものに完全に困惑しています。開始タイムスタンプから毎秒計算される現在のタイムスタンプを引いたものに基づいて計算した時間文字列を使用して、UIのラベルを更新しようとしています。これは、現在のタスクにかかっている時間を表します。

これはこれまでの私のコードであり、UIのラベルの更新以外はすべて機能しています。コードの下から20行です。

import java.io.FileWriter;
import java.io.IOException;

import javax.swing.*;

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.wb.swt.SWTResourceManager;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.widgets.Table;

public class mainDisplay {
private static Text txtTask;
static boolean timerRunning = false;
static long timePassed = 0;
static long startTime = 0;
static long currTime = 0;
static String timeString = "";

/**
 * Launch the application.
 * @param args
 */

public static String timeString(long timePassed) {
    if(timePassed < 10) {
        timeString = "00:00:0"+String.valueOf(timePassed);
    }
    else if(timePassed < 60 && timePassed >= 10){
        timeString = "00:00:"+String.valueOf(timePassed);
    }
    else if(timePassed >= 60 && timePassed < 600){
        timeString = "00:0" + String.valueOf(timePassed/60) + ":";
        if(timePassed % 60 < 10){
            timeString = timeString + "0"+String.valueOf(timePassed%60);
        }
        else{
            timeString = timeString + String.valueOf(timePassed%60);
        }
    }
    else if(timePassed >= 600 && timePassed < 3600){
        timeString = "00:" + String.valueOf(timePassed/60) + ":";
        if(timePassed % 60 < 10){
            timeString = timeString + "0"+String.valueOf(timePassed%60);
        }
        else{
            timeString = timeString + String.valueOf(timePassed%60);
        }
    }
    else if(timePassed >= 3600 && timePassed < 36000){
        // Hours
        timeString = "0" + String.valueOf(timePassed/3600) + ":";
        // Mins
        if((timePassed%3600)/60 < 10){
            timeString = timeString + "0" + String.valueOf((timePassed%3600)/60) + ":";
        }
        else if((timePassed%3600)/60 >= 10){
            timeString = timeString + String.valueOf((timePassed%3600)/60) + ":";
        }
        // Secs
        if((timePassed%3600)%60 < 10){
            timeString = timeString + "0" + String.valueOf((timePassed%3600)%60);
        }
        else if((timePassed%3600)%60 >= 10){
            timeString = timeString + String.valueOf((timePassed%3600)%60);
        }
    }
    return timeString;
}

public static void main(final String[] args) {
    Display display = Display.getDefault();
    final Shell shlSot = new Shell();
    shlSot.setBackground(SWTResourceManager.getColor(SWT.COLOR_TITLE_BACKGROUND));
    shlSot.setSize(455, 299);
    shlSot.setText("SOT 1.0");

    txtTask = new Text(shlSot, SWT.BORDER);
    txtTask.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseUp(MouseEvent e) {
            txtTask.setText("");
        }
    });
    txtTask.setFont(SWTResourceManager.getFont("Segoe UI", 11, SWT.NORMAL));
    txtTask.setText("Add a task...");
    txtTask.setBounds(10, 62, 198, 27);

    Label lblTitle = new Label(shlSot, SWT.NONE);
    lblTitle.setFont(SWTResourceManager.getFont("Script MT Bold", 22, SWT.BOLD));
    lblTitle.setBackground(SWTResourceManager.getColor(SWT.COLOR_TITLE_BACKGROUND));
    lblTitle.setBounds(45, 15, 175, 37);
    lblTitle.setText("Sands of Time");

    final Table tblTasks = new Table(shlSot, SWT.BORDER | SWT.FULL_SELECTION);
    tblTasks.setBounds(10, 107, 417, 144);
    tblTasks.setHeaderVisible(true);
    tblTasks.setLinesVisible(true);

    TableColumn clmTask = new TableColumn(tblTasks, SWT.NONE);
    clmTask.setText("Task");
    TableColumn clmTime = new TableColumn(tblTasks, SWT.NONE);
    clmTime.setText("Time");

    tblTasks.getColumn(0).pack();
    tblTasks.getColumn(1).pack();

    Label lblHourGlass = new Label(shlSot, SWT.NONE);
    lblHourGlass.setBackground(SWTResourceManager.getColor(SWT.COLOR_TITLE_BACKGROUND));
    lblHourGlass.setFont(SWTResourceManager.getFont("Wingdings", 30, SWT.NORMAL));
    lblHourGlass.setBounds(14, 11, 32, 46);
    lblHourGlass.setText("6");

    final Label lblTimer = new Label(shlSot, SWT.NONE);
    lblTimer.setAlignment(SWT.CENTER);
    lblTimer.setFont(SWTResourceManager.getFont("Segoe UI", 19, SWT.NORMAL));
    lblTimer.setBackground(SWTResourceManager.getColor(SWT.COLOR_TITLE_BACKGROUND));
    lblTimer.setBounds(268, 17, 113, 32);
    lblTimer.setText("00:00:00");

    final Button btnExport = new Button(shlSot, SWT.NONE);
    final Button btnClear = new Button(shlSot, SWT.NONE);
    final Button btnStart = new Button(shlSot, SWT.NONE);
    final Button btnStop = new Button(shlSot, SWT.NONE);

    btnClear.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            int dialogButton = 0;
            // Prompt the user whether to go ahead or not
            int dialogResult = JOptionPane.showConfirmDialog (null, "Are you sure you want to clear all progress?","Warning",dialogButton);
            if(dialogResult == JOptionPane.YES_OPTION){
                // Stop the timer
                timerRunning = false;

                // Clear the timer on the UI
                lblTimer.setText("00:00:00");

                // Enable/Disable buttons and reset text
                btnStop.setEnabled(false);
                btnExport.setEnabled(true);
                btnStart.setEnabled(true);
                txtTask.setEnabled(true);
                txtTask.setText("Add a task...");

                // Empty the list on the UI
                tblTasks.removeAll();
            }
        }
    });
    btnClear.setBounds(370, 63, 57, 25);
    btnClear.setText("Clear");


    btnExport.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            // Export the contents of the list to CSV
            try{
                FileWriter writer = new FileWriter("sotExport.csv");

                writer.append("Task");
                writer.append(',');
                writer.append("Time");
                writer.append('\n');

                TableItem [] items = tblTasks.getItems ();
                for(int i=0; i<items.length; i++) {                     
                    writer.append(items[i].getText(0));
                    writer.append(',');
                    writer.append(items[i].getText(1));
                    writer.append('\n');
                }

                writer.flush();
                writer.close();
            }
            catch(IOException e1){
                 e1.printStackTrace();
            }
        }
    });
    btnExport.setBounds(319, 63, 46, 25);
    btnExport.setText("Export");

    btnStop.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            // Stop button stuff

            // Add contents of txtTask to list
            //lstTasks.add(txtTask.getText());
            TableItem item = new TableItem(tblTasks, SWT.NONE);
            item.setText(0, txtTask.getText());
            item.setText(1, timeString);
            tblTasks.getColumn(0).pack();
            tblTasks.getColumn(1).pack();

            btnStop.setEnabled(false);
            btnClear.setEnabled(true);
            btnExport.setEnabled(true);
            btnStart.setEnabled(true);
            txtTask.setEnabled(true);
            timerRunning = false;
        }
    });
    btnStop.setBounds(267, 63, 46, 25);
    btnStop.setText("Stop");
    btnStop.setEnabled(false);


    btnStart.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            // Update UI options
            btnStop.setEnabled(true);
            btnStart.setEnabled(false);
            txtTask.setEnabled(false);
            btnClear.setEnabled(false);
            btnExport.setEnabled(false);

            // Start timer and update lblTimer
            timerRunning = true;
            startTime = (System.currentTimeMillis() / 1000L);
            System.out.println(startTime);

            new Thread(new Runnable(){ 
                public void run(){ 
                    while (timerRunning){ 
                        // Get current time and calculate timer                     
                        currTime = System.currentTimeMillis() / 1000L;
                        timePassed = currTime - startTime;
                        timeString = timeString(timePassed);

                        try {
                            // Why do you not work?!!?!? >:(
                            lblTimer.setText(timeString);

                            Thread.sleep(1000);
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        }
                    } 
                } 
            }).start();
        }
    });
    btnStart.setBounds(214, 63, 46, 25);
    btnStart.setText("Start");

    shlSot.open();
    shlSot.layout();
    while (!shlSot.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
}
}

[開始]をクリックすると、次の例外が発生します。

Exception in thread "Thread-0" org.eclipse.swt.SWTException: Invalid thread access
    at org.eclipse.swt.SWT.error(SWT.java:4397)
    at org.eclipse.swt.SWT.error(SWT.java:4312)
    at org.eclipse.swt.SWT.error(SWT.java:4283)
    at org.eclipse.swt.widgets.Widget.error(Widget.java:472)
    at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:363)
    at org.eclipse.swt.widgets.Label.setText(Label.java:386)
    at mainDisplay$5$1.run(mainDisplay.java:246)
    at java.lang.Thread.run(Unknown Source)

なぜ最初のラウンドで例外を遮断したのかはわかりませんが、あります。

これはスレッドの問題ですか?新しいスレッド内から表示スレッドにアクセスしてラベルを更新することはできませんか?それを回避する方法はありますか?

ありがとう

スティーブ

アーブリー

理解した..

交換したばかりです。

lblTimer.setText(timeString);

と;

display.asyncExec(new Runnable() {
   public void run() {
      lblTimer.setText(timeString);
   }
});

それでも誰かが良い説明を提供したいのであれば、それは大いにありがたいです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Vaadin 8:別のスレッドからモーダルフォームのラベル値を更新する方法

分類Dev

スレッド内のJFrameラベルを更新する方法 -Java

分類Dev

C#/ WPF別のクラス内で作成された別のスレッドからUIを更新する

分類Dev

別のスレッドのモジュールからラベルを更新しています

分類Dev

BackgroundWorkerスレッド内からラベルを更新するにはどうすればよいですか?

分類Dev

Android:別のクラスのスレッドからUIを更新する

分類Dev

JavaFX-他のスレッドからラベル値を更新します

分類Dev

別のスレッドからUIを更新する

分類Dev

別のスレッドからAnchorPaneを更新するJavaFX

分類Dev

フラグメント内のバックグラウンドスレッドからUIを更新する方法

分類Dev

Android-別のスレッドのforループからプログレスバーを更新する

分類Dev

他のスレッドからのVB.net更新ラベル

分類Dev

プログラムの実行中にGTKのラベルを変更するにはどうすればよいですか。別のスレッドから

分類Dev

C#-別のクラスのスレッドからメインUIを更新する方法

分類Dev

別のスレッドからループを解除する

分類Dev

レベルから別のレベルへのドラッグアンドドロップを無効にする

分類Dev

別のスレッドのアクティビティからフラグメントを更新する

分類Dev

別のスレッドからRecyclerViewを更新すると、エラーが発生します

分類Dev

Javaの別のスレッドからSWT GUIを更新する方法

分類Dev

WPFの別のスレッドからImage.sourceを更新する

分類Dev

別のスレッドからTextBlockをすばやく更新する

分類Dev

別のスレッドからコントロールのプロパティ(label.Text)を更新する

分類Dev

UI を別のスレッドから更新する C++ Windows Form アプリ

分類Dev

別のスレッドからGUIにラベルを送信するにはどうすればよいですか-PyQt

分類Dev

Webアプリケーションのスレッドから制御ラベルを更新します

分類Dev

データベース内のテーブルを別の形式のテーブルから更新する

分類Dev

C#でループUDPリッスンを実行する別のスレッドからマルチテキストボックスを更新する

分類Dev

別のクラスとスレッドからのインターフェイスコールバックからwinformを更新します

分類Dev

コードビハインド(別のクラス)からXamarinページラベルを更新します

Related 関連記事

  1. 1

    Vaadin 8:別のスレッドからモーダルフォームのラベル値を更新する方法

  2. 2

    スレッド内のJFrameラベルを更新する方法 -Java

  3. 3

    C#/ WPF別のクラス内で作成された別のスレッドからUIを更新する

  4. 4

    別のスレッドのモジュールからラベルを更新しています

  5. 5

    BackgroundWorkerスレッド内からラベルを更新するにはどうすればよいですか?

  6. 6

    Android:別のクラスのスレッドからUIを更新する

  7. 7

    JavaFX-他のスレッドからラベル値を更新します

  8. 8

    別のスレッドからUIを更新する

  9. 9

    別のスレッドからAnchorPaneを更新するJavaFX

  10. 10

    フラグメント内のバックグラウンドスレッドからUIを更新する方法

  11. 11

    Android-別のスレッドのforループからプログレスバーを更新する

  12. 12

    他のスレッドからのVB.net更新ラベル

  13. 13

    プログラムの実行中にGTKのラベルを変更するにはどうすればよいですか。別のスレッドから

  14. 14

    C#-別のクラスのスレッドからメインUIを更新する方法

  15. 15

    別のスレッドからループを解除する

  16. 16

    レベルから別のレベルへのドラッグアンドドロップを無効にする

  17. 17

    別のスレッドのアクティビティからフラグメントを更新する

  18. 18

    別のスレッドからRecyclerViewを更新すると、エラーが発生します

  19. 19

    Javaの別のスレッドからSWT GUIを更新する方法

  20. 20

    WPFの別のスレッドからImage.sourceを更新する

  21. 21

    別のスレッドからTextBlockをすばやく更新する

  22. 22

    別のスレッドからコントロールのプロパティ(label.Text)を更新する

  23. 23

    UI を別のスレッドから更新する C++ Windows Form アプリ

  24. 24

    別のスレッドからGUIにラベルを送信するにはどうすればよいですか-PyQt

  25. 25

    Webアプリケーションのスレッドから制御ラベルを更新します

  26. 26

    データベース内のテーブルを別の形式のテーブルから更新する

  27. 27

    C#でループUDPリッスンを実行する別のスレッドからマルチテキストボックスを更新する

  28. 28

    別のクラスとスレッドからのインターフェイスコールバックからwinformを更新します

  29. 29

    コードビハインド(別のクラス)からXamarinページラベルを更新します

ホットタグ

アーカイブ