【问题标题】:Add multiple swing/awt shapes to frame向框架添加多个摆动/awt 形状
【发布时间】: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 内部创建对象和变量。您无法控制何时或是否调用该方法,因此不应将任何程序逻辑放入其中,只需编写代码即可。

标签: java swing awt


【解决方案1】:

有几个问题(除了 cmets 中提到的问题),但这些问题应该可以使代码正常工作:

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

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(100, 100);
    }
    
  • Dice1 中删除xCoordyCoord。使用的坐标是相对于组件的,因此较大的偏移量会尝试在组件区域之外绘制
  • 看看tutorial,你应该如何只在事件调度线程中创建和访问组件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-11
    • 2017-04-01
    • 1970-01-01
    • 2017-02-20
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多