添加多个swing / awt形状到框架

时间:2014-11-02 16:12:41

标签: java swing awt

我创造了一款基于骰子游戏的Craps游戏。我已经创建了我的游戏逻辑,但我正在尝试实现GUI。我为这两个骰子创建了我的骰子和骰子组件。如果我一次一个地将我的骰子添加到框架中它们都可以工作,但是当我尝试同时将它们添加到框架并运行我的Craps游戏时,框架是空的。

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,但这对我来说似乎也不起作用。

1 个答案:

答案 0 :(得分:2)

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

  • 您应该覆盖Dice1Component中的首选大小,以便布局管理器可以  保留正确的空间

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