我在小程序和框架上使用TextLayout.draw()编写相同的属性字符串
在 TextLayout 中,当在小程序上使用倾斜(斜体/粗斜体)字体时,观察到单词/字符之间的间距不正确,而在框架上正确呈现相同的属性字符串
下面是一个独立的代码,用于演示在小程序上使用java.awt.font.TextLayout以及在框架上使用java.awt.font.TextLayout编写AttributedString之间的区别
下面的代码用于演示框架上的文本布局。这工作正常。
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ComponentEvent;
import java.awt.font.FontRenderContext;
import java.awt.font.TextAttribute;
import java.awt.font.TextLayout;
import java.text.AttributedString;
import javax.swing.JPanel;
public class GraphViewer extends Frame
{
public static void main(String[] args)
{
Component viewer = new GraphViewer(new test());
viewer.show();
}
public GraphViewer( Component component)
{
setLayout(new BorderLayout(0,0));
setVisible(true);
setSize(800,600);
setTitle("Viewer");
add("Center", component);
addWindowListener(new SymWindow());
}
public void paint(Graphics2D graphics)
{
graphics.clearRect(0,0,800, 600);
super.paint(graphics);
}
public class SymComponent extends java.awt.event.ComponentAdapter
{
public void ComponentResized(ComponentEvent event)
{
Object object = event.getSource();
if(object == GraphViewer.this)
{
}
}
}
public class SymWindow extends java.awt.event.WindowAdapter
{
public void windowClosing(java.awt.event.WindowEvent event)
{
Object object = event.getSource();
if (object == GraphViewer.this)
FrameApp_WindowClosing(event);
}
void FrameApp_WindowClosing(java.awt.event.WindowEvent event)
{
setVisible(false); // hide the Frame
dispose(); // free the system resources
System.exit(0); // close the application
}
}
}
class test extends JPanel
{
public Font getFont()
{
return new Font("Arial", Font.BOLD, 15);
}
synchronized public void paintComponent(Graphics g)
{
test1(g);
}
void test1(Graphics g)
{
Graphics2D g2 = (Graphics2D)g;
FontRenderContext frc = g2.getFontRenderContext();
java.awt.Font graphicsFont = new java.awt.Font("Arial", Font.PLAIN, 15);
AttributedString result = new AttributedString ("This is a test to check partial text formatting.");
graphicsFont = graphicsFont.deriveFont(java.awt.Font.ITALIC);
result.addAttribute(TextAttribute.FONT, graphicsFont, 1, 10);
result.addAttribute(TextAttribute.FONT, graphicsFont, 15, 22);
result.addAttribute(TextAttribute.FONT, graphicsFont, 25, 31);
result.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD);
TextLayout layout = new TextLayout(result.getIterator(),g2.getFontRenderContext());
layout.draw(g2, 100,100);
}
}
下面是在小程序上演示文本布局的代码。这在斜体字符之后提供了更多空间。这是TextLayout中的错误吗?
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.font.TextAttribute;
import java.awt.font.TextLayout;
import java.text.AttributedString;
import java.util.StringTokenizer;
import javax.swing.JApplet;
public class TestTextLayoutApplet extends JApplet {
public TestTextLayoutApplet() {
super();
}
public void init(){
System.out.println("In TestTextLayout Init");
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
java.awt.Font graphicsFont = new java.awt.Font("Arial", Font.BOLD, 15);
g2.setFont(graphicsFont);
AttributedString attStr = new AttributedString("This is a test to check partial text formatting.");
attStr.addAttribute(TextAttribute.FONT, g2.getFont());
graphicsFont = graphicsFont.deriveFont(java.awt.Font.ITALIC);
attStr.addAttribute(TextAttribute.FONT, graphicsFont, 1, 10);
attStr.addAttribute(TextAttribute.FONT, graphicsFont, 15, 22);
attStr.addAttribute(TextAttribute.FONT, graphicsFont, 25, 31);
attStr.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD);
/** Writing with TextLayout */
TextLayout textLayout = new TextLayout(attStr.getIterator(), g2.getFontRenderContext());
g2.setColor(Color.BLUE);
textLayout.draw(g2, 20, 100);
g2.dispose();
}
}
这是一个旧帖子,但没有人回答过这个问题,我知道答案。答案是肯定的,肯定有这样的错误,填充被错误地添加到斜体文本行(在文本布局内)。我知道该错误至少在 1.8 之前仍然存在,但它在某个时候得到了修复。我不知道是什么版本,我在网上找不到错误报告,但肯定是 Java 17。
它似乎不会影响Java模拟斜体的字体,但它肯定发生在真正的斜体面上,例如Arial Italic。