2013-09-26 4 views
0

Итак, я попытался реализовать таймер в диалоге этой программы, который останавливается на секунду, прежде чем перейти к следующему бит диалога. Когда я пробую это, java выплевывает ошибки o 'много, такие как: незаконный запуск выражения; ожидаемый, ожидаемый класс и достиг конца файла во время разбора. Как я могу реализовать таймер, чтобы окно не зависало, когда я пытаюсь установить диалог на экране в течение определенного времени? И не говорите мне Thread.sleep() потому что я пробовал это, и все, что он делает, это заморозить приложение.Swing Timer GUI Nightmare

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.util.*; 

public class RpsNuke extends JFrame 
    implements ActionListener 
{ 
    private final char moves[] = {'R', 'P', 'S', 'N'}; 
    private JRadioButton rock, paper, scissors, nuke; 
    private JTextField display; 

    public RpsNuke() 
    { 
    super("Rock, Paper, Scissors, Nuke"); 

    rock = new JRadioButton(" Rock ", true); 
    paper = new JRadioButton(" Paper "); 
    scissors = new JRadioButton(" Scissors "); 
    nuke = new JRadioButton(" Nuke "); 
    ButtonGroup rpsButtons = new ButtonGroup(); 
    rpsButtons.add(rock); 
    rpsButtons.add(paper); 
    rpsButtons.add(scissors); 
    rpsButtons.add(nuke); 

    JButton go = new JButton("   Go   "); 
    go.addActionListener(this); 

    display = new JTextField(25); 
    display.setEditable(false); 
    display.setBackground(Color.yellow); 

    Container c = getContentPane(); 
    c.setLayout(new FlowLayout()); 
    c.add(rock); 
    c.add(paper); 
    c.add(scissors); 
    c.add(nuke); 
    c.add(go); 
    c.add(display); 
    if (nuke.isSelected()){ 
    display.setText("Don't do it man");} 
    else { 
    display.setText("");} 
    } 

    /** 
    * returns -1 if the player wins, 
    * 0 if it's a tie, and 1 if the computer wins 
    */ 
    private int nextPlay(char computerMove, char playerMove) 
    { 
    if ((computerMove == 'R'&&playerMove == 'S')||(computerMove == 'S'&&playerMove=='P')||(computerMove=='P'&&playerMove=='R')){ 
    return 1;} 
    else if ((computerMove == 'R'&&playerMove == 'R')||(computerMove=='S'&&playerMove=='S')||(computerMove=='P'&&playerMove=='P')){ 
    return 0;} 
    else if (playerMove == 'N'){ 
    return 2;} 
    return -1; 

    } 

    public void actionPerformed(ActionEvent evt) 
    { 
    char playerMove, computerMove; 
    playerMove = 0; 
    if (rock.isSelected()){ 
     playerMove = 'R';} 
    else if (paper.isSelected()){ 
     playerMove = 'P';} 
    else if (scissors.isSelected()){ 
     playerMove = 'S';} 
    else if (nuke.isSelected()){ 
     playerMove = 'N';} 
    int k = (int)(Math.random() * 3); 
    computerMove = moves[k]; 
    int result = nextPlay(computerMove, playerMove); 
    String msg = ""; 
    if (result != 2) 
    {msg = " You said " + makeWord(playerMove) + ", I said " + 
       makeWord(computerMove); 
    if (result < 0){ 

     msg += " -- you win.";} 
    else if (result == 0){ 

     msg += " -- tie.";} 
    else if (result > 0){ 
     msg += " -- I win.";} 
    } 
    if (result == 2) 
    { 
    TimerTask tasknew = new TimerScheduleFixedRateDelay(); 
    Timer timer = new Timer(); 

     // scheduling the task at fixed rate delay 
    timer.scheduleAtFixedRate(tasknew,1000,1000); 
    @Override 
    } 
    // this method performs the task 

    public void run() { 
     msg = "It's too late, we're all dead!";  
     msg = "..."; 

     msg = "Look at what you did, there's nothing left."; 

     msg = "Looks like we have to start over again..."; 
     window.setVisible(false); 
     main(null);      
    }   
    display.setText(msg); 
    } 

    private String makeWord(char move) 
    { 
    String word = ""; 

    switch (move) 
    { 
     case 'R': word = "rock"; break; 
     case 'P': word = "paper"; break; 
     case 'S': word = "scissors"; break; 
     case 'N': word = "nuke"; break; 
    } 
    return word; 
    } 

    public static void main(String[] args) //Here 
    { 
    RpsNuke window = new RpsNuke(); 
    window.setBounds(300, 300, 400, 140); 
    window.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    window.setVisible(true); 
    } 
} //And here 
+0

и ошибки в целом ........ – KevinDTimm

+0

@KevinDTimm Я отредактировал его, чтобы были показаны ошибки – Showman

