2017-02-12 4 views
1

Итак, я пытаюсь выяснить, как добавить паузы в карточную игру, чтобы заставить процессор действовать так, как будто они по очереди. Но есть слишком много кода, поэтому я думаю, что если мы продемонстрируем стратегию этого кода, это может сработать.Как заставить этот проект приостановиться в течение заданного промежутка времени после нажатия кнопки

Как сделать этот код паузой, скажем через 5 секунд после нажатия кнопки, и THEN распечатать сообщение.

public class TimerTest extends JFrame implements ActionListener{ 

private static final long serialVersionUID = 7416567620110237028L; 
JTextArea area; 
Timer timer; 
int count; // Counts the number of sendings done by the timer 
boolean running; // Indicates if the timer is started (true) or stopped (false) 

public TimerTest() { 
    super("Test"); 
    setBounds(30,30,500,500); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setLayout(null); 

    area = new JTextArea(); 
    area.setBounds(0, 0, 500, 400); 
    add(area); 

    JButton button = new JButton("Click Me!"); 
    button.addActionListener(this); 
    button.setBounds(200, 400, 100, 40); 
    add(button); 

    // Initialization of the timer. 1 second delay and this class as ActionListener 
    timer = new Timer(5000, this); 
    timer.setRepeats(true); // Send events until someone stops it 
    count = 0; // in the beginning, 0 events sended by timer 
    running = false; 
    System.out.println(timer.isRepeats()); 
    setVisible(true); // Shows the frame 
} 

public void actionPerformed(ActionEvent e) { 
    if (! running) { 
     timer.start(); 
     running = true; 
    } 
    // Writing the current time and increasing the cont times 
    area.append(Calendar.getInstance().getTime().toString()+"\n"); 
    count++; 
    if (count == 10) { 
     timer.stop(); 
     count = 0; 
     running = false; 
    } 
} 

public static void main(String[] args) { 
    // Executing the frame with its Timer 
    new TimerTest(); 
} 
} 

То, что я действительно хотел бы сделать это, чтобы иметь возможность вставить паузу в мой метод, который выполняет действия каждого процессора. Но похоже, что с классом Timer вам необходимо выполнить ваши действия после паузы в прослушивателе действий таймера. Я в основном смущен тем, почему Таймеру нужен агент действий. Мне не нужен таймер, чтобы повторить его после его завершения.

Если бы мне было лучше разместить мой собственный код, сообщите мне. Но я не уверен, какие части будут полезны, так как я не хочу иметь тонны кода в этом потоке.

+0

Попробуйте добавить 'Thread.sleep (5000);'? –

+2

Что случилось с Swing 'Timer'?Если вы установили его не повторяющимся, с задержкой '5000', он может вызвать другой метод для выполнения каких-либо действий, которые вы хотите ПОСЛЕ указанного периода времени? – MadProgrammer

+0

@DarshanMehta Вы можете не знать об опасности и проблемах, связанных с использованием 'Thread.sleep' в Swing или JavaFX или просто о каких-либо интерфейсах пользовательского интерфейса, это не очень хорошая идея и для всех дополнительных проблем, которые могут возникнуть, вы не должны рекомендовать он, для этого случая использования – MadProgrammer

ответ

0

Вы должны запустить новый поток, который выполняет следующие действия:

  • сна в течение 5 секунд
  • Устанавливает ваше сообщение требуется
  • вызовы repaint() к сигнализируют о том, что сообщение должно быть перерисованы.
+1

Swing не является потокобезопасным, OP использует соответствующий таймер Swing 'Timer ', но просто не используя его правильно – MadProgrammer

0

При выполнении ситуации вы можете инициировать определенные функции: TimeUnit.SECONDS.sleep (1); . Я вижу в вашем коде, что вы пытаетесь вручную подсчитать время. Вы можете позволить компилятору или процессору сделать это за вас.

+0

Swing не является потокобезопасным, OP использует соответствующий Swing' Timer', но просто не использует его правильно – MadProgrammer

1

Понятно, что вы хотите активировать какое-то событие через 5 секунд, Swing Timer идеально подходит для этого И это поточно-безопасное, что делает его безопасным для обновления интерфейса пользователя, без необходимости более быстрого обруча.

Timer устанавливает собственный поток для ожидания, поэтому он не будет блокировать EDT, это означает, что вам нужно подождать, пока таймер не будет запущен, прежде чем вы что-то сможете, он не будет блокировать и ждать, когда вы позвоните, это причина, по которой у него есть ActionListener, поэтому вы знаете, когда он срабатывает.

Вы можете использовать свой существующий Timer, предполагая, что он ничего не делает другое, но ради аргумента, я создаю новый ...

private Timer waitItOut; 
private JButton button; 

Затем в конструкторе, вы настроить таймер разница здесь я сделал это, не повторяющаяся, то есть он не будет вызывать каждые 5 секунд, но вы можете повторно запустить его, когда вы хотите ...

waitItOut = new Timer(5000, new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent evt) { 
     doImportantWork(); 
    } 
}); 
waitItOut.setRepeats(false); 

// I made this an instance field for demonstration purposes 
button = new JButton("Click Me!"); 
button.addActionListener(this); 
button.setBounds(200, 400, 100, 40); 
add(button); 

Тогда в вашем методе actionPerformed, вы просто запускаете таймер ...

public void actionPerformed(ActionEvent e) { 
    button.setEnabled(false); 
    waitItOut.restart(); 
} 

И ждать, пока она называет свой "важный метод, который должен быть запущен после указанной задержки" ...

public void doImportantWork() { 
    button.setEnabled(false); 
    // Writing the current time and increasing the cont times 
    area.append(Calendar.getInstance().getTime().toString()+"\n"); 
    count++; 
    if (count == 10) { 
     count = 0; 
     running = false; 
    } 
} 
+0

Хорошо, это сработало с тестовой программой выше! Мне понадобится некоторое время, чтобы работать в моей карточной игре, но я расскажу о результатах, когда узнаю. – Austen

+0

@Austen. Часть решения состоит в том, что вам нужно будет изменить то, как вы думаете, с графическими интерфейсами, вы не можете думать линейно, они управляются событиями, что-то происходит, и вы отвечаете на него – MadProgrammer

+0

Итак , он работал в моей игре. Но, оказывается, мне нужно разрешить повторять таймер. То, как я настроил процессор, - это то, что цикл цикла циклически проходит через оставшихся игроков, пока они не вернутся к пользователю. Я пытаюсь, чтобы таймер приостанавливал действия процессоров после того, как они нарисовали новую карту, и прежде чем они начнут играть. Но по какой-то причине он не перезапускает таймер в следующем экземпляре цикла for. Таким образом, он пройдет через игрока 2, а затем остановится на игроке 3. Я пытаюсь отладить с затмением, и это может быть просто мой код, но я не уверен – Austen