Java时钟程序中字体问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java时钟程序中字体问题相关的知识,希望对你有一定的参考价值。

import java.awt.*;
import java.awt.event.*;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.*;
public class Show extends JFrame

private JButton btnAdd=new JButton("添加内部窗体");
private JDesktopPane desktopPane=new JDesktopPane();
private int windowCount=1;
public Show()

setTitle("桌面窗格和内部窗体测试");
setSize(500,500);
addWindowListener(new WindowAdapter()

public void windowClosing(WindowEvent evt)

dispose();
System.exit(0);

);
Container contentPane=getContentPane();
contentPane.add(btnAdd,BorderLayout.NORTH);
contentPane.add(desktopPane,BorderLayout.CENTER);
desktopPane.setLayout(new FlowLayout());
btnAdd.addActionListener(new ActionListener()

public void actionPerformed(ActionEvent evt)

S s=new S();
s.setPreferredSize(new Dimension(250,100));
desktopPane.add(s);
s.show();
desktopPane.revalidate();

);

public class S extends JInternalFrame implements Runnable
Thread clock;
public S()
super("数字时钟"); //调用父类构造函数
Font type = new Font("Times New Roman",Font.BOLD,60); //设置时钟的显示字体
setFont(type);
start(); //开始进程
setSize(280,100); //设置窗口尺寸
//setUndecorated(true); // 去掉窗口的装饰

public void start() //开始进程
if (clock==null) //如果进程为空值
clock=new Thread(this); //实例化进程
clock.start(); //开始进程


public void run() //运行进程
while (clock!=null)
repaint(); //调用paint方法重绘界面
try
Thread.sleep(1000); //线程暂停一秒(1000毫秒)

catch (InterruptedException ex)
ex.printStackTrace(); //输出出错信息



public void stop() //停止进程
clock=null;

public void paint(Graphics g) //重载组件的paint方法
Graphics2D g2=(Graphics2D)g; //得到Graphics2D对象
Calendar now=new GregorianCalendar(); //实例化日历对象
String timeInfo=""; //输出信息
int hour=now.get(Calendar.HOUR_OF_DAY); //得到小时数
int minute=now.get(Calendar.MINUTE); //得到分数
int second=now.get(Calendar.SECOND); //得到秒数
if (hour<=9)
timeInfo+="0"+hour+":"; //格式化输出
else
timeInfo+=hour+":";
if (minute<=9)
timeInfo+="0"+minute+":";
else
timeInfo+=minute+":";
if (second<=9)
timeInfo+="0"+second;
else
timeInfo+=second;
g.setColor(Color.white); //设置当前颜色为白色
Dimension dim=getSize(); //得到窗口尺寸
g.fillRect(0,0,dim.width,dim.height); //填充背景色为白色
g.setColor(Color.blue); //设置当前颜色为蓝色
g.drawString(timeInfo,20,80); //显示时间字符串


public static void main(String[] args)

(new Show()).show();


时钟运行后,字体在1秒后就丢失了,究竟是repaint还是sleep造成的,
如何解决。

解决方法:
在public void paint(Graphics g)方法的第一行加上
super.paint(g);
修改后的结果:
import java.awt.*;
import java.awt.event.*;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.*;
public class Show extends JFrame

private JButton btnAdd=new JButton("添加内部窗体");
private JDesktopPane desktopPane=new JDesktopPane();
private int windowCount=1;
public Show()

setTitle("桌面窗格和内部窗体测试");
setSize(500,500);
addWindowListener(new WindowAdapter()

public void windowClosing(WindowEvent evt)

dispose();
System.exit(0);

);
Container contentPane=getContentPane();
contentPane.add(btnAdd,BorderLayout.NORTH);
contentPane.add(desktopPane,BorderLayout.CENTER);
desktopPane.setLayout(new FlowLayout());
btnAdd.addActionListener(new ActionListener()

public void actionPerformed(ActionEvent evt)

S s=new S();
s.setPreferredSize(new Dimension(250,100));
desktopPane.add(s);
s.show();
desktopPane.revalidate();

);

public class S extends JInternalFrame implements Runnable
Thread clock;
public S()
super("数字时钟"); //调用父类构造函数
Font type = new Font("Times New Roman",Font.BOLD,60); //设置时钟的显示字体
setFont(type);
start(); //开始进程
setSize(280,100); //设置窗口尺寸
//setUndecorated(true); // 去掉窗口的装饰

