gpt4 book ai didi

java - JEdi​​torPane 和字体比例

转载 作者:行者123 更新时间:2023-12-02 00:09:18 24 4
gpt4 key购买 nike

我有一些 Graphics2D 区域,我在其中绘制几何图元。可以使用 g2.scale(x, y) 轻松缩放它。现在我想在可扩展区域中绘制一些文本并直接在其中编辑文本。它也有效,但不幸的是有一个问题可以说明。这是 100% 在显示器上的样子: enter image description here

这就是 300% 时发生的情况:

enter image description here

字母“A”的位置几乎没问题,但字母B的位置左右跳动。我想 JEditorPane 只是采用最接近的字体来渲染缩放字体。不同字体的空间大小(以像素为单位)可能略有不同。这在字符串的开头并不会真正产生问题,但在最后错误会累积。

我怎样才能实现 JEditorPane 在任何 g2.scale() 的完全相同的位置渲染字体? (例如,OpenOffice 在遇到相同问题时工作正常)。

更新: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);
}
}

最佳答案

参见http://java-sl.com/articles.html有关 JEditorPane 缩放的文章。 “使用自定义 GlyphPainter 和分数测量支持进行缩放”一文解释了字体缩放和测量问题。您可以使用基于 TextLayout 或基于 GlyphVector 的绘画来修复分数 fnt 测量。

关于java - JEdi​​torPane 和字体比例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13195952/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com