Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AWT图形抽绳导致斜体-斜体字体的宽度不正确_Java_Graphics_Drawstring_Italic - Fatal编程技术网

Java AWT图形抽绳导致斜体-斜体字体的宽度不正确

Java AWT图形抽绳导致斜体-斜体字体的宽度不正确,java,graphics,drawstring,italic,Java,Graphics,Drawstring,Italic,我有以下程序,可以在java awt中逐串打印句子: package awt; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.font.FontRenderContext; import ja

我有以下程序,可以在java awt中逐串打印句子:

package awt;

import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.font.FontRenderContext;
import java.awt.font.TextAttribute;
import java.awt.font.TextLayout;
import java.text.AttributedCharacterIterator.Attribute;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.swing.JFrame;
import javax.swing.JPanel;

import com.lowagie.text.pdf.DefaultFontMapper;

public class ItalicTest extends JPanel{
    private static final int FONT_SIZE = 9;
    protected static Graphics2D bgWorkGraphics = null;
    protected static Graphics2D fgWorkGraphics = null;
    private static DefaultFontMapper fontMapper = new DefaultFontMapper();


    static float width = 0;
    static int height = 0;
    static String arial_family = "Arial";
    static String arial_italic_filePath = "C:\\WINDOWS\\Fonts\\Ariali.ttf";

    static String familyToUse = arial_family;
    static String filepathToUse = arial_italic_filePath;

    public static final double AT_SCALE_X = 1.34;
    public static final double AT_SCALE_Y = 1.34;

    public static List<Image> outputList;

    public static Graphics2D currentGraphics = null;

    static List<String> myContentWords = new ArrayList<String>();
    static {
        myContentWords.add("and");
        myContentWords.add(" ");
        myContentWords.add("additional");
        myContentWords.add(" ");
        myContentWords.add("description");
        myContentWords.add(" ");
        myContentWords.add("text");
        myContentWords.add(" ");
        myContentWords.add("#");
        myContentWords.add(" ");
        myContentWords.add("4");
    }
   public void paint(Graphics g) {

      Graphics2D g2 = (Graphics2D)g;

      fontMapper.insertDirectory("C:\\Windows\\Fonts");

      Font font = new Font(familyToUse, java.awt.Font.ITALIC, FONT_SIZE);

      FontRenderContext frc = g2.getFontRenderContext();

      g2.setFont(font);

      TextLayout textLayout = null;
      float width1 = 0.0f;
      float x = 0.0f;
        float y = 8.2946780f;
        float previousWidth = 0.0f;
        for(int i=0; i<myContentWords.size(); i++) {
             textLayout = new TextLayout(myContentWords.get(i), font, frc);

             previousWidth = width1;

             x=x+previousWidth;
             width1 = textLayout.getAdvance();
            if(myContentWords.get(i).equals(" ")) {
                System.out.println("Width of space calculated is "+width1);
            }
            g2.drawString(myContentWords.get(i), x, y);
        }
   }