public void start() //开始进程
if (clock==null) //如果进程为空值
clock=new Thread(this); //实例化进程
clock.start(); //开始进程


public void run() //运行进程
while (clock!=null)
repaint(); //调用paint方法重绘界面
try
Thread.sleep(1000); //线程暂停一秒(1000毫秒)

catch (InterruptedException ex)
ex.printStackTrace(); //输出出错信息



public void stop() //停止进程
clock=null;

public void paint(Graphics g) //重载组件的paint方法
super.paint(g);
Graphics2D g2=(Graphics2D)g; //得到Graphics2D对象
Calendar now=new GregorianCalendar(); //实例化日历对象
String timeInfo=""; //输出信息
int hour=now.get(Calendar.HOUR_OF_DAY); //得到小时数
int minute=now.get(Calendar.MINUTE); //得到分数
int second=now.get(Calendar.SECOND); //得到秒数
if (hour<=9)
timeInfo+="0"+hour+":"; //格式化输出
else
timeInfo+=hour+":";
if (minute<=9)
timeInfo+="0"+minute+":";
else
timeInfo+=minute+":";
if (second<=9)
timeInfo+="0"+second;
else
timeInfo+=second;
g.setColor(Color.white); //设置当前颜色为白色
Dimension dim=getSize(); //得到窗口尺寸
g.fillRect(0,0,dim.width,dim.height); //填充背景色为白色
g.setColor(Color.blue); //设置当前颜色为蓝色
g.drawString(timeInfo,20,80); //显示时间字符串


public static void main(String[] args)

(new Show()).show();

参考技术A 是repaint造成的,因为使用repaint()函数其实是自动调用paint函数,而你在paint函数中并没用定义字体,所以原来的字体就被替换成默认的了,改正的方法就是在paint函数中也定义使用同样的字体

电脑出现乱码字体怎么解决

参考技术A 方法/步骤
1
电脑部份文字显示为乱码。
2
电脑中部份文字显示为乱码的解决方法
步骤:
进入控制面板,点击【时钟、语言和区域】;
3
在时钟、语言和区域窗口,点击【区域】下的更改位置;
4
在打开的区域窗口,我们点击【管理】,在管理标签下点击:更改系统区域设置(C)...;
在打开的区域设置窗口中,点击当前系统区域设置中的“v”,在下拉菜单中点击【英语(美国)】;
当前系统区域设置为:英语(美国)时,点击:确定;
我们点击确定以后,弹出一个更改系统区域设置的对话框:
系统区域设置已更改。你必须重新启动 Windows 才能使更改生效。
请确保在重新启动前保存了所做的工作并关闭了所有打开的程序。
点击:现在重新启动;

电脑重新启动进入系统后,再进入控制面板 - 时钟、语言和区域 - 区域 - 管理 - 更改系统区域设置,点击当前系统区域设置中的“v”,在下拉菜单中点击【中文(简体,中国)】,再点击:确定;

点击确定以后,又会弹出一个更改系统区域设置的对话框:
Windows 才能使更改生效。
点击:现在重新启动;

电脑重新启动进入系统,一般来说,电脑部份文字乱码的问题应该解决了。如果还存在部份文字乱码的现象,则是系统缺少了字体。
在百度搜索输入:simsun.ttc下载,点击simsun.ttc simsun.ttf下载下的下载地址,下载simsun.ttc字体库文件;

simsun.ttc字体库文件下载完成以后,解压simsun.ttc字体库文件,在解压后的文件夹中找到并左键双击simsun.ttc文件;

在打开的字体安装窗口,点击【安装(I)】,就可以把字体安装到系统中;
电脑中部份文字显示为乱码的解决方法
我们也可以把simsun.ttc文件复制到 C:\WINDOWS\Fonts文件夹中;

通过上述操作以后,电脑部份文字乱码的问题应该解决了,如果还是不行的话,请重装系统。

以上是关于Java时钟程序中字体问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在发送音频的 Java 客户端中使用 PTPv2 时钟初始化 AES67 音频流?

Java 6 下字体显示不正确

用java编写的时钟程序

如何在 Java 中使用自定义字体?

java实现时钟表盘教程方法

有秒计时的数字时钟(MOOC面向对象程序设计--Java语言)