0

10x10 セルのグリッドを表示する Java プログラミングがあります。各セルに 1 つの文字を描画し、セル全体を占めるようにしたいと考えています。

現在、次のコードを使用していますが、サイズが適切ではありません。

graphics.setFont(new Font("monospaced", Font.PLAIN, 12));

for(int x = 0; x < GRID_WIDTH; x++) {
    for(int y = 0; y < GRID_HEIGHT; y++) {
        graphics.drawString(Character.toString(grid[x][y]), x * CELL_WIDTH, (y + 1) * CELL_HEIGHT);
    }
}

Java で 10x10 (またはCELL_WIDTHx CELL_HEIGHT) 文字を描画する方法はありますか?

4

2 に答える 2

0

希望どおりに機能する解決策を見つけました。文字の sCharacterImageGeneratorを生成 (およびキャッシュ) するクラスを作成しました。Image次に、キャラクターを描きたいときはいつでも、これらの画像を描いて拡大縮小します。

public class CharacterImageGenerator {

    private FontMetrics metrics;
    private Color color;
    private Map<Character, Image> images;

    public CharacterImageGenerator(FontMetrics metrics, Color color) {
        this.metrics = metrics;
        this.color = color;
        images = new HashMap<Character, Image>();
    }

    public Image getImage(char c) {
        if(images.containsKey(c))
            return images.get(c);

        Rectangle2D bounds = new TextLayout(Character.toString(c), metrics.getFont(), metrics.getFontRenderContext()).getOutline(null).getBounds();
        if(bounds.getWidth() == 0 || bounds.getHeight() == 0) {
            images.put(c, null);
            return null;
        }
        Image image = new BufferedImage((int)bounds.getWidth(), (int)bounds.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
        Graphics g = image.getGraphics();
        g.setColor(color);
        g.setFont(metrics.getFont());
        g.drawString(Character.toString(c), 0, (int)(bounds.getHeight() - bounds.getMaxY()));

        images.put(c, image);
        return image;
    }
}

次に、大きなフォントで初期化して、見栄えの良い文字を取得します。

// During initialization
graphics.setFont(new Font("monospaced", Font.PLAIN, 24));
characterGenerator = new CharacterImageGenerator(graphics.getFontMetrics(), Color.WHITE);

次に、必要なサイズに拡大縮小して描画します。

private void drawCharacter(int x, int y, char c) {
    graphics.drawImage(characterGenerator.getImage(c), PADDING + (x * TILE_WIDTH), PADDING + (y * TILE_HEIGHT), TILE_WIDTH, TILE_HEIGHT, null);
}
于 2013-10-30T23:58:49.333 に答える