   public static void main(String[] args) {
      JFrame f = new JFrame();
      f.getContentPane().add(new ItalicTest());
      f.setSize(300, 200);
      f.setVisible(true);
   }

}
包装awt;
导入java.awt.Font;
导入java.awt.FontMetrics;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Image;
导入java.awt.RenderingHints;
导入java.awt.font.FontRenderContext;
导入java.awt.font.texttribute;
导入java.awt.font.TextLayout;
导入java.text.AttributedCharacterIterator.Attribute;
导入java.util.ArrayList;
导入java.util.Iterator;
导入java.util.List;
导入java.util.Map;
导入java.util.Map.Entry;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入com.lowagie.text.pdf.DefaultFontMapper;
公共类ItalictTest扩展了JPanel{
私有静态最终整型字体大小=9;
受保护的静态图形2d bgWorkGraphics=null;
受保护的静态图形2d fgWorkGraphics=null;
私有静态DefaultFontMapper fontMapper=新的DefaultFontMapper();
静态浮动宽度=0;
静态整数高度=0;
静态字符串arial_family=“arial”;
静态字符串arial\u italic\u filePath=“C:\\WINDOWS\\Fonts\\Ariali.ttf”;
静态字符串familyToUse=arial_族;
静态字符串filepathToUse=arial_italic_filePath;
公共静态最终双精度,比例尺=1.34;
公共静态最终双精度,比例为1.34;
公共静态列表输出列表;
公共静态图形2D currentGraphics=null;
静态列表myContentWords=newarraylist();
静止的{
myContentWords.添加(“和”);
myContentWords.添加(“”);
myContentWords.添加(“附加”);
myContentWords.添加(“”);
myContentWords.add(“说明”);
myContentWords.添加(“”);
myContentWords.add(“文本”);
myContentWords.添加(“”);
myContentWords。添加(“#”);
myContentWords.添加(“”);
myContentWords.添加(“4”);
}
公共空间涂料(图g){
图形2d g2=(图形2d)g;
fontMapper.insertDirectory(“C:\\Windows\\Fonts”);
Font Font=新字体(familyToUse,java.awt.Font.ITALIC,Font\u SIZE);
FontRenderContext frc=g2.getFontRenderContext();
g2.setFont(字体);
TextLayout TextLayout=null;
浮动宽度1=0.0f;
浮动x=0.0f;
浮动y=8.2946780f;
浮动宽度=0.0f;

对于(int i=0;i尝试使用
FontMetrics
。您可以了解更多信息

导入java.awt.Dimension;
导入java.awt.Font;
导入java.awt.FontMetrics;
导入java.awt.Graphics;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JOptionPane;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
公共类扩展JPanel{
私人最终名单;
私有最终字体字体=新字体(“impact”,Font.ITALIC,20);
公共斜体(){
list=createList();
}
私有列表createList(){
List myContentWords=new ArrayList();
myContentWords.添加(“和”);
myContentWords.添加(“”);
myContentWords.添加(“附加”);
myContentWords.添加(“”);
myContentWords.add(“说明”);
myContentWords.添加(“”);
myContentWords.add(“文本”);
myContentWords.添加(“”);
myContentWords。添加(“#”);
myContentWords.添加(“”);
myContentWords.添加(“4”);
返回myContentWords;
}
受保护组件(图形g){
超级组件(g);
g、 setFont(字体);
FontMetrics fm=g.getFontMetrics();
int height=fm.getAscent();
int y=getHeight()/2+height/2;
int x=0;
用于(字符串s:列表){
g、 抽绳(s、x、y);
x+=调频弦宽(s);
}
}
@凌驾
公共维度getPreferredSize(){
返回新维度(300100);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
showMessageDialog(null,new Italic());
}
});
}
}

非常感谢。我尝试了上面的程序,并且在示例程序中运行良好。现在我将在我的应用程序项目中集成相同的逻辑,并检查相同的逻辑是否正确运行。谢谢。
private final Font font = new Font("impact", Font.ITALIC, 20);
....
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setFont(font);
    FontMetrics fm = g.getFontMetrics();
    int height = fm.getAscent();
    int y = getHeight()/2 + height/2;
    int x = 0;
    for (String s : list) {
        g.drawString(s, x, y);
        x += fm.stringWidth(s);
    }
}
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Italic extends JPanel{
    private final List<String> list;
    private final Font font = new Font("impact", Font.ITALIC, 20);

    public Italic() {
       list = createList();
    }

    private List<String> createList() {
        List<String> myContentWords = new ArrayList<>();
        myContentWords.add("and");
        myContentWords.add(" ");
        myContentWords.add("additional");
        myContentWords.add(" ");
        myContentWords.add("description");
        myContentWords.add(" ");
        myContentWords.add("text");
        myContentWords.add(" ");
        myContentWords.add("#");
        myContentWords.add(" ");
        myContentWords.add("4");
        return myContentWords;
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setFont(font);
        FontMetrics fm = g.getFontMetrics();
        int height = fm.getAscent();
        int y = getHeight()/2 + height/2;
        int x = 0;
        for (String s : list) {
            g.drawString(s, x, y);
            x += fm.stringWidth(s);
        }
    }

    @Override 
    public Dimension getPreferredSize() {
        return new Dimension(300, 100);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                JOptionPane.showMessageDialog(null, new Italic());
            }
        });
    }
}