2012-03-27 2 views
-2

Im создает программу Reversi, и мне нужно отложить программу на что-то вроде 0,5 секунды между каждым переключателем изображения (от черного до белого, в функции Eat), проблема в том, что использование Threads не работает, оно бесполезно и я получаю неправильный результат. Мне нужно некоторое количество ват для задержки программы без использования потоков. Вот функция, если вам это понадобится.Задержка java-программы

public void func1(int turn) 
{ 
    int i,k; 
    for(i=0;i<8;i++) 
    for(k=0;k<8;k++) 
    { 
    if(eat[i][k]==turn) 
    { 
     board[i][k]=turn; 
     if(turn==1) 
      squares[i][k].setIcon(new ImageIcon("blkimg.PNG")); 
     else 
      squares[i][k].setIcon(new ImageIcon("whtimg.PNG")); 
    } 
    } 
} 

Спасибо большое.

+0

Java (из названия вопроса). Я добавил тег. :) –

+0

Что «беспорядок» при использовании Thread.sleep()? – Exupery

+0

Я попытался создать еще один поток, но оба потока используют одни и те же переменные, поэтому он не «перевернул» нужные фрагменты – Sagi

ответ

1

Вам не нужно будет обширные знания потоков поставить текущий спать с помощью Thread.sleep() - я рекомендовал бы взглянуть на http://docs.oracle.com/javase/tutorial/essential/concurrency/sleep.html

+0

Он не «переворачивает» их по одному. например: если мне нужно перевернуть 5 штук, значит он ждет 5 * 0,5 секунды, и они перевернут их все вместе. – Sagi

+0

Где вы назвали сон? 'Thread.sleep (500);' непосредственно перед 'if (turn == 1)' должен делать именно то, что вы ищете. – Exupery

+0

Я назвал его перед «доской [i] [k] = поворот;» – Sagi

-1

Я что-то пропустил? Почему вы не можете использовать Thread.sleep(), чтобы поместить текущий поток в режим сна?

В ответ на обсуждение в комментариях:

Вы должны понять идею графического интерфейса потока. Если весь ваш код выполняется в потоке gui, графический интерфейс не перерисовывается «по ходу». Быстрое и грязное исправление заключается в том, чтобы вызвать необходимые вызовы, чтобы принудительно выполнить перерисовку.

+0

1 Я действительно новичок в потоках и не знаю, как их использовать, но я действительно пробовал функционировать сон, и возникла проблема, что он не «переворачивал» все части, только первый. – Sagi

+1

У вас есть истинное многопоточное приложение или с помощью Thread.sleep() не исправить вашу проблему? Thread.sleep() не создает новые потоки и т. Д., Он просто заставляет текущий спать (это то, что задают ваши вопросы). Возможно, вы задаете неправильный вопрос? Почему вы даже думаете, что вам нужно задерживаться? – John3136

+0

Задержка очень важна, если программа перевертывает все части сразу, поэтому пользователь не может понять, что движет компьютер. – Sagi

1

Если я правильно ваш является общей проблемой.

Использование Thread.sleep() может привести к задержке точно в той же Thread, которая используется Swing для изменения интерфейса (обычно это отображается в интерфейсе, который не реагирует, а затем показывает все изменения сразу).

Вы можете узнать больше о Concurrency in Swing в учебниках по Java.

Решение может состоять в использовании класса SwingWorker, а пару месяцев назад я создал небольшой образец для друга. Это available in GitHub. Если вы не используете Netbeans, просто взгляните на this class (линии 90-98 и 151-165).

Редактировать: корректировки, отражающие тот факт, что это всего лишь одно возможное решение. Как указывали другие, существует, по крайней мере, еще одна хорошая альтернатива.

+0

Я предполагаю, что это может быть проблема, трудно ли решить проблему? – Sagi

+1

Лучше использовать таймер Swing для этой простой задержки, а не преодолевать все проблемы SwingWorker. –

+0

Я не знаю, как использовать любой из этих ... это действительно выглядит глупо, что я должен сделать что-то очень просто за 0,5 секунды задержки. – Sagi

2

Это выглядит приложение Свинг (вы никогда не говорите, и это очень важная информация. Если это так, просто использовать Swing Timer создать задержку. Кроме того, не продолжайте чтение в файлах изображений. Чтение их только один раз, создайте свои значки изображений один раз, возможно, в конструкторе классов и сохраните ImageIcons для переменных или массива или коллекции.

+0

спасибо, его проблема решена, но появился другой. программа не переворачивает все части, которые она должна, только первая. i помещает «ActionListener taskPerformer = new ActionListener() {public void actionPerformed (ActionEvent evt) {« до «if (turn == 1)», и i помещает «timer2.stop(); };}; timer2 = новый таймер (200, taskPerformer); timer2.start(); " после «квадратов [i] [k] .setIcon (новый ImageIcon (« whtimg.PNG »))». – Sagi

+0

@Sagi: не пытайтесь опубликовать код в комментарии, поскольку, как вы можете видеть, он не сохраняет свое форматирование и становится нечитаемым. Вместо этого отредактируйте исходный вопрос и добавьте свой новый код и объяснение в конец оригинального вопроса, а затем прокомментируйте мне ответ, чтобы я знал, чтобы посмотреть на него. Много удачи! –

+0

@Sagi: также, * где * точно вы хотите поставить задержку? Можете ли вы подробно описать, что должен делать метод и задержка? Предположите, что я ничего не знаю о вашей игре. –

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