package chapter8;import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;class ClockPanel extends JPanel{
private double minutes=0;
private int RADIUS=100;
private double MINUTE_HAND_LENGTH=0.8*RADIUS;
private double HOUR_HAND_LENGTH=0.6*RADIUS;
public ClockPanel(){
setPreferredSize(new Dimension(2*RADIUS+1,2*RADIUS+1));
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g;
Ellipse2D circle=new Ellipse2D.Double(0,0,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);
}
public void drawHand(Graphics2D g2,double angle,double handLength){
Point2D end=new Point2D.Double(
RADIUS+handLength*Math.cos(angle),
RADIUS-handLength*Math.sin(angle)
);
Point2D center=new Point2D.Double(RADIUS,RADIUS);
g2.draw(new Line2D.Double(center,end));
}
public void setTime(int h,int m){
minutes=h*60+m;
repaint();
System.out.println("error");
}
}class TextPanel extends JPanel{
}class TextFrame extends JFrame{
private static final int DEAULT_WIDTH=300;
private static final int DEAULT_HEIGHT=300;
private JTextField hourField;
private JTextField minuteField;
private ClockPanel clock;
public TextFrame(){
DocumentListener listener=new ClockFieldListener();
JPanel text=new JPanel();
text.add(new JLabel("Hours:"));
hourField=new JTextField("12",3);
text.add(hourField);
hourField.getDocument().addDocumentListener(listener);
text.add(new JLabel("Minutes:"));
minuteField=new JTextField("00",3);
text.add(minuteField);
minuteField.getDocument().addDocumentListener(listener);
clock=new ClockPanel();
add(clock,BorderLayout.SOUTH);
add(text,BorderLayout.CENTER);
pack();
}
public void setClock(){
try{
int hours=Integer.parseInt(hourField.getText().trim());
int minutes=Integer.parseInt(minuteField.getText().trim());
clock.setTime(hours, minutes);
System.out.println("error");
}
catch(NumberFormatException e){
System.out.println("error2");
}
}
private class ClockFieldListener implements DocumentListener{
public void changedUpdate(DocumentEvent event){
}
public void insertUpdate(DocumentEvent event){
setClock();
}
public void removeUpdate(DocumentEvent event){
setClock();
}
}
}public class TextTest{
public static void main(String[] args){
TextFrame frame=new TextFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}以上代码执行通过时,可以画出表盘.但是输入数据却无法改变.
我本意是容器于Frame类分开控制,但结果动态输入数据却没效果,也就是输入数字后表针无改变.
可是我做以下修改,就可以执行了.把控制动态的部分放入JFrame类中...
package chapter8;import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;class ClockPanel extends JPanel{
private double minutes=0;
private int RADIUS=100;
private double MINUTE_HAND_LENGTH=0.8*RADIUS;
private double HOUR_HAND_LENGTH=0.6*RADIUS;
public ClockPanel(){
setPreferredSize(new Dimension(2*RADIUS+1,2*RADIUS+1));
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g;
Ellipse2D circle=new Ellipse2D.Double(0,0,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);
}
public void drawHand(Graphics2D g2,double angle,double handLength){
Point2D end=new Point2D.Double(
RADIUS+handLength*Math.cos(angle),
RADIUS-handLength*Math.sin(angle)
);
Point2D center=new Point2D.Double(RADIUS,RADIUS);
g2.draw(new Line2D.Double(center,end));
}
public void setTime(int h,int m){
minutes=h*60+m;
repaint();
System.out.println("error");
}
}class TextPanel extends JPanel{
}class TextFrame extends JFrame{
private static final int DEAULT_WIDTH=300;
private static final int DEAULT_HEIGHT=300;
private JTextField hourField;
private JTextField minuteField;
private ClockPanel clock;
public TextFrame(){
DocumentListener listener=new ClockFieldListener();
JPanel text=new JPanel();
text.add(new JLabel("Hours:"));
hourField=new JTextField("12",3);
text.add(hourField);
hourField.getDocument().addDocumentListener(listener);
text.add(new JLabel("Minutes:"));
minuteField=new JTextField("00",3);
text.add(minuteField);
minuteField.getDocument().addDocumentListener(listener);
clock=new ClockPanel();
add(clock,BorderLayout.SOUTH);
add(text,BorderLayout.CENTER);
pack();
}
public void setClock(){
try{
int hours=Integer.parseInt(hourField.getText().trim());
int minutes=Integer.parseInt(minuteField.getText().trim());
clock.setTime(hours, minutes);
System.out.println("error");
}
catch(NumberFormatException e){
System.out.println("error2");
}
}
private class ClockFieldListener implements DocumentListener{
public void changedUpdate(DocumentEvent event){
}
public void insertUpdate(DocumentEvent event){
setClock();
}
public void removeUpdate(DocumentEvent event){
setClock();
}
}
}public class TextTest{
public static void main(String[] args){
TextFrame frame=new TextFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}请大大指示一下为什么.....
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;class ClockPanel extends JPanel{
private double minutes=0;
private int RADIUS=100;
private double MINUTE_HAND_LENGTH=0.8*RADIUS;
private double HOUR_HAND_LENGTH=0.6*RADIUS;
public ClockPanel(){
setPreferredSize(new Dimension(2*RADIUS+1,2*RADIUS+1));
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g;
Ellipse2D circle=new Ellipse2D.Double(0,0,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);
}
public void drawHand(Graphics2D g2,double angle,double handLength){
Point2D end=new Point2D.Double(
RADIUS+handLength*Math.cos(angle),
RADIUS-handLength*Math.sin(angle)
);
Point2D center=new Point2D.Double(RADIUS,RADIUS);
g2.draw(new Line2D.Double(center,end));
}
public void setTime(int h,int m){
minutes=h*60+m;
repaint();
System.out.println("error");
}
}class TextPanel extends JPanel{
}class TextFrame extends JFrame{
private static final int DEAULT_WIDTH=300;
private static final int DEAULT_HEIGHT=300;
private JTextField hourField;
private JTextField minuteField;
private ClockPanel clock;
public TextFrame(){
DocumentListener listener=new ClockFieldListener();
JPanel text=new JPanel();
text.add(new JLabel("Hours:"));
hourField=new JTextField("12",3);
text.add(hourField);
hourField.getDocument().addDocumentListener(listener);
text.add(new JLabel("Minutes:"));
minuteField=new JTextField("00",3);
text.add(minuteField);
minuteField.getDocument().addDocumentListener(listener);
clock=new ClockPanel();
add(clock,BorderLayout.SOUTH);
add(text,BorderLayout.CENTER);
pack();
}
public void setClock(){
try{
int hours=Integer.parseInt(hourField.getText().trim());
int minutes=Integer.parseInt(minuteField.getText().trim());
clock.setTime(hours, minutes);
System.out.println("error");
}
catch(NumberFormatException e){
System.out.println("error2");
}
}
private class ClockFieldListener implements DocumentListener{
public void changedUpdate(DocumentEvent event){
}
public void insertUpdate(DocumentEvent event){
setClock();
}
public void removeUpdate(DocumentEvent event){
setClock();
}
}
}public class TextTest{
public static void main(String[] args){
TextFrame frame=new TextFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}以上代码执行通过时,可以画出表盘.但是输入数据却无法改变.
我本意是容器于Frame类分开控制,但结果动态输入数据却没效果,也就是输入数字后表针无改变.
可是我做以下修改,就可以执行了.把控制动态的部分放入JFrame类中...
package chapter8;import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;class ClockPanel extends JPanel{
private double minutes=0;
private int RADIUS=100;
private double MINUTE_HAND_LENGTH=0.8*RADIUS;
private double HOUR_HAND_LENGTH=0.6*RADIUS;
public ClockPanel(){
setPreferredSize(new Dimension(2*RADIUS+1,2*RADIUS+1));
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g;
Ellipse2D circle=new Ellipse2D.Double(0,0,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);
}
public void drawHand(Graphics2D g2,double angle,double handLength){
Point2D end=new Point2D.Double(
RADIUS+handLength*Math.cos(angle),
RADIUS-handLength*Math.sin(angle)
);
Point2D center=new Point2D.Double(RADIUS,RADIUS);
g2.draw(new Line2D.Double(center,end));
}
public void setTime(int h,int m){
minutes=h*60+m;
repaint();
System.out.println("error");
}
}class TextPanel extends JPanel{
}class TextFrame extends JFrame{
private static final int DEAULT_WIDTH=300;
private static final int DEAULT_HEIGHT=300;
private JTextField hourField;
private JTextField minuteField;
private ClockPanel clock;
public TextFrame(){
DocumentListener listener=new ClockFieldListener();
JPanel text=new JPanel();
text.add(new JLabel("Hours:"));
hourField=new JTextField("12",3);
text.add(hourField);
hourField.getDocument().addDocumentListener(listener);
text.add(new JLabel("Minutes:"));
minuteField=new JTextField("00",3);
text.add(minuteField);
minuteField.getDocument().addDocumentListener(listener);
clock=new ClockPanel();
add(clock,BorderLayout.SOUTH);
add(text,BorderLayout.CENTER);
pack();
}
public void setClock(){
try{
int hours=Integer.parseInt(hourField.getText().trim());
int minutes=Integer.parseInt(minuteField.getText().trim());
clock.setTime(hours, minutes);
System.out.println("error");
}
catch(NumberFormatException e){
System.out.println("error2");
}
}
private class ClockFieldListener implements DocumentListener{
public void changedUpdate(DocumentEvent event){
}
public void insertUpdate(DocumentEvent event){
setClock();
}
public void removeUpdate(DocumentEvent event){
setClock();
}
}
}public class TextTest{
public static void main(String[] args){
TextFrame frame=new TextFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}请大大指示一下为什么.....
我操作还是没有效果.而且在paintComponent中用repaint非常耗资源,差点给我整死机.两段代码还是不同的...有个是一个容器一个类,一个是把所有容器都写在Frame中.我想一个容器一个类好操作和可观性好一点...
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;public class animation1 extends Applet implements Runnable,ActionListener
{
Thread hThread;
int xx=0,yy=0;
int x=0;
Label label1;
public void init()
{
this.setBackground(Color.lightGray);
label1=new Label("眤翴诀琌: ");
this.add(label1);
Button myButton1=new Button("秨﹍");
myButton1.addActionListener(this);
this.add(myButton1);
Button myButton2=new Button("既氨");
myButton2.addActionListener(this);
this.add(myButton2);
Button myButton3=new Button("膥尿");
myButton3.addActionListener(this);
this.add(myButton3);
}
public void start()
{
//创建线程
if(hThread==null)
hThread=new Thread(this);
//启动线程
}
public void actionPerformed(ActionEvent e)
{
if(e.getActionCommand()=="秨﹍")
{
//显示提示消息
label1.setText("眤翴诀琌:秨﹍");
hThread.start();
}
if(e.getActionCommand()=="既氨")
{
label1.setText("眤翴诀琌:既氨");
hThread.suspend();
}
if(e.getActionCommand()=="膥尿")
{
label1.setText("眤翴诀琌:膥尿");
hThread.resume();
}
}
public void run()
{
//线程run方法
while(true)
{
repaint();
try
{
//线程睡眠时间
hThread.sleep(20);
}
catch(InterruptedException e)
{}
}
}
public void paint(Graphics g)
{
for(int x1=0;x1<=x;x1++)
{
double y1=200.0+100.0*Math.sin((double)x1*Math.PI/180.0);
int x11=x1+1;
double y11=200.0+100.0*Math.sin((double)x11*Math.PI/180.0);
g.drawLine(x1,(int)y1,x11,(int)y11);
}
x++;
if(x>360)x=0;
double y=200.0+100.0*Math.sin((double)x*Math.PI/180.0);
g.drawLine(xx,yy,x,(int)y);
xx=x;
yy=(int)y;
}
public void stop()
{
hThread= null;
}
}
以前写的 小程序 希望对你有帮助吧
我的方法就是在paintComponent()函数的最后加两句话
Thread.sleep(50);
repaint();
起先我想用死循环还重画,结果程序死了,所以我加了一句休眠50ms,程序可以运行。我可以把我的paintComponent函数附给你。
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
int s=getSecond(),m=getMinute(),h=getHour(),w=getWidth(),ht=getHeight();
g.setColor(Color.BLACK);
//g.drawLine(0,0,300,200);
g.drawOval(w/2-100,ht/2-120,200,200);
if(m<=9&&s<=9)
g.drawString(h+":0"+m+":0"+s,w/2-23,ht/2+100);
else if(m<=9&&s>=10)
g.drawString(h+":0"+m+":"+s,w/2-23,ht/2+100);
else if(s<=9&&m>=10)
g.drawString(h+":"+m+":0"+s,w/2-23,ht/2+100);
else g.drawString(h+":"+m+":"+s,w/2-23,ht/2+100);
//画表盘
for(int i=1;i<=60;i++)
{
if(i%5==0)
{
g.drawLine((int)(w/2+100*Math.sin(i*2*Math.PI/60)),
(int)(ht/2-20-100*Math.cos(i*2*Math.PI/60)),
(int)(w/2+87*Math.sin(i*2*Math.PI/60)),
(int)(ht/2-20-87*Math.cos(i*2*Math.PI/60)));
if(i==15)
g.drawString(""+i/5,(int)(w/2+13+65*Math.sin(i*2*Math.PI/60)),
(int)(ht/2-15-65*Math.cos(i*2*Math.PI/60)));
if(i==30)
g.drawString(""+i/5,(int)(w/2-3+95*Math.sin(i*2*Math.PI/60)),
(int)(ht/2-30-95*Math.cos(i*2*Math.PI/60)));
if(i==45)
g.drawString(""+i/5,(int)(w/2+9+95*Math.sin(i*2*Math.PI/60)),
(int)(ht/2-14-95*Math.cos(i*2*Math.PI/60)));
if(i==60)
g.drawString(""+i/5,(int)(w/2-7+65*Math.sin(i*2*Math.PI/60)),
(int)(ht/2-28-65*Math.cos(i*2*Math.PI/60)));
if(i<15)
g.drawString(""+i/5,(int)(w/2+75*Math.sin(i*2*Math.PI/60)),
(int)(ht/2-20-71*Math.cos(i*2*Math.PI/60)));
else if (i>30&&i<45)
g.drawString(""+i/5,(int)(w/2+85*Math.sin(i*2*Math.PI/60)),
(int)(ht/2-18-85*Math.cos(i*2*Math.PI/60)));
else if(i>45&&i<60)
g.drawString(""+i/5,(int)(w/2+87*Math.sin(i*2*Math.PI/60)),
(int)(ht/2-20-70*Math.cos(i*2*Math.PI/60)));
else if(i>15&&i<30)
g.drawString(""+i/5,(int)(w/2+73*Math.sin(i*2*Math.PI/60)),
(int)(ht/2-20-87*Math.cos(i*2*Math.PI/60)));
continue;
}
g.drawLine((int)(w/2+100*Math.sin(i*2*Math.PI/60)),
(int)(ht/2-20-100*Math.cos(i*2*Math.PI/60)),
(int)(w/2+92*Math.sin(i*2*Math.PI/60)),
(int)(ht/2-20-92*Math.cos(i*2*Math.PI/60)));
}
// 画表针的轴和表针
g.fillOval(w/2-5,ht/2-25,10,10);
g.drawLine(w/2,ht/2-20,(int)(w/2+60*Math.sin((m*60+s)*2*Math.PI/3600)),(int)(ht/2-20-60*Math.cos((m*60+s)*2*Math.PI/3600)));
if(h>=12)
g.drawLine(w/2,ht/2-20,(int)(w/2+30*Math.sin(((h-12)*3600+m*60+s)*2*Math.PI/3600/12)),(int)(ht/2-20-30*Math.cos(((h-12)*3600+m*60+s)*2*Math.PI/3600/12)));
else
g.drawLine(w/2,ht/2-20,(int)(w/2+30*Math.sin((h*3600+m*60+s)*2*Math.PI/3600/12)),(int)(ht/2-20-30*Math.cos((h*3600+m*60+s)*2*Math.PI/3600/12)));
g.setColor(Color.RED);
g.fillOval(w/2-3,ht/2-23,6,6);
g.drawLine(w/2,ht/2-20,(int)(w/2+70*Math.sin(s*2*Math.PI/60)),(int)(ht/2-20-70*Math.cos(s*2*Math.PI/60)));
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
repaint();
}