简体   繁体   English

Java图形无法更改字体

[英]Java Graphics cannot change Font

I am trying to do a custom painting using the Graphics object. 我正在尝试使用Graphics对象进行自定义绘制。 I want to paint the text in word-wrap style, so i used some example code i found somewhere on this page. 我想以自动换行样式绘制文本,因此我使用了在此页面某处找到的一些示例代码。

My problem is that i cannot change the font-size in any way. 我的问题是我无法以任何方式更改字体大小。 Please help me, I attached the executable source code below. 请帮助我,我在下面附上了可执行的源代码。

Thanks 谢谢

Chris 克里斯

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.font.LineBreakMeasurer;
import java.awt.font.TextLayout;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;

import javax.swing.JFrame;

public class JavaFontProblem extends JFrame {

    public JavaFontProblem() {
        setSize(new Dimension(1024, 768));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void paint(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;
        String longtext = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.";

        g2d.setColor(Color.BLACK);
        g2d.setFont(new Font("Verdana", Font.PLAIN, 250));

        AttributedString atString = new AttributedString(longtext);
        AttributedCharacterIterator iterator = atString.getIterator();

        LineBreakMeasurer measurer = new LineBreakMeasurer(iterator, g2d
                .getFontRenderContext());
        measurer.setPosition(iterator.getBeginIndex());

        int m_width = 500;

        float x = 50, y = 50;
        while (measurer.getPosition() < iterator.getEndIndex()) {
            TextLayout layout = measurer.nextLayout(m_width);

            y += layout.getAscent();
            float dx = layout.isLeftToRight() ? 0 : m_width
                    - layout.getAdvance();

            layout.draw(g2d, x + dx, y);
            y += layout.getDescent() + layout.getLeading();
        }

    }

    public static void main(String[] args) {
        new JavaFontProblem().setVisible(true);
    }

}
atString.addAttribute(TextAttribute.FONT, myFont, 0, atString.length());

You need to send the length of the longtext...not the atString length 您需要发送长文本的长度...而不是atString的长度

Also, you will have to declare your own Font object. 同样,您将必须声明自己的Font对象。 It also negates the need to have your setFont. 它还不需要安装setFont。

import java.awt.font.TextAttribute;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.font.LineBreakMeasurer;
import java.awt.font.TextLayout;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;

import javax.swing.JFrame;

public class JavaFontProblem extends JFrame {

    public JavaFontProblem() {
        setSize(new Dimension(1024, 768));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void paint(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;
        String longtext = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.";

        g2d.setColor(Color.BLACK);
        //g2d.setFont(new Font("Verdana", Font.PLAIN, 250));

        Font myFont = new Font("Verdana", Font.PLAIN, 250);

        AttributedString atString = new AttributedString(longtext);
        atString.addAttribute(TextAttribute.FONT, myFont, 0, longtext.length());


        AttributedCharacterIterator iterator = atString.getIterator();

        LineBreakMeasurer measurer = new LineBreakMeasurer(iterator, g2d
                        .getFontRenderContext());
        measurer.setPosition(iterator.getBeginIndex());

        int m_width = 500;

        float x = 50, y = 50;
        while (measurer.getPosition() < iterator.getEndIndex()) {
                TextLayout layout = measurer.nextLayout(m_width);

                y += layout.getAscent();
                float dx = layout.isLeftToRight() ? 0 : m_width
                                - layout.getAdvance();

                layout.draw(g2d, x + dx, y);
                y += layout.getDescent() + layout.getLeading();
        }

    }

    public static void main(String[] args) {
        new JavaFontProblem().setVisible(true);
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM