【发布时间】:2014-11-02 16:12:41
【问题描述】:
我创建了一个掷骰子游戏,这是一个基于骰子的游戏。我已经创建了我的游戏逻辑,但正在尝试实现一个 GUI。我已经为两个骰子创建了我的骰子和骰子组件。如果我一次将我的骰子添加到框架中,它们都可以工作,但是一旦我尝试将两者同时添加到框架并运行我的掷骰子游戏,框架就是空的。
掷骰子游戏代码:
package crapsgame;
import java.awt.FlowLayout;
import javax.swing.*;
public class CrapsGameTester
{
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
JFrame frame = new JFrame("Craps-Game");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
final int FRAME_WIDTH = 400;
final int FRAME_HEIGHT = 600;
frame.setSize(FRAME_HEIGHT, FRAME_WIDTH);
CrapsGame game = new CrapsGame();
JPanel panel = new JPanel(new FlowLayout());
frame.add(panel);
Dice1Component dice1 = new Dice1Component(6);
Dice2Component dice2 = new Dice2Component(6);
panel.add(dice1);
panel.add(dice2);
String message = game.doFirstRoll();
System.out.println(message);
while(!game.isOver())
{
message = game.rollAgain();
System.out.println(message);
}
if(game.isWon())
System.out.println("You win, big man!");
else
System.out.println("Loser ...");
frame.setVisible(true);
}
}
骰子1代码:
package crapsgame;
import java.awt.*;
public class Dice1
{
int sides;
int xCoord = 150;
int yCoord = 130;
public Dice1(int s)
{
sides = s;
}
/**
*
* @param g2 Graphics2D object used by draw method
*/
public void draw(Graphics2D g2)
{
g2.setColor(Color.BLACK);
g2.fillRect(xCoord, yCoord, 100, 100);
g2.setColor(Color.WHITE);
switch (sides)
{
case 1:
g2.fillOval(xCoord + 40, yCoord + 40, 20, 20);
break;
case 2:
g2.fillOval(xCoord + 15, yCoord + 15, 20, 20);
g2.fillOval(xCoord + 65, yCoord + 65, 20, 20);
break;
case 3:
g2.fillOval(xCoord + 15, yCoord + 15, 20, 20);
g2.fillOval(xCoord + 40, yCoord + 40, 20, 20);
g2.fillOval(xCoord + 65, yCoord + 65, 20, 20);
break;
case 4:
g2.fillOval(xCoord + 15, yCoord + 15, 20, 20);
g2.fillOval(xCoord + 15, yCoord + 65, 20, 20);
g2.fillOval(xCoord + 65, yCoord + 15, 20, 20);
g2.fillOval(xCoord + 65, yCoord + 65, 20, 20);
break;
case 5:
g2.fillOval(xCoord + 15, yCoord + 15, 20, 20);
g2.fillOval(xCoord + 15, yCoord + 65, 20, 20);
g2.fillOval(xCoord + 65, yCoord + 15, 20, 20);
g2.fillOval(xCoord + 65, yCoord + 65, 20, 20);
g2.fillOval(xCoord + 40, yCoord + 40, 20, 20);
break;
case 6:
g2.fillOval(xCoord + 20, yCoord + 20, 20, 20);
g2.fillOval(xCoord + 20, yCoord + 45, 20, 20);
g2.fillOval(xCoord + 20, yCoord + 70, 20, 20);
g2.fillOval(xCoord + 60, yCoord + 20, 20, 20);
g2.fillOval(xCoord + 60, yCoord + 45, 20, 20);
g2.fillOval(xCoord + 60, yCoord + 70, 20, 20);
break;
}
}
}
Dice1组件代码:
package crapsgame;
import java.awt.*;
import javax.swing.*;
public class Dice1Component extends JComponent
{
private int sides;
public Dice1Component(int s)
{
sides = s;
}
public void setSide(int s)
{
sides = s;
}
@Override
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Dice1 dice1 = new Dice1(sides);
dice1.draw(g2);
}
}
我读到要向框架添加多个组件,您必须使用 JPanel,但这似乎对我也不起作用。
【问题讨论】:
-
我很好奇你为什么不把两个骰子都画到同一个组件上?此外,我不会在
paintComponent方法中创建 Dice。将其保留为班级成员。有两名班级成员,每个骰子一名。您可以为每个骰子设置二传手。如果您打算拥有很多 Dice,那么也许您可以创建一个Map的 Dice,并通过键访问每个 Dice。但一般来说,我只会使用 一个 绘图表面。 -
是的,就像@peeskillet:考虑让 Dice 成为一个知道如何绘制自己的逻辑类,而不是 GUI 类,而不是扩展 Swing 组件的类。考虑创建一个绘制所有骰子的绘图 JPanel,并避免在paintComponent 内部创建对象和变量。您无法控制何时或是否调用该方法,因此不应将任何程序逻辑放入其中,只需编写代码即可。