关于线程的问题!急等!

TCsport 2006-01-26 05:59:54
我想编写一个时钟程序,在JPanel上绘制了时钟的图形,想动态的使它自动走动,可是不知道该怎么办了,我想用线程实现repaint()方法,可是遇到问题了,我的代码如下,希望高手指教,谢谢
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
public class Clock {
public static void main(String [] args){
ClockFrame frame = new ClockFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

}
}

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

Container contentPane = getContentPane();

setLayout(new BorderLayout());
ClockPanel panel = new ClockPanel();
// DatePanel datePanel = new DatePanel();
contentPane.add(panel,BorderLayout.CENTER);
// contentPane.add(datePanel,BorderLayout.SOUTH);
}

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

class ClockPanel extends JPanel{

public ClockPanel()
{
setSize(300,300);
}

public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
Ellipse2D circle = new Ellipse2D.Double();
circle.setFrameFromCenter(200,200,350,350);
g2.draw(circle);

drawLines(g2);

}

public void drawLines(Graphics2D g2)
{
Date date = Calendar.getInstance().getTime();
int hour = date.getHours();
int minute = date.getMinutes();
int second = date.getSeconds();

double hourAngle = Math.toRadians(90 - 360 * hour / 12);
double minuteAngle = Math.toRadians(90 - 360 * minute / 60);
double secondAngle = Math.toRadians(90 - 360 * second / 60);

Point2D hourEnd = new Point2D.Double(200 + hourLength * Math.cos(hourAngle),
200 - hourLength * Math.sin(hourAngle));
g2.draw(new Line2D.Double(center,hourEnd));
Point2D minuteEnd = new Point2D.Double(200 + minuteLength * Math.cos(minuteAngle),
200 - minuteLength * Math.sin(minuteAngle));
g2.draw(new Line2D.Double(center,minuteEnd));
Point2D secondEnd = new Point2D.Double(200 + secondLength * Math.cos(secondAngle),
200 - secondLength * Math.sin(secondAngle));
g2.draw(new Line2D.Double(center,secondEnd));

}


private double RADIUS = 150;
private double hourLength = 0.5 * RADIUS;
private double minuteLength = 0.7 * RADIUS;
private double secondLength = 0.9 * RADIUS;

private Point2D center = new Point2D.Double(200,200);
// private Point2D end;
}
...全文
113 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
didoleo 2006-01-27
  • 打赏
  • 举报
回复
刚才说错了
是 ClockFrame 类里的
setLayout(new BorderLayout());要改成contentPane.setLayout(new BorderLayout());
不是Clock类里。
菠菜Hello_World 2006-01-27
  • 打赏
  • 举报
回复
将其中一个类改成这样即可
class ClockFrame extends JFrame
{
public ClockFrame()
{
setTitle("Clock");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
setLayout(new BorderLayout());




// DatePanel datePanel = new DatePanel();
contentPane = getContentPane();
panel = new ClockPanel();
contentPane.add(panel,BorderLayout.CENTER);
ActionListener taskPerformer=new ActionListener(){
public void actionPerformed(ActionEvent evt) {
contentPane.repaint();
System.out.print("test");
}

};
new javax.swing.Timer (1000,taskPerformer).start();

// contentPane.add(datePanel,BorderLayout.SOUTH);
}
Container contentPane ;
ClockPanel panel ;
public static final int DEFAULT_WIDTH = 400;
public static final int DEFAULT_HEIGHT = 400;
}
yuzl32 2006-01-27
  • 打赏
  • 举报
回复
路过,没环境,没工具,只能帮顶. : )
didoleo 2006-01-26
  • 打赏
  • 举报
回复
你的Clock类里
setLayout(new BorderLayout()); 这句话
要改成contentPane.setLayout(new BorderLayout());否则运行会抛异常。
然后让写个TimerListener 接口,和Timer类(不是swing或util包里的Timer)
ClockPanel 实现TimerListener,并且ClockPanel里要有个Timer成员

/*
* Created on Jan 26, 2006
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package ch9;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import javax.swing.JPanel;

/**
* @author dido leo
*
* TODO To change the template for this generated type comment go to Window -
* Preferences - Java - Code Style - Code Templates
*/
public class ClockPanel extends JPanel implements TimerListener {
public ClockPanel() {
Timer t = new Timer(1000, this);
t.start();

setSize(300, 300);
}

public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
Ellipse2D circle = new Ellipse2D.Double();
circle.setFrameFromCenter(200, 200, 350, 350);
g2.draw(circle);

drawLines(g2);

}

public void timeElapsed(Timer t) {
repaint();
}

public void drawLines(Graphics2D g2) {
Date date = Calendar.getInstance().getTime();
int hour = date.getHours();
int minute = date.getMinutes();
int second = date.getSeconds();

double hourAngle = Math.toRadians(90 - 360 * hour / 12);
double minuteAngle = Math.toRadians(90 - 360 * minute / 60);
double secondAngle = Math.toRadians(90 - 360 * second / 60);

Point2D hourEnd = new Point2D.Double(200 + hourLength
* Math.cos(hourAngle), 200 - hourLength * Math.sin(hourAngle));
g2.draw(new Line2D.Double(center, hourEnd));
Point2D minuteEnd = new Point2D.Double(200 + minuteLength
* Math.cos(minuteAngle), 200 - minuteLength
* Math.sin(minuteAngle));
g2.draw(new Line2D.Double(center, minuteEnd));
Point2D secondEnd = new Point2D.Double(200 + secondLength
* Math.cos(secondAngle), 200 - secondLength
* Math.sin(secondAngle));
g2.draw(new Line2D.Double(center, secondEnd));

}

private double RADIUS = 150;

private double hourLength = 0.5 * RADIUS;

private double minuteLength = 0.7 * RADIUS;

private double secondLength = 0.9 * RADIUS;


private Point2D center = new Point2D.Double(200, 200);
// private Point2D end;
}

/////////////////////////////////////////
/*
* Created on Jan 26, 2006
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package ch9;



/**
* @author dido leo
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public interface TimerListener {
void timeElapsed(Timer t);
}
/////////////////////////////////////////////
/*
* Created on Jan 26, 2006
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package ch9;

/**
* @author dido leo
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class Timer extends Thread{
private TimerListener target;
private int interval;
public Timer(int i,TimerListener t){
target=t;
interval=i;
setDaemon(true);
}

public void run(){
try{
while(!interrupted()){
sleep(interval);
target.timeElapsed(this);
}
}catch(Exception e){

}
}
}

62,624

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