Я создаю простую игру в маджонг для финального проекта в школе и, похоже, у меня возникли некоторые проблемы с методом drawString()
объекта Graphics / Graphics2D. Я вызываю метод drawString
и ничего не вижу на экране.
В моем сценарии я расширил класс JFrame
и переопределил метод paintComponent()
, чтобы создать пользовательский графический объект, в частности плитку маджонга. Используя многоугольники, описанные в различных массивах, я создаю искусственный трехмерный вид плитки, рисующей лицо, правую сторону и нижнюю часть плитки. Эти полигоны заполнены объектами GradientPaint
, чтобы придать плитке лучший вид. Вот как это выглядит:
Мой Tile
класс выглядит следующим образом (примечание: некоторый код был опущен для краткости):
public class Tile extends JPanel
{
private int _width;
private int _height;
private int _depth;
/**
* Accessor to get the center of the face of the rendered
* mahjong tile.
*
* @return A point containing the center of the face of the tile.
*/
public Point getCenter()
{
return new Point(_width / 2, _height / 2);
}
/**
* The default constructor creates a tile that is proportionally
* calculated to 80 pixels wide.
*/
public Tile()
{
this(80);
}
/**
* Given the width parameter a mahjong tile is drawn according to
* the proportions of a size 8 mahjong tile.
*
* @param width The width of the tile to be rendered.
*/
public Tile(int width)
{
_width = width;
_height = (int)(width * 1.23);
_depth = (int)((width * 0.3) / 2);
setPreferredSize(new Dimension((_width + _depth) + 1, (_height + _depth) + 1));
}
@Override public void paintComponent(Graphics g)
{
// ... setup polygon arrays ...
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
// Turn on anti-aliasing.
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// ... setup various gradients ...
// Fill the face of the tile.
g2d.setPaint(faceGradient);
g2d.fillPolygon(faceXPolyPoints, faceYPolyPoints, faceXPolyPoints.length);
// Fill the right side of the top portion of the tile.
g2d.setPaint(ivoryRightSideGradient);
g2d.fillPolygon(ivoryRightSideXPolyPoints, ivoryRightSideYPolyPoints, ivoryRightSideXPolyPoints.length);
// Fill the bottom side of the top portion of the tile.
g2d.setPaint(ivoryBottomGradient);
g2d.fillPolygon(ivoryBottomXPolyPoints, ivoryBottomYPolyPoints, ivoryBottomXPolyPoints.length);
// Fill the right side of the bottom portion of the tile.
g2d.setPaint(jadeRightSideGradient);
g2d.fillPolygon(jadeRightSideXPolyPoints, jadeRightSideYPolyPoints, jadeRightSideXPolyPoints.length);
// Fill the bottom side of the bottom portion of the tile.
g2d.setPaint(jadeBottomGradient);
g2d.fillPolygon(jadeBottomXPolyPoints, jadeBottomYPolyPoints, jadeBottomXPolyPoints.length);
// Draw the outlines for the tile.
g2d.setPaint(Color.BLACK);
g2d.drawPolygon(faceXPolyPoints, faceYPolyPoints, faceXPolyPoints.length);
g2d.drawPolygon(ivoryRightSideXPolyPoints, ivoryRightSideYPolyPoints, ivoryRightSideXPolyPoints.length);
g2d.drawPolygon(ivoryBottomXPolyPoints, ivoryBottomYPolyPoints, ivoryBottomXPolyPoints.length);
g2d.drawPolygon(jadeBottomXPolyPoints, jadeBottomYPolyPoints, jadeBottomXPolyPoints.length);
g2d.drawPolygon(jadeRightSideXPolyPoints, jadeRightSideYPolyPoints, jadeRightSideXPolyPoints.length);
}
}
Как вы, возможно, знаете, существует множество различных типов плиток маджонга, один из которых представляет собой плитку персонажа, которая отображает различные китайские иероглифы на лицевой стороне плитки. Так что мой класс Tile
устанавливает базовый рисунок плитки, и я создаю новый класс CharacterTile
, который расширяет / наследует класс Tile
. Код для этого класса следующий:
public class CharacterTile extends Tile
{
private Character _character;
public CharacterTile(Character character)
{
super();
_character = character;
}
@Override public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
String charToWrite;
switch (_character)
{
case ONE:
charToWrite = "\u4E00";
break;
case TWO:
charToWrite = "\u4E8C";
break;
case THREE:
charToWrite = "\u4E09";
break;
case FOUR:
charToWrite = "\u56DB";
break;
case FIVE:
charToWrite = "\u4E94";
break;
case SIX:
charToWrite = "\u516D";
break;
case SEVEN:
charToWrite = "\u4E03";
break;
case EIGHT:
charToWrite = "\u516B";
break;
case NINE:
charToWrite = "\u4E5D";
break;
case NORTH:
charToWrite = "\u5317";
break;
case EAST:
charToWrite = "\u6771";
break;
case WEST:
charToWrite = "\u897F";
break;
case SOUTH:
charToWrite = "\u5357";
break;
case RED:
charToWrite = "\u4E2D";
break;
case GREEN:
charToWrite = "\u767C";
break;
case WAN:
charToWrite = "\u842C";
break;
default:
charToWrite = "?";
break;
}
g2d.drawString(charToWrite, 0, 0);
}
}
Как видите, конструктор по умолчанию для класса CharacterTile
принимает enum
, указывающий желаемое номинальное значение. Внутри переопределенного paintComponent
у меня есть оператор switch, который устанавливает соответствующий символ для записи, а затем я вызываю метод g2d.drawString()
для записи символа в верхнем левом углу. Эта проблема? Это ничего не пишет. Что я делаю не так?