2013-05-31 2 views
0

im пытается решить эту проблему за несколько дней. Моя программа редактирует изображения. им не используется многопоточность.Проблемы с mainThread

Я использую функцию (private void console()), которая записывает форматированный текст в JTextPane. У меня есть класс под названием ImageWork(), который работает с моими фотографиями.

моя проблема: я сначала вызываю функцию console("start with work"), после чего я вызываю функцию моего класса для редактирования изображения (требуется некоторое время). затем я позвонил еще раз в свою консольную («финишную») функцию. я пробовал много вещей, чтобы метод редактирования изображения подождал, пока консольная функция не будет готова без успеха :( , поэтому каждый раз, когда я вызываю 3 функции, сначала изображение будет отредактировано, тогда функция консоли записывает в мою текстовую панель оба текста .

private void color2gray()    
{   
     console("start")  
    try   
     { 
     myImg.color2gray(); 
     console("success"); 
     repaint();  
    } 
    catch (Exception e) 
    { 
     console("no success"); 
    } 

программа работает отлично. моя проблема заключается в том, что я хочу, чтобы текст в моей консоли (JTextPane), что функция начинается сейчас, и тогда функция color2gray начинается, потому что функция может занять одну минуту с большими картинками.

Я уже пробовал такие вещи, как изменить тип возврата консоли на boolean и назвать это:

while (!(console("start")) {}; 

Я был бы рад, если найдет кого-то решение этой проблемы. Благодаря

консоль (код):

private void console(String str,boolean fehler)   
{    
    time=new GregorianCalendar(); 

    String help=time.getTime().toString(); 
    help=help.substring(0,19); 

    doc = (StyledDocument) console.getDocument(); 
    Style style = doc.addStyle("StyleName", null); 

    StyleConstants.setForeground(style, Color.black); 
    try { doc.insertString(doc.getLength(),help, style); } 
    catch (BadLocationException e) { e.printStackTrace(); } 

    if (fehler) StyleConstants.setForeground(style, Color.red); 
    else StyleConstants.setForeground(style, new Color(0,125,0)); 

    try { doc.insertString(doc.getLength()," : "+str+"\n", style); } 
    catch (BadLocationException e1) { e1.printStackTrace(); } 
} 
+0

Извините, но я не понимаю, что вы проблема. Пожалуйста, отредактируйте свой пост, чтобы сделать его более понятным. – Gray

+0

Нам нужно увидеть больше кода. – blondeamon

+0

ok wait Я пытаюсь сделать это ясно – Andreas

ответ

0

Что такое имя потока, который вызывает color2gray()? Добавьте это к первой строке этой функции, чтобы узнать:

System.out.println("Thread = " + Thread.currentThread().getName()); 

Вы можете увидеть вывод вроде этого:

тему = AWT-EventQueue-0

Это означает, что код работает на «поток событий». Это должен быть единственный поток, который изменяет компоненты Swing/GUI. И этот поток НЕ должен выполнять долговременную работу. Если это поток событий, то вам нужно сделать свою длинную работу в фоновом режиме.

изменение

myImg.color2gray(); 

к

Thread t = new Thread() { 
    @Override 
    public void run() { 
     myImg.color2gray(); 
    } 
}; 
t.start(); 

В начале. И далее о резьбе свинг событий:

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html http://en.wikipedia.org/wiki/Event_dispatching_thread

+0

ответы на быстрые ответы – Andreas

+0

благодаря быстрым ответам. Я решу эту проблему с SwingWorker, но я также старался сделать это как Keith, но есть больше функций, поэтому я мог бы снова работать с этим swingWorker. – Andreas

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