【问题标题】:JAVA. A gui that prints a dice roll [closed]爪哇。打印骰子的 gui [关闭]
【发布时间】:2012-03-05 02:12:24
【问题描述】:

我在 gui 中掷骰子。我得到了我想要返回的数字(随机整数 1-6),但我想要显示的图像没有显示出来。它第一次显示正确的图像,但从不改变它。这是代码:

public void layoutComponents()
{
     Container container = frame.getContentPane();
     container.setLayout(new GridLayout(1, 1));
     diceRoll.setEditable(true);
     container.add(button);
     container.add(addPanel());
     //container.add(diceRoll);
     frame.setSize(200, 200);
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

class DiceActions implements ActionListener
{
     @Override
     public void actionPerformed(ActionEvent e)
     {
         layoutComponents();
         //diceRoll.append(Double.toString((int)numberRolled));
     }

}

public ImageIcon rollDice()
{
     double numberRolled = (int)(Math.random() * 10 + 1);
     ImageIcon image = dice1;
     if (numberRolled > 6)
     {
         numberRolled -= 4;
     }
     if(numberRolled == 1)
     {
         image = dice1;
         System.out.println("1");
         System.out.println(numberRolled);
         return image = dice1;
     }
     else if(numberRolled == 2)
     {
         image = dice2;
         System.out.println("2");
         return image = dice2;
     }
     else if(numberRolled == 3)
     {
         image = dice3;
         System.out.println("3");
         return image = dice3;
     }
     else if(numberRolled == 4)
     {
         image = dice4;
         System.out.println("4");
         return image = dice4;
     }
     else if(numberRolled == 5)
     {
         image = dice5;
         System.out.println("5");
         return image = dice5;
     }
     else if(numberRolled == 6)
     {
         image = dice6;
         System.out.println("6");
         return image = dice6;
     }
     else
         System.out.println("never reached");
     System.out.println(numberRolled);
     return image;
}

public JPanel addPanel()
{
     JPanel panel = new JPanel();
     panel.add(new JLabel(rollDice()));
     return panel;
}

public void addListeners()
{
     DiceActions action = new DiceActions();
     button.addActionListener(action);
}

【问题讨论】:

  • 一直显示 dice1 图片
  • 1) 为了尽快获得更好的帮助,请发帖 SSCCE。 2) 请对代码块使用一致且符合逻辑的缩进。
  • 所以,您希望我们告诉您 GUI 代码哪里出错了,但您没有给我们所有代码。自己研究它的一种方法是将其缩减为必需品。如果你仍然没有发现你的问题,那么它可能会小到足以发布整个问题。

标签: java swing user-interface random


【解决方案1】:

double numberRolled = (int)(Math.random() * 10 + 1);

我不确定(我的意思是,JVM 如何处理它),但它可能会导致一些舍入问题,从而导致 == 运算符给出错误。您已将其类型转换为 int,那么为什么不将其也存储为 int 呢?

return image = dice1;return image = dice2; 等等……

你为什么不简单地'return diceX;'?不需要有本地 ImageIcon 变量。它可能在 Java 中工作,因为它仍然带有 = 运算符的 C 语义,但如果您不打算这样做,可能会产生意想不到的结果。

【讨论】:

    【解决方案2】:
    double numberRolled = (int)(Math.random() * 10 + 1);
    ImageIcon image = dice1;
    if (numberRolled > 6)
    {
        numberRolled -= 4;
    }
    

    此代码无法生成uniformly random numbers。 任何使用您的代码玩游戏的人都会很快了解到结果 不是随机的。

    我通过Lindent 运行此代码,以使其易于阅读并接受 去掉中间的一些代码;只关注一般流程 事情的来龙去脉:

    ImageIcon image = dice1;
    
    if (numberRolled > 6) {
        numberRolled -= 4;
    }
    if (numberRolled == 1) {
        image = dice1;
        System.out.println("1");
        System.out.println(numberRolled);
        return image = dice1;
    }
    /* ... */
    else if (numberRolled == 6) {
        image = dice6;
        System.out.println("6");
        return image = dice6;
    } else
        System.out.println("never reached");
    
    System.out.println(numberRolled);
    return image;
    

    请注意,您已将 image 初始化为 dice1。这大概是一个 坏主意,因为它使查找错误变得更加困难。反而, 将其初始化为null,这样你的其他代码就会死得很惨 如果其余代码没有设置 正确的价值。

    但是把这一切都扔掉吧;你想要做的是使用 array 存储die图像和值之间的关系。这将是 1/6 的代码,更少的错误,更容易扩展到十、十二或 二十面模。

    【讨论】:

      猜你喜欢
      • 2012-08-15
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多