You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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);
    }
}

关键改动说明

  1. 新增rollDice()方法:集中处理骰子点数生成和结果打印,每次调用只会执行一次掷骰子和一次结果输出。
  2. 添加触发按钮:通过按钮点击来触发掷骰子动作,替代了原来每次绘制都自动掷骰子的逻辑。
  3. 简化paintComponent:现在它只负责根据已有的firstDice和secondDice值绘制界面,不会再触发新的业务逻辑。

内容的提问来源于stack exchange,提问作者Dylanduran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 09:40:33