Java字体推进,字符宽度 上下文

Java字体推进,字符宽度 上下文,java,fonts,fontmetrics,Java,Fonts,Fontmetrics,下面的代码生成了一个“好看”的“Hello World” 现在,如果取而代之的是,我绘制每个字符串,并手动前进fontMetrics.getCharWidth(c),那么我最终会看到一个狭窄/拥挤的“Hello World” 问题 为什么会发生这种情况?除了每个字符的“前进”之外,我还需要添加哪些内容来确保字符间隔良好?在图形中,您使用哪种方法渲染字符? 这是我编写的代码,它运行得非常完美,两种渲染方法的结果完全相同, 你能分享一下你的代码吗 public class Test1 extends

下面的代码生成了一个“好看”的
“Hello World”

现在,如果取而代之的是,我绘制每个字符串,并手动前进
fontMetrics.getCharWidth(c)
,那么我最终会看到一个狭窄/拥挤的
“Hello World”

问题
为什么会发生这种情况?除了每个字符的“前进”之外,我还需要添加哪些内容来确保字符间隔良好?

在图形中,您使用哪种方法渲染字符? 这是我编写的代码,它运行得非常完美,两种渲染方法的结果完全相同, 你能分享一下你的代码吗

public class Test1 extends JPanel{

public static void main(String[] args) {

    Test1 test = new Test1() ;

    JFrame frame = new JFrame() ;
    frame.add(test) ;
    frame.setSize(800 , 600) ;
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
    frame.setVisible(true) ;

}


@Override
public void paint(Graphics g) {     
    String text = "This is a text , Hello World!" ;

    g.drawString(text, 0, 100) ;        
    drawString(text, g, 0, 120) ;       
}

private void drawString (String s , Graphics g , int x , int y){
    for (int c1=0 ; c1 < s.length() ; c1++){

        char ch = s.charAt(c1); 
        g.drawString(ch+"", x, y) ;
        x+= g.getFontMetrics().charWidth(ch) ;
    }
}
公共类Test1扩展了JPanel{
公共静态void main(字符串[]args){
Test1 test=新的Test1();
JFrame=新JFrame();
帧。添加(测试);
框架设置尺寸(800600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
@凌驾
公共空间绘制(图形g){
String text=“这是一个文本,你好,世界!”;
g、 抽绳(文本,0,100);
抽绳(文本,g,0,120);
}
专用空心抽绳(字符串s、图形g、整数x、整数y){
对于(int c1=0;c1

}

另请参见中所示的
字形向量。请注意,字母的位置可能会受到前面是否有空白字符以及前面的字符是什么的影响。你到底为什么要得到单个角色的宽度?我是个懒虫,因为我没有生成一个最小的工作示例。事实证明,问题是我读取了错误字体的FontMetrics,这就是我手动计算失败的原因。
public class Test1 extends JPanel{

public static void main(String[] args) {

    Test1 test = new Test1() ;

    JFrame frame = new JFrame() ;
    frame.add(test) ;
    frame.setSize(800 , 600) ;
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
    frame.setVisible(true) ;

}


@Override
public void paint(Graphics g) {     
    String text = "This is a text , Hello World!" ;

    g.drawString(text, 0, 100) ;        
    drawString(text, g, 0, 120) ;       
}

private void drawString (String s , Graphics g , int x , int y){
    for (int c1=0 ; c1 < s.length() ; c1++){

        char ch = s.charAt(c1); 
        g.drawString(ch+"", x, y) ;
        x+= g.getFontMetrics().charWidth(ch) ;
    }
}