0

幾何学的なプリミティブをペイントする Graphics2D 領域があります。g2.scale(x, y) で簡単にスケーリングできます。今、スケーラブルな領域にテキストをペイントし、テキストを編集したいと考えています。これも機能しますが、残念ながら説明できる問題が 1 つあります。これは、モニターを 100% 見る方法です。 ここに画像の説明を入力

そして、それが 300% で起こることです:

ここに画像の説明を入力

文字「A」の位置はほぼOKですが、文字Bの位置は左右にジャンプします。JEdi​​torPane は、スケーリングされたフォントをレンダリングするために最も近いフォントを取得すると思います。また、異なるフォントのスペースは、ピクセル単位でわずかに異なるサイズになる可能性があります。これは文字列の先頭では問題になりませんが、末尾ではエラーが蓄積されます。

JEdi​​torPane が g2.scale() でまったく同じ位置にフォントをレンダリングするようにするにはどうすればよいですか? (たとえば、OpenOffice は同じ問題で正しく動作します)。

UPD: sscce

class Canvas extends JPanel {
    @Override
    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g.translate(p.x, p.y);
        g2.scale(scale, scale);
        g2.setColor(Color.GRAY);
        g2.fill(g2.getClip());

        JEditorPane pane = new JEditorPane();
        pane.setFont(pane.getFont().deriveFont(22f));
        pane.setText("A                                                                                              B");
        pane.setBounds(new Rectangle(100, 100, 700, 30));
        g2.translate(100, 100);
        pane.paint(g2);
        g2.translate(-100, -100);

        g2.setColor(Color.BLACK);
        g2.draw(new Rectangle(100, 100, 700, 30));


        g2.scale(1 / scale, 1 / scale);
        g.translate(-p.x, -p.y);
        g2.setColor(Color.GREEN);
        g2.setFont(g2.getFont().deriveFont(33f));
        g2.drawString("Scale (mouse wheel): " + new DecimalFormat("#.##").format(scale * 100) + "%", 2, 768-66);
        g2.drawString("(Drag mouse to move)", 2, 768-33);
    }


// +++++++++++++++++++++++++++ GUI +++++++++++++++++++++++++++++++++++++

    public Canvas() {
        addMouseWheelListener(new MouseWheelListener() {
            @Override
            public void mouseWheelMoved(MouseWheelEvent e) {
                scale += e.getWheelRotation() * 1.0 / 10;
                repaint();
            }
        });

        addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                p.x = e.getPoint().x - startDrag.x;
                p.y = e.getPoint().y - startDrag.y;
                repaint();
            }
        });

        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                startDrag = e.getPoint();
                startDrag.x -= p.x;
                startDrag.y -= p.y;
            }
        });
    }

    public static double scale = 1.0;
    public static Point p = new Point();
    public static Point startDrag = new Point();
}

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(new Canvas());

        frame.setSize(1024, 768);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
4

2 に答える 2

2

JEdi​​torPane スケーリングに関するhttp://java-sl.com/articles.html記事を参照してください。「カスタム GlyphPainter と小数測定のサポートによるスケーリング」の記事では、フォントのスケーリングと測定の問題について説明しています。TextLayout ベースまたは GlyphVector ベースのペイントを使用して、分数の fnt 測定を修正できます。

于 2012-11-02T13:50:19.497 に答える