阅读背景:

求解,java中graphics,drawstring乱码问题(2)

来源:互联网 
上贴:
https://topic.csdn.net/u/20080602/20/ac26e643-f4cb-4b0e-bf5c-e8c7bc8d8649.html?seed=2105182125
因无分可加,另开贴,散发求解。

使用graphics2D,在drawstring方法中,打印中文的时候,出现乱码,不知道怎么解决? 

代码很简单,tableName是从一个JDialog文本框输入的中文,如“国文”两字。

String tableName = table.getName(); //国文
// System.out.println(tableName);//这里打印显示出-国文

g.setColor(Color.BLACK);
g.drawString(tableName, x , y );//方框,乱码 

17 个解决方案

#1


我编写的JAVA程序中的Swing/AWT组件中的中文显示都是方框,而标题却能正常显示中文,且使用   System.out.println("中文字符串")能正常显示中文;
    解决思路:
    可能是JRE的中文字库不支持引起,所以添加一个可以支持的中文字库
    解决办法:
    第一步:下载中文字库,我使用的是simsun.ttc,可以直接在Windows(我用的是XP的系统)中找到,入径为C:\WINDOWS\Fonts下的simsun.ttc
    也可以在网站上下载 推荐天网网站:
    https://file.tianwang.com/cgi-bin/search?word=simsun.ttc

    第二步:将中文字库simsun.ttc放入Jre的字库中,操作如下:
    cd <JAVA_HOME>/lib/fonts或者cd <JAVA_HOME>/jre/lib/fonts
    mkdir fallback (fallback代表存放后备语言的文件夹)
    其中<JAVA_HOME>是你安装jdk/jre的路径,我的是/usr/lib/jdk1.5。复制或者链接一个中文字体至其下:
    ln -s /usr/share/fonts/truetype/simsun.ttf /usr/lib/jdk1.5/jre/lib/fonts/fallback/simsun.ttf

    第三步:有了上面的步骤之后,就可以在代码中编码实现显示中文了,操作如下:
    在main 函数中的开头处添加如下代码:
                Font f =  new Font("宋体",Font.PLAIN,12);
                UIManager.put("Label.font",f);
                UIManager.put("Label.foreground",Color.black);
                UIManager.put("Button.font",f);
                UIManager.put("Menu.font",f);
                UIManager.put("MenuItem.font",f);
                UIManager.put("List.font",f);
                UIManager.put("CheckBox.font",f);
                UIManager.put("RadioButton.font",f);
                UIManager.put("ComboBox.font",f);
                UIManager.put("TextArea.font",f);
                UIManager.put("EditorPane.font",f);
                UIManager.put("ScrollPane.font",f);
                UIManager.put("ToolTip.font",f);
                UIManager.put("TextField.font",f);
                UIManager.put("TableHeader.font",f);
                UIManager.put("Table.font",f);

    以上代码代表了在整个程序中的相关组件都使用定义好"f"字体,从而就不会存在中文乱码了,也省却了对所有组件单独设置的麻烦。


#2


谢谢兄弟啦,解决了,出现中文,哈哈!明天给你分,可以+100,不过问题缘由是什么了?对于其他非英语编码,是否也如此?
终于看到了中文,我试过n中方式,你这个方法,在网上看到过,但还是失败,后来有点差距。
就是需要用到
g.setFont(new Font("宋体", Font.PLAIN, 12));
给graphicis设置中文字体。

谢谢,200分是最多的,但实在太少,不成敬意。

#3


没遇到过中文字库没有的情况学习

#4


楼主很厚道,像楼主学习,,貌似以前解决过同样问题,哎,居然忘了,惭愧。。此贴收藏

#5


不是乱码问题,是字体不对,试试在  drawString 前先  setFont(new Font("宋体", Font.PLAIN, 30));
见  https://topic.csdn.net/u/20080602/20/ac26e643-f4cb-4b0e-bf5c-e8c7bc8d8649.html

#6


等你给分中...

#7


分不是问题,明天给,可以+100分。

#8


贴段代码,显示系统所有字体:

import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.util.Vector;

public class DisplayFonts {
public static void main(String[] args) {
// Determine which fonts support Chinese here ...
Vector chinesefonts = new Vector();
Font[] allfonts = GraphicsEnvironment.getLocalGraphicsEnvironment()
.getAllFonts();
int fontcount = 0;
String chinesesample = "\u4e00";
for (int j = 0; j < allfonts.length; j++) {
System.out.println(j+"-"+allfonts[j].getFontName());
if (allfonts[j].canDisplayUpTo(chinesesample) == -1) {
chinesefonts.add(allfonts[j].getFontName());
}
fontcount++;
}
}
}

#9


下面代码是载入字体文件的程序:
File file = new java.io.File(System.getProperty("user.dir") + "/font/simsun.ttf");
if (!file.exists()) {
System.out.println("file not found");
return  ;
}
try {
java.io.FileInputStream fi = new java.io.FileInputStream(file);
java.io.BufferedInputStream fb = new java.io.BufferedInputStream(fi);
// Font nf = Font.createFont(Font.TRUETYPE_FONT, fb);
// nf = nf.deriveFont(Font.TRUETYPE_FONT, 12); 
// System.out.println(nf.getFontName());
//
//   Font f =  new Font("宋体",Font.PLAIN,12);
//              UIManager.put("Label.font",f);
//              UIManager.put("Label.foreground",Color.black);
//              UIManager.put("Button.font",f);
//              UIManager.put("Menu.font",f);
//              UIManager.put("MenuItem.font",f);
//              UIManager.put("List.font",f);
//              UIManager.put("CheckBox.font",f);
//              UIManager.put("RadioButton.font",f);
//              UIManager.put("ComboBox.font",f);
//              UIManager.put("TextArea.font",f);
//              UIManager.put("EditorPane.font",f);
//              UIManager.put("ScrollPane.font",f);
//              UIManager.put("ToolTip.font",f);
//              UIManager.put("TextField.font",f);
//              UIManager.put("TableHeader.font",f);
//              UIManager.put("Table.font",f); 
//              
//              UIConstants.CUSTOM_FONT = nf ; 
              
// UIConstants.CUSTOM_FONT  = new Font("宋体", Font.PLAIN, 12) ;

} catch (Exception e) {
e.printStackTrace();



这两天的一些收获,与大家共享!

#10


恭喜楼主,原来是字体,比较容易忽略的地方

#11


楼主如果对 Java GUI 设计比较感兴趣,可以看看《Swing Hacks》一书,读过,里面有非常多的 GUI 设计鬼点子,例如创建不规则窗口等,CSDN上也有下载,网址: https://d.download.csdn.net/down/212245/syhhl007,书目录: https://www.oreilly.com.cn/book.php?m=toc&bn=978-7-302-14334-5另外楼主分享的代码很好用,收藏了!

#12


看楼主个人空间才发现,注册时间 2001-12-22,看了 Blog 发现同样是被 5.12 汶川地震震醒的,相信地震震醒了很多中国人,多难兴邦,没错!看到楼主已经另一贴给过分了,分无所谓,问题解决了就好,看来 CSDN 一三角的老鸟和一星的新手一样多,专家分真的说明不了什么,除了热心程度!

#13


有UTF-8

#14


再次谢谢大家!

#15


我很早以前就来,由于各种原因,很少上CSDN,希望大家多多交流,有问题也可联系我,:)!

#16


楼主不错,大家交个朋友,一起进步吧.

#17


asdadsf

分享到: