首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

为什么不能动态的画图,该如何解决

2012-01-20 
为什么不能动态的画图packagechapter8importjava.awt.*importjava.awt.geom.*importjava.awt.event.*i

为什么不能动态的画图
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.*;
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();
}

热点排行