gpt4 book ai didi

java - 绘制相对于矩形 Swing 的缩放字符串

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:16:48 27 4
gpt4 key购买 nike

我需要使用 java.awt.Graphics2d 放置一些几何基元和文本。如果我对它们进行缩放,我希望元素之间的相对位置与缩放无关。不幸的是,如果我只是使用 Graphics2D.scale(...)Graphics2D.drawRectangle(...)Graphics2D.drawString(.. .)相对位置改变。用这张图片来说明很好:

enter image description here

这是生成这张图片的代码:

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

frame.add(new JPanel() {
{
setPreferredSize(new Dimension(1024, 300));
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

for(int i = 1; i < 5; i++) {
doDraw(g2, i, i*10);
}
}

void doDraw(Graphics2D g2, double scale, int yOffset) {
String txt = "A--> B";

AffineTransform at = g2.getTransform();

g2.scale(scale, scale);
g2.setColor(Color.DARK_GRAY);
g2.drawRect(10, 10 + yOffset, 234, 20);
g2.drawString(txt, 14, 24 + yOffset);

g2.setColor(Color.red);
g2.drawOval(228, 12 + yOffset, 14, 14);

g2.setTransform(at);
}
});

frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}

如你所见,元素的位置是不变的。唯一改变的是规模。在 100% 时,红色圆圈正好位于 B 字母上。但在 300% 或更多时,这是完全错误的。我做错了什么还是java中的错误?这个问题有解决方法吗?

我真正想要实现的是,在任何比例下,红色圆圈总是画在字母“B”周围。

UPD:我假设它发生的原因是 java 呈现缩放字体的方式。这不仅仅是字体,它像几何操作一样缩放,但对于任何比例,java 都采用适当的点大小字体。因此,75% 的 Arial 8 呈现为 Arial 6,而不是按 3/4 比例缩小的 Arial 8。否则缩放文本会看起来很糟糕。但可能是我错了。

UPD 2:尝试了 SwingUtilities2.drawText() - 没有效果。

背景:实际上我正在制作一种 vector 编辑程序。所以我在文档中有对象,它们有 X,Y 坐标。所以我只想以某种方式将它们放在文档中。问题在于,通过更改缩放比例,对象会在彼此的相对位置“跳跃”。因此,如果我想制作一些像 CHECKED 这样的文本,并让字母 C 位于一个方框/圆圈中,这取决于比例。

最佳答案

尝试将 Graphics 实例的 RenderingHints.KEY_FRACTIONALMETRICS 设置为 ON

关于java - 绘制相对于矩形 Swing 的缩放字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18851643/

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