当前位置: 代码迷 >> Java相关 >> 我设计做的一个时钟不能运动,请教!!
  详细解决方案

我设计做的一个时钟不能运动,请教!!

热度:135   发布时间:2006-03-26 11:14:00.0
我设计做的一个时钟不能运动,请教!!

急!我毕业设计做的一个时钟不能运动!可能是少了一个刷新的方法。请教高手指点!
原代码如下:
import java.awt.*;

import java.awt.geom.*;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.*;

public class app {

public static void main(String[] args) {
TextTestFrame frame=new TextTestFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();

}
}
class TextTestFrame extends JFrame
{
public TextTestFrame()
{
setTitle("Clock");
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);

Container contentPane=getContentPane();
JPanel panel=new JPanel();

contentPane.add(panel,BorderLayout.SOUTH);

clock=new ClockPanel();
contentPane.add(clock,BorderLayout.CENTER);


GregorianCalendar calendar=new GregorianCalendar();
int hours=calendar.get(Calendar.HOUR);
int minutes=calendar.get(Calendar.MINUTE);
int seconds=calendar.get(Calendar.SECOND);

clock.setTime(hours,minutes);

}
public static final int DEFAULT_WIDTH=300;
public static final int DEFAULT_HEIGHT=300;

private JTextField hourField;
private JTextField minuteField;
private ClockPanel clock;


}
class ClockPanel extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g;
Ellipse2D circle=new Ellipse2D.Double(100,100,2*RADIUS,2*RADIUS);
g2.draw(circle);

double hourAngle=Math.toRadians(90-360*minutes/(12*60));
drawHand(g2,hourAngle,HOUR_HAND_LENGTH);

double minuteAngle=Math.toRadians(90-360*minutes/60);
drawHand(g2,minuteAngle,MINUTE_HAND_LENGTH);

double secondAngle=Math.toRadians(90-6*seconds);
drawHand(g2,secondAngle,SECOND_HAND_LENGTH);



}
public void drawHand(Graphics2D g2,double angle,double handLength)
{
Point2D end=new Point2D.Double(2*RADIUS+handLength*Math.cos(angle),2*RADIUS-handLength*Math.sin(angle));
Point2D center=new Point2D.Double(2*RADIUS,2*RADIUS);
g2.draw(new Line2D.Double(center,end));
}
public void setTime(int h,int m)
{
minutes=h*60+m;
repaint();
}
private double minutes=0;
private double seconds=0;
private double RADIUS=100;
private double MINUTE_HAND_LENGTH=0.8*RADIUS;
private double HOUR_HAND_LENGTH=0.6*RADIUS;
private double SECOND_HAND_LENGTH=1*RADIUS;
}

搜索更多相关的解决方案: 时钟  运动  设计  