+0

Это, вероятно, не более, чем неосторожная ошибка. Вы подсчитали свои фигурные скобки? Должны ли все открывающиеся брекеты ожидать совпадающие скобки? Я думаю, что вы, вероятно, оставите один или два. –

ответ

4

Это, кажется, начало ваших проблем ...

if (result == 2) { 
    TimerTask tasknew = new TimerScheduleFixedRateDelay(); 
    Timer timer = new Timer(); 
    // scheduling the task at fixed rate delay 
    timer.scheduleAtFixedRate(tasknew, 1000, 1000); 
    @Override 
} 

public void run() { 

Там нет такого класса называется TimerScheduleFixedRateDelay, Timer не имеет конструктор по умолчанию, вы, кажется, не объявили tasknew, и я понятия не имею, почему @Override появляется здесь ...

Давайте начнем, комментируя те из на данный момент

if (result == 2) { 
    //TimerTask tasknew = new TimerScheduleFixedRateDelay(); 
    //Timer timer = new Timer(); 
    // scheduling the task at fixed rate delay 
    //timer.scheduleAtFixedRate(tasknew, 1000, 1000); 
    //@Override 
} 

public void run() { 

Следующая проблема вам не хватает закрывающую скобку ...

if (result == 2) { 
    ... 
} 

// Something is amiss here... 

public void run() { 

Он должен выглядеть как ...

if (result == 2) { 
     ... 
    } 

} 

public void run() { 

Далее ...

public void run() { 
    msg = "It's too late, we're all dead!"; 
    msg = "..."; 

    msg = "Look at what you did, there's nothing left."; 

    msg = "Looks like we have to start over again..."; 
    window.setVisible(false); 
    main(null); 
} 

display.setText (msg); 

msg не определено, window не определено и main не определено и display.setText в настоящее время выноски вне контекста метода, который является незаконным ...

public void run() { 
    String msg = "It's too late, we're all dead!"; 
    msg = "..."; 

    msg = "Look at what you did, there's nothing left."; 

    msg = "Looks like we have to start over again..."; 
    display.setText (msg); 
    //window.setVisible(false); 
    //main(null); 
} 

Это достаточно легко исправить msg, не уверен, о display.setText, но так как он принимает msg, я предполагаю, что он принадлежит в run метод, и я понятия не имею, о window и main еще должен быть решен ...

Что приводит нас на ...

} 

private String makeWord(char move) 
    { 
    String word = ""; 

    switch (move) 
    { 
     case 'R': word = "rock"; break; 
     case 'P': word = "paper"; break; 
     case 'S': word = "scissors"; break; 
     case 'N': word = "nuke"; break; 
    } 
    return word; 
    } 

    public static void main(String[] args) //Here 
    { 
    RpsNuke window = new RpsNuke(); 
    window.setBounds(300, 300, 400, 140); 
    window.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    window.setVisible(true); 
    } 
} //And here 

О, я думаю, я нашел, где наша пропавшая скобка прошла .... Это означает, что все ниже } первая фигурная скобка в приведенном выше коде фактически определяется за пределами class, что в контексте этого вопроса незаконным ...

Итак, давайте Закомментируйте ...

//} 

private String makeWord(char move) 
    { 
    String word = ""; 

    switch (move) 
    { 
     case 'R': word = "rock"; break; 
     case 'P': word = "paper"; break; 
     case 'S': word = "scissors"; break; 
     case 'N': word = "nuke"; break; 
    } 
    return word; 
    } 

    public static void main(String[] args) //Here 
    { 
    RpsNuke window = new RpsNuke(); 
    window.setBounds(300, 300, 400, 140); 
    window.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    window.setVisible(true); 
    } 
} //And here 

Там, вещи выглядят «немного» лучше ... Я тоже думаю, что я нашел window, но это определяется в main. ..не очень полезно;)

Основываясь на вашем коде, я думаю, вы должны void java.util.Timer и вместо этого использовать javax.swing.Timer, это не позволит вам обновлять пользовательский интерфейс вне содержимого Диспетчерского потока событий, который представляет собой еще одну чашку червей, которые вы, вероятно, захотите избежать ...

+3

+1 Вау, я начал писать ответ, но не планировал ничего такого тщательного. Хорошо, что я был достаточно медленным. – kiheru

+0

@kiheru Не уверен, что я все поймал, поэтому, если у вас есть что добавить, не стесняйтесь вместе ставить другой ответ, это был настоящий беспорядок, поэтому я, вероятно, что-то пропустил: P – MadProgrammer

+0

Не очень много добавить , «@ Override» и «public void run()» были, вероятно, частями «TimerTask», которые каким-то образом немного рассеялись (и вызваны конструктором, который не существует). Но, как сказано, OP не должен использовать 'java.util.Timer' в любом случае. – kiheru