这次主要是看如果自己现在就开始动手写,最多能够写到哪一步,于是随便找了一个Clock 的代码,一边抄写一边理解,
这是我的学习方法,并不要求全部搞懂,但是每一步所完成的功能要知道,然后对照自己过去的编程经验,期望能够找到自己现在的水平在哪里!
下面是学习过程
import java.applet.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.io.*;
import java.awt.geom.*;
import java.awt.image.*;
public class Clock extends Applet implements Runnable, MouseListener,
ActionListener {
//写到这里发现这个Clock居然是Applet的子类,遇到看不明白的当然是手册伺候了,
//翻阅资料发现这个所谓Applet在JDKdom中的介绍为
//"是一种不适合单独运行但可嵌入在其他应用程序中的小程序。"完全看不懂
//而他的定义是public class Applet extends Panel ,^_^居然是Panel的子类
//这样我大概知道了这个Applet应该是一个容器类
//再看这家伙的方法,哇一大堆url,Image一看就是个html像,我心里合计,
//小样!别以为改了名字爷就认不 出你了。
//现在前面看明白了,implements就又有点不了了,决定先放一下,不求甚解从来就是
//本人的优良品德之一。
Image image,image1;
Toolkit tool;
JPanel panel;
Graphics gg;
int width,height,width1,height1;
Thread thread,thread2;
MediaTracker m;
double angel1=0,angel2=0;
int xsec,ysec,xsec2,ysec2,xmin,ymin,xmin2,ymin2,xhou,yhou,xhou2,yhou2;
int c = 0,xstr = 235,ystr = 253;
int y = ystr;
JButton button1 = new JButton();
JButton button2 = new JButton();
JButton button3 = new JButton();
JButton button4 = new JButton();
AudioClip music;
Color colorh = Color.GREEN,colorm= Color.BLACK,colors= Color.YELLOW;
String[] string = new String[5];
int kk = 0;
//上面一大堆罗里吧索的终于结束了
public void init()
{
//等会这个init咋那么眼熟,好像在哪里见过,哦。。。。。
//Applet方法成员之一,立即手册之,
//"由浏览器或 applet viewer 调用,通知此 applet 它已经加载到系统中。"
//看这个意思有点像把主对象容器初始化。
this.setLayout(new BorderLayout());
this.setBackground(Color.BLACK);
tool = getToolkit();
//到这里又看不懂了,怎么getToolkit()既没有对象也没有参数的,这样也可以啊!
//不管了接着看吧
image = tool.getImage("image.PNG");
//看吧PNG网页的东东来了吧
m = new MediaTracker(this);
m.addImage(image,0);
try
{
m.waitForID(0);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
//怎么多媒体也出来了,这个倒霉的程序员,没办法手册依旧
//MediaTracker 类是一个跟踪多种媒体对象状态的实用工具类
//要使用媒体跟踪器,需要创建一个 MediaTracker 实例,
//然后对每个要跟踪的图像调用其 addImage 方法。
//另外,还可以为每个图像分配一个惟一的标识符。
//此标识符可控制获取图像的优先级顺序。它还可用于标识可单独等待的惟一图像子集。
//具有较低 ID 的图像比具有较高 ID 的图像优先加载。
//这样后面的都大概看明白了,就是加载了一张图片。
//不由大呼,不愧是JAVA这样简单的操作也搞的如此复杂,偶喜欢。
width1 = image.getWidth(this);
height1 = image.getHeight(this);
width = this.width;
height = this.height;
//这两句有区别吗?
this.addMouseListener(this);
//姑且认为是在主容器上添加一个作用于主容器的鼠标事件吧
button1.setText("时针颜色");
button1.addActionListener(this);
button2.setText("分针颜色");
button2.addActionListener(this);
button3.setText("秒针颜色");
button3.addActionListener(this);
button4.setText("选择皮肤");
button4.addActionListener(this);
button1.setBackground(Color.BLACK);
button1.setForeground(Color.WHITE);
button2.setBackground(Color.BLACK);
button2.setForeground(Color.WHITE);
button3.setBackground(Color.BLACK);
button3.setForeground(Color.WHITE);
button4.setBackground(Color.BLACK);
button4.setForeground(Color.WHITE);
//为什么Color后颜色成员有大小写区分哪?
JPanel panel = new JPanel();
//手册:JPanel 是一般轻量级容器。不解
panel.setBackground(Color.BLACK);
panel.setLayout(new FlowLayout(FlowLayout.CENTER));
panel.add(button1);
panel.add(button2);
panel.add(button3);
panel.add(button4);
this.setLayout(new BorderLayout());
this.add(panel,BorderLayout.SOUTH);
string[0] = "时间就像海绵里水";
string[1] = "只要挤总会有的";
string[2] = "珍惜身边每一个人";
string[3] = "因为随着岁月流逝,";
string[4] = "他们将......";
//你不当程序员你还想当诗人啊!
//我有这样想过啊
//省省吧,好好做你这个程序员这么有前途的职业去吧。
image1 = createImage(getWidth(),getHeight()-35);
//又是一句没头没脑的东西。
gg = image1.getGraphics();
}
public void start()
{
//亲娘耶,这就开始了?
if (thread == null)
{
thread = new Thread(this);
thread.start();
}
if (thread2 == null)
{
thread2 = new Thread(new thread2());
//new一个new的自己??
thread2.start();
}
}
public void paint(Graphics g)
{
super.paint(g);
g.drawImage(image1,0,0,this);
Date date = new Date();
int hour = date.getHours();
int min = date.getMinutes();
int sec = date.getSeconds();
String m = Integer.toString(hour)+":"+Integer.toString(min)+":"
+ Integer.toString(sec);
//好像这样也可以 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
// String m = sdf.format(date);
double ans = (Math.PI/30)*min;
double anm = (3.1415926535897931D /30)*min;
double anh = ((hour +min/60.0)*(2*Math.PI/12));
xsec2 = 172 + (int) (45 * Math.sin(ans));
ysec2 = 165 - (int) (45 * Math.cos(ans));
xsec = 172 - (int) (13 * Math.sin(ans));
ysec = 165 + (int) (13 * Math.cos(ans));
xmin2 = 172 + (int) (40 * Math.sin(anm));
ymin2 = 165 - (int) (40 * Math.cos(anm));
xmin = 172 - (int) (10 * Math.sin(anm));
ymin = 165 + (int) (10 * Math.cos(anm));
xhou = 172 + (int) (30 * Math.sin(anh));
yhou = 165 - (int) (30 * Math.cos(anh));
xhou2 = 172 - (int) (10 * Math.sin(anh));
yhou2 = 165 + (int) (10 * Math.cos(anh));
g.setColor(colors); //秒针
g.drawLine(xsec, ysec, xsec2, ysec2);
g.setColor(colorm); //分针
g.drawLine(xmin, ymin, xmin2, ymin2);
g.setColor(colorh); //时针
g.drawLine(xhou2, yhou2, xhou, yhou);
g.setColor(Color.RED);
g.fillOval(169,162,9,9);
g.drawString(m,150,100);
g.setColor(Color.RED);
g.drawString(string[0], xstr, y);
g.drawString(string[1], xstr, y + 20);
g.drawString(string[2], xstr, y + 40);
g.drawString(string[3], xstr, y + 60);
g.drawString(string[4], xstr, y + 80);
}
public void update(Graphics g)
{
paint(g);
}
/**
* Method main
*
*
* @param args
*
*/
public static void main(String[] args) {
// TODO: Add your code here
}
/**
* Method run
*
*
*/
public void run() {
// TODO: Add your code here
while (true)
//这个true在这里有意义吗?
{
try
{
thread.sleep(1000);
gg.setColor(Color.WHITE);
gg.fillRect(0,0,width,height);
gg.drawImage(image,110,110,width1,height1,this);
repaint();
}
catch (Exception e)
{
System.out.print(e.getMessage());
}
}
}
private class thread2 implements Runnable
{
//前面已经有个thread2了,这里有冒出来一个,而且是Runnable接口
//前面那个thread2是Thread类
//难道纯属于该程序员在练习两种线程的创建方法吗?这个问题先放一放
public void run()
{
while (true)
{
try
{
thread2.sleep(1000);
}
catch(Exception e)
{
}
y--;
if (y<=5)
{
y=ystr;
}
repaint();
}
}
}
//一堆鼠标事件
public void mouseClicked(MouseEvent e) {
// TODO: Add your code here
System.out.print(e.getX());
System.out.print(e.getY());
}
public void mousePressed(MouseEvent e) {
// TODO: Add your code here
}
public void mouseReleased(MouseEvent e) {
// TODO: Add your code here
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void fileSelect()
{
JFileChooser choose = new JFileChooser();
//为用户选择文件提供了一种简单的机制
choose.setFileSelectionMode(JFileChooser.FILES_ONLY);
choose.setCurrentDirectory(new File("."));
//new File(".")?????????
choose.setFileFilter(new javax.swing.filechooser.FileFilter()
{
public boolean accept(File file)
{
String name = file.getName().toLowerCase();
return name.endsWith(".gif")||name.endsWith(".jpg")
||name.endsWith(".jpeg")||file.isDirectory();
}
public String getDescription()
{
return "图片文件";
}
});
//这里看起来java程序的组件应该全都是动态创建的了。难怪很难写。
int result = choose.showOpenDialog(this);
String name = null;
if(result == JFileChooser.APPROVE_OPTION)
{
name = choose.getSelectedFile().getAbsolutePath();
}
image = tool.getImage(name);
m.addImage(image,0);
try{
m.waitForAll();
} catch (Exception e){
System.out.print(e.getMessage());
}
}
public void actionPerformed(ActionEvent e) {
// TODO: Add your code here
if(e.getSource() == button1||e.getSource()==button2||e.getSource() ==button3){
JColorChooser Choose = new JColorChooser();
}
}
}
写到这里,机器中病毒了,而且自己也觉得没必要再继续写下去了
所有看不懂的一概跳过,最后发现还是从头学比较好