2015-03-12 3 views
0

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

Мой код:

Thread t2 = new Thread() { 

    public void run() { 
     System.out.println("t2 thread içindeyim."); 
     try { 
      String sql = " RESTORE DATABASE Genius3"+ 
          " FROM DISK = '"+collected.getdbpath()+"'"+ 
          " WITH MOVE 'GeniusIII_Data' TO 'C:\\SQLDATA\\Genius3.mdf',"+ 
          " MOVE 'GeniusIII_Log' TO 'C:\\SQLDATA\\Genius3_1.ldf'"; 

      Class.forName(driver).newInstance(); 
      con = DriverManager.getConnection(url); 
      stmt = con.prepareStatement(sql); 
      rs = stmt.executeQuery();} 
      catch (Exception ef) {ef.printStackTrace();} 
      finally { 

      ekran5.text_1.setText("done"); 

      }   
    } 
}; 

и другой класс, который имеет то текстовое поле в нем;

public class ekran5 { 

public static Label islemlabel; 

public static Composite composite_1 ; 
public static Label detail; 
public static Text text_1; 
public static void start(){ 


composite_1 = new Composite(Loader.composite, SWT.BORDER | SWT.EMBEDDED); 
composite_1.setBackground(SWTResourceManager.getColor(192,192,192)); 
composite_1.setBounds(362, 83, 668, 536); 

islemlabel = new Label(composite_1, SWT.NONE); 
islemlabel.setFont(SWTResourceManager.getFont("Arial CYR", 10, SWT.NORMAL)); 
islemlabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_GRAY)); 
islemlabel.setBounds(10, 448, 84, 15); 
islemlabel.setText("\u0130\u015Flem Detay\u0131"); 

text_1 = new Text(composite_1, SWT.BORDER); 
text_1.setBounds(10, 469, 628, 37); 
} 

}

В блоке, наконец, я обновляю текстовое поле, но это дает мне недопустимое исключение доступа поток из-за этого.

+0

Является ли ваше приложение WPF? Какая именно ошибка? – jtimperley

+0

Если вы получаете исключение, связанное с потоками, я думаю, маловероятно, что ваш вопрос относится к серверу sql ... вам может помочь, если вы помечаете свой вопрос надлежащим образом? –

+0

Ya, только что осознал проблему с тегом, :) –

ответ

1

В SWT только пользовательский интерфейс разрешает обновлять виджеты, используя Display.syncExec для выполнения всех обновлений пользовательского интерфейса. (В качестве альтернативы можно использовать задание пользовательского интерфейса.)

Также чтение SWT FAQ было бы мудрым шагом, это звучит как FAQ для меня.

+0

Я попытался использовать это, но у меня нет дисплея в классе, который запускает поток. Только у основного класса есть дисплей, который добавляет текстовое поле к нему из другого класса, поэтому я не знаю, как это сделать, и я не смог добиться успеха при установке фраз, которые вы дали. Должен ли я поставить его после блока отображения, который был описан в основном классе? –

+0

Display.getDefault должен показывать текущий дисплей. Если нет (я не нахожусь перед компьютером для проверки), вы должны убедиться, что ваш код может получить доступ к дисплею. –

+0

Я просто сделал это :) Большое вам спасибо :) –