繁体   English   中英

在框架中添加多个摆动/倾斜形状

[英]Add multiple swing/awt shapes to frame

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

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

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

除了注释中提到的问题外,还有几个问题,但是这些应该可以使代码正常工作:

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

     @Override public Dimension getPreferredSize() { return new Dimension(100, 100); } 
  • 除去xCoordyCoordDice1 使用的坐标是相对于零部件的,因此较大的偏移量将尝试在零部件区域之外绘制
  • 看一看该教程,如何只在事件分发线程中创建和访问组件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM