2014-11-02 34 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如何僅在事件分派線程中創建和訪問組件。