重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
代码太长,怕吞了。。。
察哈尔右翼后ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联建站的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:13518219792(备注:SSL证书合作)期待与您的合作!
public class TestTimer extends JFrame implements ActionListener, Runnable {
private static TestTimer obj; // 自己的一个静态实例,在这里没什么特别的意思
private JButton btnStart; // 开始按钮
private JButton btnPause; // 暂停按钮
private JButton btnResume; // 恢复按钮
private JButton btnStop; // 停止按钮
private JLabel lblTime; // 显示时间的Label(中文是标签?)
private static Thread th; // 一个用来控制时间的线程
private long count; // 计数
public TestTimer(){
super("秒表"); // TestTimer继承JFrame,这里调用父类的构造方法,传入的参数表示窗口的标题
btnStart = new JButton("开始"); // 初始化按钮,传入的参数表示按钮上显示的文字
btnPause = new JButton("暂停"); // 同上
btnResume = new JButton("继续"); // 同上
btnStop = new JButton("停止"); // 同上
lblTime = new JLabel("00:00:00.000"); // 初始化Label,传入的参数表示Label上显示的文字
this.setLayout(new FlowLayout()); // 设置layout风格为FlowLayout(就是设置控件的摆放方式)
this.add(btnStart); // 将控件加入到窗口中
this.add(btnPause); // 同上
this.add(btnResume); // 同上
this.add(btnStop); // 同上
this.add(lblTime); // 同上
btnStart.addActionListener(this); // 为按钮添加监听器(为什么是this,因为TestTimer类实现了ActionListener接口,所以可以这样用)
btnPause.addActionListener(this); // 为按钮添加监听器(但我不建议这样,这样的话类的职责不明确)
btnResume.addActionListener(this); // 为按钮添加监听器(当然,如果只是实现需求,怕麻烦可以这么做)
btnStop.addActionListener(this); // 为按钮添加监听器
this.setSize(150, 200); // 设置窗口大小
this.setVisible(true); // 显示窗口
}
public static void main(String[] args) {
obj = new TestTimer(); // 主函数入口,初始化实例(其实就是启动窗口)
}
public void actionPerformed(ActionEvent e) {// 这里是实现ActionListener接口的地方
JButton btn = (JButton)e.getSource(); // 获得是哪个按钮触发了事件
if(btn.getText().equals("开始")){ // 如果是开始按钮
th = new Thread(obj); // 初始化一个线程(传入obj是因为,TestTimer类实现了Runnable接口,同样我不建议这样做)
count = 0; // count计数器清零
th.start(); // 线程启动
}
else if(btn.getText().equals("暂停")){ // 如果是暂停按钮
th.suspend(); // 线程挂起(这个方法已经被新版本的JDK遗弃,你可以用,但不推荐用)
}
else if(btn.getText().equals("继续")){ // 如果是继续按钮
th.resume(); // 线程恢复(同上)
}
else if(btn.getText().equals("停止")){ // 如果是停止按钮
th.stop(); // 线程停止(同上)
}
}
@Override
public void run() { // 实现Runnable接口的地方
while(true){ // 无限循环(线程一直运行着记录时间)
int ms, seconds, minutes, hours; // 下面一整段都是根据count这个计数器来计算时间
// 你看到最后有一个Thread.sleep(1)表示该线程每毫秒工作一次,起到计数的作用)
String msg = ""; // msg表示Label上显示的时间
hours = (int)(count / 3600000);
minutes = (int)((count - hours * 3600000) / 60000);
seconds = (int)((count - hours * 3600000 - minutes * 60000) / 1000);
ms = (int)(count % 1000);
if(hours 10){ // 下面这一串是用来做msg的格式
msg += "0" + hours + ":";
}
else{
msg += hours + ":";
}
if(minutes 10){
msg += "0" + minutes + ":";
}
else{
msg += minutes + ":";
}
if(seconds 10){
msg += "0" + seconds + ":";
}
else{
msg += seconds + ":";
}
if(ms 10){
msg += "00" + ms;
}
else if(ms 100){
msg += "0" + ms;
}
else{
msg += ms;
}
lblTime.setText(msg); // 显示时间到Label上
count++; // 计数器递增
try {
Thread.sleep(1); // 线程挂起1毫秒(也即,线程每毫秒执行一次循环)
}
catch (InterruptedException e) { // 异常处理(不必管,必须这样写)
e.printStackTrace();
}
}
}
}
学会在idea(eclipse)中阅读、调试源码,是java程序员必不可少的一项技能。
在idea中配完环境后,默认其实也是能够对jdk的源码进行debug调试的。但是无法在源码中添加自己的注释,无法添加自己的理解。如果干瞪眼看的话,可能过段时间,就忘记了。下面就介绍下,如何在jdk源码中为所欲为,像在我们自己的代码中一样写注释、调代码:
打开idea,选择Project-File-Project Structure-SDKs-Sourcepath,初始状态如下图 :
打开本地jdk安装路径,本处为E:\java\jdk8,将此路径下的src.zip压缩包解压到自定义的指定文件夹(可以在电脑磁盘任意位置),本处解压到同目录的jdk_source文件夹下,如下图:
继续在步骤1中的设置页面中操作,将E:\java\jdk8\src.zip通过右侧的减号将其移除;并通过右侧的加号,将解压文件夹E:\java\jdk8\jdk_source导入进来;点击apply,再点击OK。导入结果见下图:
这时,再重新打开jdk的源码类,我们就可以在源java文件中,添加自己的注释了。
一定注意:添加注释时,一定不要新加一行写注释。最好在一行代码的后面,使用//进行注释。否则行号和真正的jre中编译后的代码行号对应不上,如果对源码debug时,会出现代码运行和行号不匹配的情况
需要先下载html格式的jdk中文文档,目前网上只能找到1.6版本的,准备好资源后再进行下一步设置,我使用的是IntelliJ IDEA,设置方法为:
File-Project Structure-SDKs
按图片描述的步骤,配置下载的api文档的路径即可。
注:配置的路径为文档中index.html的路径,否则不会生效,配置完成后在jdk中自带的类上按Ctrl+Q就能看到中文的注释。