2014-11-02 27 views
0

我创建了一个基于骰子的游戏骰子游戏。我创建了我的游戏逻辑,但我试图实现一个GUI。我为这两个骰子创建了我的Dice和Dice组件。如果我一次将我的骰子添加到框架中,它们都可以工作,但只要我尝试并同时添加到框架并运行我的掷骰子游戏,框架就是空的。在框架中添加多个摆动/ awt形状

CrapsGame代码:

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); 
} 

} 

Dice1代码:

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; 
    } 
} 
} 

Dice1Component代码:

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,但这似乎也不适用于我。

+2

我很好奇你为什么不把两个骰子都画在同一个组件上?我也不会在'paintComponent'方法中创建Dice。保持它作为一个班级成员。有两个班级成员,每个骰子一个。你可以为每个骰子设置一个setter。如果你打算有很多骰子,那么也许你可以创建一个Dice的Map,并通过键访问每个骰子。但通常,我只会使用_one_绘图表面。 – 2014-11-02 16:28:22

+0

是的,作为@peeskillet:考虑让Dice成为一个逻辑类,知道如何绘制自己,但不是GUI类,也不是扩展Swing组件的类。考虑创建一个绘制所有骰子的绘图JPanel,并避免在paintComponent中创建对象和变量。您无法控制何时或是否会调用该方法,因此没有程序逻辑应该放在它的内部,只需修改代码即可。 – 2014-11-02 16:41:58

回答

2

有几个问题(除了在评论中提到的),但这些应使代码工作:

  • 你应该Dice1Component,这样的布局管理器可以 覆盖首选大小保留了正确的空间

    @Override 
    public Dimension getPreferredSize() { 
        return new Dimension(100, 100); 
    } 
    
  • Dice1删除xCoordyCoord。所使用的坐标是相对于组件的,因此大偏移量将尝试在组件区域外绘制
  • 请看tutorial如何仅在事件分派线程中创建和访问组件。