我无法更新或“重新绘制”文本区域。我希望在for循环的每个循环中更新文本区域。我尝试了一些操作,例如调用paint();
和repaint();
函数以及使用text.append();
和text.setText();
,但这似乎不起作用。我也有for循环设置,所以它应该每次迭代附加文本。这是我的代码,非常感谢任何帮助。
尼克。
package ********_****_rps;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class AutomatedRoshamboRPS extends javax.swing.JFrame {
int num = 0;
int compnum = 0;
int earnings = 0;
int wins = 0;
int losses = 0;
int ties = 0;
int roshamboCount = 0;
int gamesPlayed = 0;
int i;
int games = 0;
String a = "", b;
void updateStats() {
String statsToString = stats.getText();
if (num - compnum == 1 || num - compnum == -2) //won
{
wins++;
gamesPlayed++;
} else if (num - compnum == 0) //tied
{
ties++;
gamesPlayed++;
} else { //lost
losses++;
gamesPlayed++;
}
earnings = +(wins * 2) - (losses * 2) + (roshamboCount * 10) - (roshamboCount * 2);
stats.setText("STATISTICS:"
+ "\nGames Played:" + gamesPlayed
+ "\nEarnings:" + earnings
+ "\nWins:" + wins
+ "\nTies:" + ties
+ "\nLosses:" + losses
+ "\nRoshambo:" + roshamboCount);
}
void game() {
String userChoice;
compnum = (int) Math.floor((Math.random() * 3) + 1);
switch (num) {
case 1:
userChoice = "ROCK";
break;
case 2:
userChoice = "PAPER";
break;
case 3:
userChoice = "SCISSORS";
break;
default:
userChoice = "ROCK";
}
if (num - compnum == 1 || num - compnum == -2) {
text.append("\nYou won!");
a += userChoice;
} else if (num - compnum == 0) {
text.append("\nYou tied!");
} else {
text.append("\nYou lost!");
a = "";
}
if (a.equals("ROCKROCKROCK") || a.equals("PAPERPAPERPAPER") || a.equals("SCISSORSSCISSORSSCISSORS")) {
roshamboCount++;
a = "";
if (text.getLineCount() > 10000) {
text.setText("");
}
}
}
public AutomatedRoshamboRPS() {
initComponents();
text.setText("ROCK PAPER SICSSORS"
+ " \nSelect your throw by clicking on one \nof the options to the left.\n"
+ "---------------------------------------------------");
rock.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
b = numGames.getText();
games = Integer.parseInt(b);
for (int l = 0; l < games; l++) {
num = 1;
game();
updateStats();
}
}
});
paper.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
b = numGames.getText();
games = Integer.parseInt(b);
for (int l = 0; l < games; l++) {
num = 2;
game();
updateStats();
}
}
});
scissors.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
b = numGames.getText();
games = Integer.parseInt(b);
for (int l = 0; l < games; l++) {
num = 3;
game();
updateStats();
}
}
});
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
buttonGroup1 = new javax.swing.ButtonGroup();
buttonGroup2 = new javax.swing.ButtonGroup();
jLabel1 = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
text = new javax.swing.JTextArea();
jScrollPane2 = new javax.swing.JScrollPane();
stats = new javax.swing.JTextArea();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jLabel4 = new javax.swing.JLabel();
jLabel5 = new javax.swing.JLabel();
jLabel6 = new javax.swing.JLabel();
numGames = new javax.swing.JTextField();
rock = new javax.swing.JToggleButton();
paper = new javax.swing.JToggleButton();
scissors = new javax.swing.JToggleButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setResizable(false);
jLabel1.setFont(new java.awt.Font("Arial", 0, 24)); // NOI18N
jLabel1.setText("Automated Roshambo");
text.setColumns(20);
text.setEditable(false);
text.setFont(new java.awt.Font("Arial", 0, 13)); // NOI18N
text.setLineWrap(true);
text.setRows(5);
jScrollPane1.setViewportView(text);
stats.setColumns(20);
stats.setEditable(false);
stats.setRows(5);
jScrollPane2.setViewportView(stats);
jLabel5.setText("Number of games");
jLabel6.setText("to simulate:");
rock.setIcon(new javax.swing.ImageIcon(getClass().getResource("/haughton_nick_rps/Rock.png"))); // NOI18N
rock.setContentAreaFilled(false);
paper.setIcon(new javax.swing.ImageIcon(getClass().getResource("/haughton_nick_rps/Paper.png"))); // NOI18N
paper.setContentAreaFilled(false);
scissors.setIcon(new javax.swing.ImageIcon(getClass().getResource("/haughton_nick_rps/Scissors.png"))); // NOI18N
scissors.setContentAreaFilled(false);
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
.addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(jLabel1)
.add(80, 80, 80))
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(jScrollPane2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 375, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(org.jdesktop.layout.GroupLayout.LEADING, layout.createSequentialGroup()
.add(36, 36, 36)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(6, 6, 6)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
.add(rock, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(scissors, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(paper))
.add(35, 35, 35)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(jLabel3)
.add(jLabel2)
.add(jLabel4)))
.add(jLabel5)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false)
.add(org.jdesktop.layout.GroupLayout.LEADING, numGames)
.add(org.jdesktop.layout.GroupLayout.LEADING, jLabel6, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
.add(18, 18, 18)
.add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 244, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(32, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(18, 18, 18)
.add(jLabel1)
.add(18, 18, 18)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(jScrollPane1)
.add(layout.createSequentialGroup()
.add(jLabel5)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(jLabel6)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(numGames, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(0, 0, Short.MAX_VALUE)
.add(jLabel2)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(jLabel3)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(jLabel4)
.add(208, 208, 208))
.add(layout.createSequentialGroup()
.add(rock, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 57, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
.add(paper, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 60, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
.add(scissors, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 61, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(0, 0, Short.MAX_VALUE)))))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
.add(jScrollPane2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 125, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
pack();
}// </editor-fold>
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new AutomatedRoshamboRPS().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.ButtonGroup buttonGroup1;
private javax.swing.ButtonGroup buttonGroup2;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTextField numGames;
private javax.swing.JToggleButton paper;
private javax.swing.JToggleButton rock;
private javax.swing.JToggleButton scissors;
private javax.swing.JTextArea stats;
private javax.swing.JTextArea text;
// End of variables declaration
}
答案 0 :(得分:2)
“更新for循环的每个循环” - 出现问题。
据我所知,您的程序只是违反了事件调度线程,在EDT的内容中进行所有更新。这阻止了UI开始更新。
您可能希望阅读Concurrency in Swing以获取更多信息。
<强>已更新强>
所以,我查看了你的代码并对其进行了修改(尽我所能)以使用SwingWoker
代替。我没有问题就打了2000场比赛。
public class TestRockPaperScissors {
public static void main(String[] args) {
new TestRockPaperScissors();
}
public TestRockPaperScissors() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
AutomatedRoshamboRPS frame = new AutomatedRoshamboRPS();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class AutomatedRoshamboRPS extends javax.swing.JFrame {
int num = 0;
int compnum = 0;
int earnings = 0;
int wins = 0;
int losses = 0;
int ties = 0;
int roshamboCount = 0;
int gamesPlayed = 0;
int i;
int games = 0;
String a = "", b;
public void updateStats(int state, int roshamboCount, String result) {
text.append(result + "\n");
String statsToString = stats.getText();
if (state == 0) //won
{
wins++;
gamesPlayed++;
} else if (state == 1) //tied
{
ties++;
gamesPlayed++;
} else { //lost
losses++;
gamesPlayed++;
}
earnings = +(wins * 2) - (losses * 2) + (roshamboCount * 10) - (roshamboCount * 2);
stats.setText("STATISTICS:"
+ "\nGames Played:" + gamesPlayed
+ "\nEarnings:" + earnings
+ "\nWins:" + wins
+ "\nTies:" + ties
+ "\nLosses:" + losses
+ "\nRoshambo:" + roshamboCount);
}
public void setGameState(boolean enabled) {
numGames.setEnabled(enabled);
rock.setEnabled(enabled);
paper.setEnabled(enabled);
scissors.setEnabled(enabled);
}
public AutomatedRoshamboRPS() {
initComponents();
text.setText("ROCK PAPER SICSSORS"
+ " \nSelect your throw by clicking on one \nof the options to the left.\n"
+ "---------------------------------------------------\n");
rock.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
b = numGames.getText();
games = Integer.parseInt(b);
setGameState(false);
new GameWorker(AutomatedRoshamboRPS.this, games, 1).execute();
// for (int l = 0; l < games; l++) {
// num = 1;
// game();
// updateStats();
// }
}
});
paper.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
b = numGames.getText();
games = Integer.parseInt(b);
setGameState(false);
new GameWorker(AutomatedRoshamboRPS.this, games, 2).execute();
// for (int l = 0; l < games; l++) {
// num = 2;
// game();
// updateStats();
// }
}
});
scissors.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
b = numGames.getText();
games = Integer.parseInt(b);
setGameState(false);
new GameWorker(AutomatedRoshamboRPS.this, games, 3).execute();
// for (int l = 0; l < games; l++) {
// num = 3;
// game();
// updateStats();
// }
}
});
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
buttonGroup1 = new javax.swing.ButtonGroup();
buttonGroup2 = new javax.swing.ButtonGroup();
jLabel1 = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
text = new javax.swing.JTextArea();
jScrollPane2 = new javax.swing.JScrollPane();
stats = new javax.swing.JTextArea();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jLabel4 = new javax.swing.JLabel();
jLabel5 = new javax.swing.JLabel();
jLabel6 = new javax.swing.JLabel();
numGames = new javax.swing.JTextField();
rock = new javax.swing.JToggleButton();
paper = new javax.swing.JToggleButton();
scissors = new javax.swing.JToggleButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setResizable(false);
jLabel1.setFont(new java.awt.Font("Arial", 0, 24)); // NOI18N
jLabel1.setText("Automated Roshambo");
text.setColumns(20);
text.setEditable(false);
text.setFont(new java.awt.Font("Arial", 0, 13)); // NOI18N
text.setLineWrap(true);
text.setRows(5);
jScrollPane1.setViewportView(text);
stats.setColumns(20);
stats.setEditable(false);
stats.setRows(5);
jScrollPane2.setViewportView(stats);
jLabel5.setText("Number of games");
jLabel6.setText("to simulate:");
// rock.setIcon(new javax.swing.ImageIcon(getClass().getResource("/haughton_nick_rps/Rock.png"))); // NOI18N
rock.setText("Rock");
rock.setContentAreaFilled(false);
// paper.setIcon(new javax.swing.ImageIcon(getClass().getResource("/haughton_nick_rps/Paper.png"))); // NOI18N
paper.setText("Paper");
paper.setContentAreaFilled(false);
// scissors.setIcon(new javax.swing.ImageIcon(getClass().getResource("/haughton_nick_rps/Scissors.png"))); // NOI18N
scissors.setText("Scissors");
scissors.setContentAreaFilled(false);
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
.addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(jLabel1)
.add(80, 80, 80))
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(jScrollPane2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 375, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(org.jdesktop.layout.GroupLayout.LEADING, layout.createSequentialGroup()
.add(36, 36, 36)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(6, 6, 6)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
.add(rock, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(scissors, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(paper))
.add(35, 35, 35)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(jLabel3)
.add(jLabel2)
.add(jLabel4)))
.add(jLabel5)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false)
.add(org.jdesktop.layout.GroupLayout.LEADING, numGames)
.add(org.jdesktop.layout.GroupLayout.LEADING, jLabel6, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
.add(18, 18, 18)
.add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 244, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(32, Short.MAX_VALUE)));
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(18, 18, 18)
.add(jLabel1)
.add(18, 18, 18)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(jScrollPane1)
.add(layout.createSequentialGroup()
.add(jLabel5)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(jLabel6)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(numGames, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(0, 0, Short.MAX_VALUE)
.add(jLabel2)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(jLabel3)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(jLabel4)
.add(208, 208, 208))
.add(layout.createSequentialGroup()
.add(rock, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 57, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
.add(paper, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 60, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
.add(scissors, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 61, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(0, 0, Short.MAX_VALUE)))))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
.add(jScrollPane2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 125, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap()));
pack();
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.ButtonGroup buttonGroup1;
private javax.swing.ButtonGroup buttonGroup2;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTextField numGames;
private javax.swing.JToggleButton paper;
private javax.swing.JToggleButton rock;
private javax.swing.JToggleButton scissors;
private javax.swing.JTextArea stats;
private javax.swing.JTextArea text;
// End of variables declaration
}
public class GameWorker extends SwingWorker<Object, GameResults> {
private int games;
private int userChoice;
private int roshamboCount;
private AutomatedRoshamboRPS parent;
public GameWorker(AutomatedRoshamboRPS parent, int games, int userChoice) {
this.games = games;
this.userChoice = userChoice;
this.parent = parent;
}
protected String toString(int choice) {
String value = "ROCK";
switch (choice) {
case 1:
value = "ROCK";
break;
case 2:
value = "PAPER";
break;
case 3:
value = "SCISSORS";
break;
}
return value;
}
@Override
protected void done() {
parent.setGameState(true);
}
@Override
protected void process(List<GameResults> chunks) {
for (GameResults results : chunks) {
parent.updateStats(results.state, results.getRoshamboCount(), results.getText());
}
}
@Override
protected Object doInBackground() throws Exception {
for (int index = 0; index < games; index++) {
String text = null;
int compnum = (int) Math.floor((Math.random() * 3) + 1);
int state = 2;
if (userChoice - compnum == 1 || userChoice - compnum == -2) {
text = "You won! " + toString(userChoice) + " beats " + toString(compnum);
state = 0;
roshamboCount++;
} else if (userChoice - compnum == 0) {
text = "You tied! " + toString(userChoice) + " ties with " + toString(compnum);
state = 1;
} else {
text = "You lost! " + toString(userChoice) + " losses to " + toString(compnum);
state = 2;
}
publish(new GameResults(state, roshamboCount, text));
}
return null;
}
}
public class GameResults {
private String text;
private int state;
private int roshamboCount;
public GameResults(int state, int roshamboCount, String text) {
this.text = text;
this.state = state;
this.roshamboCount = roshamboCount;
}
public int getRoshamboCount() {
return roshamboCount;
}
public int getState() {
return state;
}
public String getText() {
return text;
}
}
}