如何解决Java if/else语句中System.out.println()重复打印问题
解决骰子匹配练习中重复打印的问题
问题根源
你的代码把生成随机点数和打印结果的逻辑放在了paintComponent方法里,这是核心问题。Swing会自动多次调用paintComponent——比如窗口大小调整、窗口被遮挡后恢复、组件刷新时,都会触发这个方法。每次调用都会重新生成一对骰子点数并打印结果,所以才会出现重复输出的情况。
修正方案
你需要将业务逻辑(掷骰子、判断结果)和界面绘制逻辑分离:
- 把掷骰子的逻辑抽成单独方法,只在需要的时候调用(比如初始化、点击按钮时)。
paintComponent仅负责根据当前的骰子点数绘制界面,不处理业务逻辑。- 结果打印和掷骰子动作绑定,而不是和绘制动作绑定。
修改后的代码示例
import java.awt.*; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class DiceRoll extends JPanel { private int firstDice; private int secondDice; public DiceRoll() { // 初始化时执行一次掷骰子 rollDice(); // 添加按钮触发重新掷骰子 JButton rollBtn = new JButton("Roll Dice"); rollBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { rollDice(); repaint(); // 掷完骰子后通知界面刷新 } }); add(rollBtn); } // 单独处理掷骰子和结果判断的方法 private void rollDice() { firstDice = (int) (Math.random() * 6) + 1; secondDice = (int) (Math.random() * 6) + 1; // 在这里打印结果,每次调用仅输出一次 if (firstDice != secondDice) { System.out.println("Sorry, try again"); } else { System.out.println("Win!"); } } @Override public void paintComponent(Graphics g) { super.paintComponent(g); // 仅负责绘制界面,不再生成新的随机数 g.setColor(Color.blue); g.fillRect(20, 20, 60, 60); g.setColor(Color.magenta); g.fillRect(120, 20, 60, 60); g.setColor(Color.white); g.drawString(" " + firstDice, 43, 54); g.drawString(" " + secondDice, 143, 54); g.setColor(Color.black); g.drawString("First dice = " + firstDice, 20, 100); g.drawString("Second Dice = " + secondDice, 120, 100); } public static void main(String[] args) { JFrame frame = new JFrame("Dice Match"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new DiceRoll()); frame.setSize(250, 180); frame.setVisible(true); } }
关键改动说明
- 新增
rollDice()方法:集中处理骰子点数生成和结果打印,每次调用只会执行一次掷骰子和一次结果输出。 - 添加触发按钮:通过按钮点击来触发掷骰子动作,替代了原来每次绘制都自动掷骰子的逻辑。
- 简化
paintComponent:现在它只负责根据已有的firstDice和secondDice值绘制界面,不会再触发新的业务逻辑。
内容的提问来源于stack exchange,提问作者Dylanduran
相关产品推荐
相关产品推荐