----------------解决方案--------------------------------------------------------
你这个程序写得有点复杂了吧
本来很简单的问题,再加上线程的操作,很容易就可以写出来的啊
你那个setTime()方法就是一个多余的方法,你完全可以利用Calendar类得到当前的确切的时间
然后每一秒种调用一下repaint()方法,并把最新的时间传给paint函数,不就可以了吗?
----------------解决方案--------------------------------------------------------
楼上的大哥谢谢你啊!我是一个java大菜鸟,学半年java都学傻了,很简单的问题都会想的那么复杂,现在是我自己一人搞设计,头都大了.不过你说的我还是看不懂.说实话我现在能看懂一些简单的程序,写是困难了点.你能不能把你这个方法发到我邮箱上(zjb_613@163.com)拜托了!!
----------------解决方案--------------------------------------------------------
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.text.*;
public class Clock extends JPanel implements Runnable{
private JLabel jl;
private DateFormat df;
public Clock(){
jl=new JLabel();
jl.setHorizontalAlignment(JLabel.CENTER);
df=DateFormat.getDateTimeInstance();
new Thread(this).start();
this.setLayout(new BorderLayout());
this.add(jl,BorderLayout.SOUTH);
}
public void run(){
while(true){
try{
Thread.sleep(1000);
}
catch(InterruptedException ie){
ie.printStackTrace();
}
jl.setText(df.format(new Date()));
repaint();
}

}
public void paintComponent(Graphics g){
super.paintComponent(g);
Calendar cal=Calendar.getInstance();
//得到当前的时间信息
int hour=cal.get(Calendar.HOUR);
int minute=cal.get(Calendar.MINUTE);
int second=cal.get(Calendar.SECOND);
//得到当前的面板的大小信息
int width=this.getWidth();
int height=this.getHeight();
//钟的那个圆盘取两个之中小的那个
int small=width<height?width:height;
int diameter=(int)(small*0.8);
int radius=diameter/2;
//确定中心点
Point center=new Point(width/2,height/2);
//确定时针,分钟,秒针的长度
int secondLength=(int)(radius*0.8);
int minuteLength=(int)(secondLength*0.8);
int hourLength=(int)(minuteLength*0.8);
//确定时针,分针,秒针的另一端坐标
int secondX=center.x+(int)(secondLength*Math.sin(second*2*Math.PI/60.0));
int secondY=center.y-(int)(secondLength*Math.cos(second*2*Math.PI/60.0));
int minuteX=center.x+(int)(minuteLength*Math.sin(minute*2*Math.PI/60.0));
int minuteY=center.y-(int)(minuteLength*Math.cos(minute*2*Math.PI/60.0));
int hourX=center.x+(int)(hourLength*Math.sin((minute/60.0+hour)*Math.PI/6.0));
int hourY=center.y-(int)(hourLength*Math.cos((minute/60.0+hour)*Math.PI/6.0));
Graphics2D g2d=(Graphics2D)g;
//画表盘和刻度
g.drawOval(center.x-radius,center.y-radius,diameter,diameter);
for(int i=0;i<60;i++){
int x2=center.x+(int)(radius*Math.sin(i*2*Math.PI/60.0));
int y2=center.y-(int)(radius*Math.cos(i*2*Math.PI/60.0));
if(i%5==0){
int x1=center.x+(int)((secondLength+1)*Math.sin(i*2*Math.PI/60.0));
int y1=center.y-(int)((secondLength+1)*Math.cos(i*2*Math.PI/60));
g2d.setStroke(new BasicStroke(2.5f));
g2d.drawLine(x1,y1,x2,y2);
}
else{
int x1=center.x+(int)((secondLength+10)*Math.sin(i*2*Math.PI/60.0));
int y1=center.y-(int)((secondLength+10)*Math.cos(i*2*Math.PI/60));
g2d.setStroke(new BasicStroke(0.8f));
g2d.drawLine(x1,y1,x2,y2);
}
}
//画时针,分针,秒针

g2d.setColor(Color.RED);
g2d.setStroke(new BasicStroke(3.0f));
g2d.drawLine(center.x,center.y,hourX,hourY);
g2d.setColor(Color.BLUE);
g2d.setStroke(new BasicStroke(1.5f));
g2d.drawLine(center.x,center.y,minuteX,minuteY);
g2d.setColor(Color.MAGENTA);
g2d.setStroke(new BasicStroke(1.0f));
g2d.drawLine(center.x,center.y,secondX,secondY);



}
public static void main(String args[]){
JFrame jf=new JFrame("时钟");
jf.getContentPane().add(new Clock(),BorderLayout.CENTER);
jf.setBounds(300,300,300,300);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}

试试看我刚写的这个
----------------解决方案--------------------------------------------------------
楼上的大哥谢谢你啊!我是一个标准的java大菜鸟,学半年java都学傻了啊!一些简单的问题都会想的那么复杂,现在是我一个人搞设计,头都快大了.不过大哥说的方法小弟还是看不懂啊!不瞒你说,我现在只能看懂一些简单的程序,写是困难了点,你能不能把你的方法发到我邮箱上(zjb_613@163.com)拜托了!!
----------------解决方案--------------------------------------------------------

谢谢楼上的大哥
不知道说什么好了!我忙了十几天的设计,让你一下就能出来了,而且又是那么完美.
佩服的五体投地!向大哥学习.
----------------解决方案--------------------------------------------------------
你真的很棒!
----------------解决方案--------------------------------------------------------
唉,数学学的不好 那点//确定时针,分针,秒针的另一端坐标
的角度,弧度什么的转换看不懂
----------------解决方案--------------------------------------------------------
其实都是一些很简单的三角函数,认真看应该都能看懂的
----------------解决方案--------------------------------------------------------
补补初中数学
----------------解决方案--------------------------------------------------------
  相关解决方案