Java AWT图形抽绳导致斜体-斜体字体的宽度不正确
我有以下程序,可以在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
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());
}
});
}
}