Graphics.drawString () не рисует - PullRequest
       0

Graphics.drawString () не рисует

3 голосов
/ 21 марта 2011

Я создаю простую игру в маджонг для финального проекта в школе и, похоже, у меня возникли некоторые проблемы с методом drawString() объекта Graphics / Graphics2D. Я вызываю метод drawString и ничего не вижу на экране.

В моем сценарии я расширил класс JFrame и переопределил метод paintComponent(), чтобы создать пользовательский графический объект, в частности плитку маджонга. Используя многоугольники, описанные в различных массивах, я создаю искусственный трехмерный вид плитки, рисующей лицо, правую сторону и нижнюю часть плитки. Эти полигоны заполнены объектами GradientPaint, чтобы придать плитке лучший вид. Вот как это выглядит:

Rendered Tile

Мой 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() для записи символа в верхнем левом углу. Эта проблема? Это ничего не пишет. Что я делаю не так?

Ответы [ 4 ]

4 голосов
/ 21 марта 2011
g2d.drawString(charToWrite, 0, 0); 

Вам нужно указать нижнюю / левую координаты при рисовании строки. Попробуйте что-то вроде:

g2d.drawString(charToWrite, 0, 10); 

Кроме того, вам необходимо убедиться, что компонент имеет правильный размер. По умолчанию размер равен (0, 0), что означает, что рисовать нечего. Обычно это делается путем указания предпочтительного размера, а затем позволяет менеджеру макета установить размер.

0 голосов
/ 21 марта 2011

Я рад, что я не единственный, у кого есть эта проблема для класса. Я еще не проверял это, но согласно этому сайту http://www.herongyang.com/Swing/JFrame-Draw-Chinese-Character-on-Frame.html этот шрифт должен работать для создания шрифта, который вам нужен для создания символов.

g2d.setFont(new Font("SimSun",Font.PLAIN, 12));
g2d.drawString(charToWrite, 0, 0);
0 голосов
/ 21 марта 2011

С чем color вы звоните g2d.drawString()?

Например:

    //add this line before next
    g2d.setBackground(Color.BLACK); //or 'g2d.setPaint(Color.BLACK);'
    g2d.drawString(charToWrite, 0, 0);

Вы уверены, что текущий шрифт содержит символы, которые вы пытаетесь нарисовать? - Изменить шрифт.

0 голосов
/ 21 марта 2011

Попробуйте

String fontString = "MS Gothic";
Font font = new Font(fontString, Font.PLAIN, 24);
g2d.setFont(font);

до drawString()

попробуйте Apple Gothic, если вы используете OS X.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...