-1

別のフォント、具体的にはTimes New Roman(私が使用しているiMacで利用可能)を描きたい

フォントを正しく設定して文字列を描画します。FontMetricsこれを使用すると、フォントが正しく測定されますが、正しいフォントが描画されません。代わりに、描画されるのはArialだと思います。

その下でGraphics2Dオブジェクトを使用していますが、通常のGraphicsオブジェクトでも機能しません。

    // FONTS
    Font fBank = new Font("Times New Roman", Font.PLAIN, 9);
    Font fPrice = new Font("Times New Roman", Font.PLAIN, 17);
    Font fnormalText = new Font("Times New Roman", Font.PLAIN, 13);
    Font fHeadlineText = new Font("Times New Roman", Font.PLAIN, 27);
    Font fPayAndDiagnose = new Font("Times New Roman", Font.PLAIN, 12);
    Font fHeadlineNumber = new Font("Times New Roman", Font.PLAIN, 17);

    // FONTMETRIC
    FontMetrics fMetric = _parent.getFontMetrics(fnormalText);

    // LOGO
    int imgPosX = (int) pageFormat.getImageableX() + 30;
    int imgPosY = (int) pageFormat.getImageableY() + 30;

    Image logo = new ImageIcon(getClass().getResource("/at/corgler/images/Print_Header_Plain.jpg")).getImage();
    g.drawImage(logo, imgPosX, imgPosY, 184, 117, null);



    // BILLDATE
    String dateText = "XX, " + new SimpleDateFormat("dd. MMMM yyyy").format(_billDate);

    int datePosY = imgPosY + 105;
    int datePosX = (int) pageFormat.getImageableWidth() - fMetric.stringWidth(dateText);

    g.setFont(fnormalText);
    g.drawString(dateText, datePosX, datePosY);



    // HEADLINE WITH NUMBER
    String headlineText = "Honorarnote";
    String numberText = "Nr. " + _payNumber + "/" + new SimpleDateFormat("yy").format(new Date());

    fMetric = _parent.getFontMetrics(fHeadlineText);
    int headlineWidth = fMetric.stringWidth(headlineText);

    fMetric = _parent.getFontMetrics(fHeadlineNumber);
    int numberWidth = fMetric.stringWidth(numberText);

    int headlinePosY = datePosY + 65;
    int headlineTextPosX = (int) ((pageFormat.getImageableWidth() / 2) - ((headlineWidth + numberWidth) / 2));
    int headlineNumberPosX = headlineTextPosX + headlineWidth + 3;

    g.setFont(fHeadlineText);
    g.drawString(headlineText, headlineTextPosX, headlinePosY);

    g.setFont(fHeadlineNumber);
    g.drawString(numberText, headlineNumberPosX, headlinePosY);

    g.drawLine(headlineTextPosX - 1, headlinePosY + 2, headlineTextPosX + headlineWidth, headlinePosY + 2);
    g.setStroke(new BasicStroke(0.5f));
    g.dispose();
4

1 に答える 1

1

十分な情報をご提供いただけなかったと思います。

期待される結果と実際の結果の実行可能なコードまたは画像があればいいでしょう。

テキストのレンダリングには多くの落とし穴があります。1 つ目は、フォントの上昇を補正して、ベース ライン上に描画されるようにする必要があることです...

復習として、2D グラフィックス チュートリアルのテキスト APIの操作をご覧になることをお勧めします...

ここに画像の説明を入力

public class TestFontGraphics {

    public static void main(String[] args) {
        new TestFontGraphics();
    }

    public TestFontGraphics() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);                
            }
        });
    }

    public class TestPane extends JPanel {

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            int x = 10;
            int y = 10;
            y += drawFont("Arial", x, y, g);
            y += drawFont("Times New Roman", x, y, g);
        }

        private int drawFont(String fontName, int x, int y, Graphics g) {

            Font font = new Font(fontName, Font.PLAIN, 24);
            g.setFont(font);
            FontMetrics fm = g.getFontMetrics();

            g.setColor(Color.RED);
            g.drawLine(x, y, x + fm.stringWidth(fontName), y);
            g.setColor(Color.GREEN);
            g.drawLine(x, y + fm.getAscent(), x + fm.stringWidth(fontName), y + fm.getAscent());
            g.setColor(Color.BLUE);
            g.drawLine(x, y + (fm.getDescent() + fm.getAscent()), x + fm.stringWidth(fontName), y + (fm.getDescent() + fm.getAscent()));
            g.setColor(Color.BLACK);
            g.drawString(fontName, x, y + fm.getAscent());

            return fm.getHeight();

        }

    }

}
于 2013-01-30T00:12:49.483 に答える