Java Graphics не может изменить шрифт - PullRequest
2 голосов
/ 16 апреля 2009

Я пытаюсь сделать пользовательский рисунок, используя объект Graphics. Я хочу нарисовать текст в стиле переноса слов, поэтому я использовал пример кода, который нашел где-то на этой странице.

Моя проблема в том, что я никак не могу изменить размер шрифта. Пожалуйста, помогите мне, я прикрепил исполняемый код ниже.

Спасибо

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);
    }

}

Ответы [ 2 ]

3 голосов
/ 16 апреля 2009
atString.addAttribute(TextAttribute.FONT, myFont, 0, atString.length());
1 голос
/ 16 апреля 2009

Вам нужно отправить длину длинного текста ... не длину строки at

Также вам нужно будет объявить свой собственный объект Font. Это также сводит на нет необходимость иметь ваш 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);
    }

}
...