2014-10-27 47 views
0

我正在创建一个骰子程序,并完成了。我唯一要做的就是能够点击复选框到相应的骰子上,这样骰子就不会被卷起来,所以我可以将那些未经检查的骰子卷起来。我会如何去做这件事?这里是我的代码:如何“冻结”滚动的某些骰子?

主模具类:

public class Die { 
 

 
    public static void main(String[] args) {} 
 
    protected int face = 1; 
 

 
    void roll() { 
 
    face = (int)(Math.random() * 6 + 1); 
 
    } 
 

 
    public int getFace() { 
 
    return face; 
 
    } 
 

 
    public int setFace() { 
 
    return face; 
 
    }

Graphics类的,我画了一切,设置方法:

public class Graphics extends Die { 
 
    private int x, y; 
 
    boolean locked; { 
 

 
    locked = !locked; 
 
    } 
 

 

 
    public Graphics(int x, int y) { 
 
    this.x = x; 
 
    this.y = y; 
 
    } 
 

 
    public void draw(DrawingKit dk) { 
 
    Rectangle2D.Float die1 = new Rectangle2D.Float(x, y, 80, 80); 
 

 
    Ellipse2D.Float topleft = new Ellipse2D.Float(x + 3, y + 3, 18, 18); 
 
    Ellipse2D.Float topright = new Ellipse2D.Float(x + 55, y + 3, 18, 18); 
 
    Ellipse2D.Float middleleft = new Ellipse2D.Float(x + 3, y + 28, 18, 18); 
 
    Ellipse2D.Float middle = new Ellipse2D.Float(x + 28, y + 28, 18, 18); 
 
    Ellipse2D.Float middleright = new Ellipse2D.Float(x + 55, y + 28, 18, 18); 
 
    Ellipse2D.Float bottomleft = new Ellipse2D.Float(x + 3, y + 53, 18, 18); 
 
    Ellipse2D.Float bottomright = new Ellipse2D.Float(x + 55, y + 53, 18, 18); 
 
    dk.setPaint(Color.red); 
 
    dk.fill(die1); 
 
    if (face > 1) { 
 
     dk.draw(topleft); 
 
     dk.setPaint(Color.black); 
 
     dk.fill(topleft); 
 
    } 
 
    if (face > 3) { 
 
     dk.draw(topright); 
 
     dk.setPaint(Color.black); 
 
     dk.fill(topright); 
 
    } 
 
    if (face == 6) { 
 
     dk.draw(middleleft); 
 
     dk.setPaint(Color.black); 
 
     dk.fill(middleleft); 
 
    } 
 
    if (face % 2 == 1) { 
 
     dk.draw(middle); 
 
     dk.setPaint(Color.black); 
 
     dk.fill(middle); 
 
    } 
 
    if (face == 6) { 
 
     dk.draw(middleright); 
 
     dk.setPaint(Color.black); 
 
     dk.fill(middleright); 
 
    } 
 
    if (face > 3) { 
 
     dk.draw(bottomleft); 
 
     dk.setPaint(Color.black); 
 
     dk.fill(bottomleft); 
 
    } 
 
    if (face > 1) { 
 
     dk.draw(bottomright); 
 
     dk.setPaint(Color.black); 
 
     dk.fill(bottomright); 
 
    } 
 
    } 
 

 

 

 
    public static void main(String[] args) { 
 

 
    } 
 
}

辊类,其中的复选框,一切都跑了:

public class Roll { 
 

 

 
    public static void main(String[] args) { 
 

 
    JPanel topPanel = new JPanel(); 
 
    Icon Dice = new ImageIcon("button.png"); 
 
    final JButton button1 = new JButton(Dice); 
 
    JCheckBox Dice1 = new JCheckBox("Dice 1"); 
 
    Dice1.setBounds(100, 100, 100, 100); 
 
    JCheckBox Dice2 = new JCheckBox("Dice 2"); 
 
    JCheckBox Dice3 = new JCheckBox("Dice 3"); 
 
    JCheckBox Dice4 = new JCheckBox("Dice 4"); 
 
    JCheckBox Dice5 = new JCheckBox("Dice 5"); 
 

 
    int cnt1 = 1, cnt2 = 2, cnt3 = 3, cnt4 = 4, cnt5 = 5, cnt6 = 6; 
 

 
    final DrawingKit dk = new DrawingKit("Dice Game"); 
 
    dk.addPanel(topPanel); 
 
    dk.setBackground(Color.blue); 
 
    topPanel.setBackground(Color.red); 
 
    topPanel.setSize(500, 500); 
 

 
    final Graphics die1 = new Graphics(0, 45); 
 
    die1.roll(); 
 
    die1.draw(dk); 
 
    final Graphics die2 = new Graphics(100, 45); 
 
    die2.roll(); 
 
    die2.draw(dk); 
 
    final Graphics die3 = new Graphics(200, 45); 
 
    die3.roll(); 
 
    die3.draw(dk); 
 
    final Graphics die4 = new Graphics(300, 45); 
 
    die4.roll(); 
 
    die4.draw(dk); 
 
    final Graphics die5 = new Graphics(400, 45); 
 
    die5.roll(); 
 
    die5.draw(dk); 
 

 
    topPanel.add(button1); 
 
    button1.setToolTipText("Click this button to roll the dice."); 
 
    button1.setForeground(Color.red); 
 
    button1.setContentAreaFilled(false); 
 
    button1.setFocusPainted(false); 
 
    button1.setBorderPainted(false); 
 
    button1.setFont(new Font("Arial", Font.BOLD, 15)); 
 
    button1.setPreferredSize(new Dimension(40, 25)); 
 
    button1.addActionListener(new ActionListener() { 
 
     public void actionPerformed(ActionEvent event) { 
 
     die1.roll(); 
 
     die1.draw(dk); 
 
     die2.roll(); 
 
     die2.draw(dk); 
 
     die3.roll(); 
 
     die3.draw(dk); 
 
     die4.roll(); 
 
     die4.draw(dk); 
 
     die5.roll(); 
 
     die5.draw(dk); 
 

 

 
     } 
 

 

 
    }); 
 

 
    topPanel.add(Dice1); 
 

 
    Dice1.addActionListener(new ActionListener() { 
 
     public void actionPerformed(ActionEvent event) { 
 

 

 

 

 
     } 
 

 

 
    }); 
 
    topPanel.add(Dice2); 
 
    topPanel.add(Dice3); 
 
    topPanel.add(Dice4); 
 
    topPanel.add(Dice5); 
 

 
    } 
 
}

正如你所看到的,我有动作监听准备复选框1,我只是不知道里面放什么括号。我知道它与图形类中的锁定布尔方法有关,但我无法弄清楚该怎么做,我需要一些帮助。

由于

+0

只需将一个新的布尔型字段添加到'Die'类,您可以在列表程序中将其设置为'true'或'false'。如果它是真的,那么方法'roll()'不应该做任何事情。顺便说一句,从这个类中删除过时的'main'方法。 – Tom 2014-10-27 19:32:06

+0

老实说,我不知道你想说什么,通过添加一个布尔字段,然后将其设置为true或false。 – 2014-10-27 19:37:47

回答

0

一种可能的方式将被增加一个新的字段添加到该类Die将表示锁定:

public class Die { 
    // omitted existing fields 
    private boolean locked = false; 

    void roll() { 
     if (!locked) { 
      face = (int)(Math.random() * 6 + 1); 
     } 
    } 
    // omitted existing getter and setter 

    public void setLocked(final boolean locked) { 
     this.locked = locked; 
    } 

    public boolean isLocked() { // this getter is maybe not necessary 
     return locked; 
    } 
} 

这种锁定可防止从改变电流值的roll方法。

和你的听众的第一个复选框看起来是这样的:

Dice1.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent event) { 
     die1.setLocked(Dice1.isSelected()); 
    } 
}); 

此侦听器设置复选框的当前状态到locked领域。因此,如果选中复选框,则locked字段将设置为true,方法调用die1.roll()不会更改其当前值。

这样你就不必更改当前的roll()draw(dk)来电。

不要忘记申报您的Dice1组件作为最终,否则将无法使用它的监听器里:

final JCheckBox Dice1 = new JCheckBox("Dice 1"); 

它也可能需要声明die1final,如好。

+0

收到此:多个标志物在该行 \t - 不能是指在限定的非最终局部变量Dice1一个 \t封闭范围 \t - 的方法setLocked(布尔值)是未定义的类型图形 \t - 无法指在包含范围内定义的非最终局部变量Dice1 – 2014-10-27 19:55:49

+0

@JohnClark您需要将'Dice1'声明为'final'(在侦听器中使用它)。请参阅编辑。 – Tom 2014-10-27 19:59:35

+0

是的!非常感谢。我还有最后一个问题。为你。我无法从屏幕顶部移动复选框,并且使用设置的位置不会移动它们。我该怎么办? – 2014-10-27 21:31:33