gpt4 book ai didi

java - Swing 计时器 GUI 噩梦

转载 作者:行者123 更新时间:2023-12-01 18:43:10 27 4
gpt4 key购买 nike

好的,所以我尝试在该程序的对话中实现一个计时器,该计时器在进入下一个对话之前暂停一秒钟。当我尝试这个时,java会抛出很多错误,例如:非法的表达式开始,;预期,.class 预期,并在解析时到达文件末尾。如何实现计时器,以便当我尝试在屏幕上显示对话一段特定的时间时窗口不会卡住?不要告诉我 Thread.sleep() 因为我尝试过,它所做的只是卡住应用程序。

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

最佳答案

这似乎是你问题的开始......

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() {

没有这样的类称为TimerScheduleFixedRateDelayTimer没有默认构造函数,您似乎没有声明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 方法中,我不知道 windowmain 仍然需要解决...

这引导我们......

}

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 中定义的...不是很有帮助;)

根据您的代码,我认为您应该避免 java.util.Timer 并使用 javax.swing.Timer ,这将阻止您更新来自事件调度线程内容外部的 UI,这只是您可能希望避免的另一杯蠕虫......

关于java - Swing 计时器 GUI 噩梦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19038966/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com