下面这段程序是教科书上的一个例子,实现在Frame中的画直线的功能,程序在JRE1.5中可以正常运行,
而在JRE1.6中却不行,但编译和运行期间并不提示错误。不知是不是JRE1.6在这里加入什么新的特性还是怎么回事,
哪位高手能够指点一个是怎么回事,谢谢!!
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class MouseDemo extends JFrame implements MouseListener,MouseMotionListener{ int flag ;//flag = 1 代表 mouse move; flag = 2 代表 mouse dragged
int x = 0;
int y = 0;
int startX,startY,endX,endY;
public MouseDemo(){

// Container contentPane = getContentPane();//得到Frame的内容窗格 
// contentPane.addMouseListener(this);
// contentPane.addMouseMotionListener(this);
addMouseListener(this);
addMouseMotionListener(this);
// contentPane.setBackground(Color.white);
setBackground(Color.white);
setLocation(200,100);
setSize(300,300);
setVisible(true);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
setVisible(false);
System.exit(0);
}
});

}

public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub

} public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub

} public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
//System.out.println("I am going");
} public void mousePressed(MouseEvent e) {

startX = e.getX();
startY = e.getY();
} public void mouseReleased(MouseEvent e) {
endX = e.getX();
endY = e.getY();
repaint();
} public void mouseDragged(MouseEvent e) {
flag = 2;
x = e.getX();
y = e.getY();
repaint();
} public void mouseMoved(MouseEvent e) {
flag = 1;
x = e.getX();
y = e.getY();
repaint();
}

public void update(Graphics g ){
Color c = g.getColor();
g.setColor(this.getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(c);
paint(g); }

public void paint(Graphics g){
g.setColor(Color.black);

if(flag == 1){
g.drawString("鼠标坐标:(" + x + "," + y + ")",10,50);
g.drawLine(startX,startY,endX,endY);//here the parameter cann't be starX starY x y
}
if(flag == 2){
g.drawString("拖拽鼠标坐标:(" + x + "," + y + ")",10,50);
g.drawLine(startX,startY,x,y);
}
}

public static void main(String[] args){
new MouseDemo();

}
}

解决方案 »

  1.   

    public void paint(Graphics g)
    {
      super.paint(g);
      ....
    }增加如上的代码
      

  2.   

    把具体的问题说出来啊!
    下面这句是什么意思?为什么不能是 starX starY x y ?
    g.drawLine(startX,startY,endX,endY);//here the parameter cann't be starX starY x y 
    把具体的症状说出来。
      

  3.   

    这里的注释是我自己加的无关紧要,这段程序在JRE1.6中的问题update方法好像不起作用,
    线出的线会一直留在屏幕上,下次重画的时候不会被擦除。
      

  4.   

    楼主的意思是在JRE1.6中这段程序无法清屏后重画,我试了确实是这样,
    1楼的作法可以解决这个问题,不过主为什么在JRE1.5中不需要加入这行
    代码,java的这两个版本在这个地方到底有些差异,不知道1楼方不方便
    介绍一下,本人也在研究中!
      

  5.   

    import java.awt.*; 
    import java.awt.event.*; 
    import javax.swing.*; public class MouseDemo extends JFrame implements MouseListener,MouseMotionListener{ int flag ;//flag = 1 代表 mouse move; flag = 2 代表 mouse dragged 
    int x = 0; 
    int y = 0; 
    int startX,startY,endX,endY; 
    public MouseDemo(){ // Container contentPane = getContentPane();//得到Frame的内容窗格 
    // contentPane.addMouseListener(this); 
    // contentPane.addMouseMotionListener(this); 
    addMouseListener(this); 
    addMouseMotionListener(this); 
    // contentPane.setBackground(Color.white); 
    setBackground(Color.white); 
    setLocation(200,100); 
    setSize(300,300); 
    setVisible(true); 
    addWindowListener(new WindowAdapter(){ 
    public void windowClosing(WindowEvent e){ 
    setVisible(false); 
    System.exit(0); 

    }); } public void mouseClicked(MouseEvent e) { 
    // TODO Auto-generated method stub } public void mouseEntered(MouseEvent e) { 
    // TODO Auto-generated method stub } public void mouseExited(MouseEvent e) { 
    // TODO Auto-generated method stub 
    //System.out.println("I am going"); 
    } public void mousePressed(MouseEvent e) { startX = e.getX(); 
    startY = e.getY(); 
    } public void mouseReleased(MouseEvent e) { 
    endX = e.getX(); 
    endY = e.getY(); 
    repaint(); 
    } public void mouseDragged(MouseEvent e) { 
    flag = 2; 
    x = e.getX(); 
    y = e.getY(); 
    repaint(); 
    } public void mouseMoved(MouseEvent e) { 
    flag = 1; 
    x = e.getX(); 
    y = e.getY(); 
    repaint(); 
    } public void update(Graphics g ){ 
    Color c = g.getColor(); 
    g.setColor(this.getBackground()); 
    g.fillRect(0, 0, getWidth(), getHeight()); 
    g.setColor(c); 
    paint(g); } public void paint(Graphics g){ 
    g.setColor(Color.black); if(flag == 1){ 
    g.drawString("鼠标坐标:(" + x + "," + y + ")",10,50); 
    g.drawLine(startX,startY,endX,endY); 

    if(flag == 2){ 
    g.drawString("拖拽鼠标坐标:(" + x + "," + y + ")",10,50); 
    g.drawLine(startX,startY,x,y); 

    } public static void main(String[] args){ 
    new MouseDemo(); } 

     
     
      

  6.   

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;public class MouseDemo extends JFrame implements MouseListener,
    MouseMotionListener { int flag;// flag = 1 代表 mouse move; flag = 2 代表 mouse dragged
    int x = 0;
    int y = 0;
    int startX, startY, endX, endY; public MouseDemo() { // Container contentPane = getContentPane();//得到Frame的内容窗格
    // contentPane.addMouseListener(this);
    // contentPane.addMouseMotionListener(this);
    addMouseListener(this);
    addMouseMotionListener(this);
    // contentPane.setBackground(Color.white);
    setBackground(Color.white);
    setLocation(200, 100);
    setSize(300, 300);
    setVisible(true);
    addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    setVisible(false);
    System.exit(0);
    }
    }); } public void mouseClicked(MouseEvent e) {
    // TODO Auto-generated method stub } public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub } public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub
    // System.out.println("I am going");
    } public void mousePressed(MouseEvent e) { startX = e.getX();
    startY = e.getY(); } public void mouseReleased(MouseEvent e) {
    endX = e.getX();
    endY = e.getY();
    repaint();
    } public void mouseDragged(MouseEvent e) {
    flag = 2;
    x = e.getX();
    y = e.getY();
    repaint();
    } public void mouseMoved(MouseEvent e) {
    flag = 1;
    x = e.getX();
    y = e.getY();
    repaint();
    } public void update(Graphics g) {
    Color c = g.getColor();
    g.setColor(this.getBackground());
    g.fillRect(0, 0, getWidth(), getHeight());
    g.setColor(c);
    paint(g); } public void paint(Graphics g) {
    g.setColor(Color.black); if (flag == 1) {
    g.drawString("鼠标坐标:(" + x + "," + y + ")", 10, 50);
    g.drawLine(startX, startY, endX, endY);// here the parameter cann't
    // be starX starY x y
    }
    if (flag == 2) {
    g.drawString("拖拽鼠标坐标:(" + x + "," + y + ")", 10, 50);
    g.drawLine(startX, startY, x, y);
    }
    } public static void main(String[] args) {
    new MouseDemo(); }
    }
      

  7.   

    import java.awt.*; 
    import java.awt.event.*; 
    import javax.swing.*; public class MouseDemo extends JFrame implements MouseListener, 
    MouseMotionListener {     int flag;// flag = 1 代表 mouse move; flag = 2 代表 mouse dragged 
        int x = 0; 
        int y = 0; 
        int startX, startY, endX, endY;     public MouseDemo() {         addMouseListener(this); 
            addMouseMotionListener(this);         setBackground(Color.white); 
            setLocation(200, 100); 
            setSize(300, 300); 
            setVisible(true); 
            addWindowListener(new WindowAdapter() { 
                             public void windowClosing(WindowEvent e) { 
                                 setVisible(false); 
                                 System.exit(0); 
                             } 
                          });     }     public void mouseClicked(MouseEvent e) { 
             // TODO Auto-generated method stub     }     public void mouseEntered(MouseEvent e) { 
             // TODO Auto-generated method stub     }     public void mouseExited(MouseEvent e) { 
            // TODO Auto-generated method stub 
            // System.out.println("I am going"); 
        }     public void mousePressed(MouseEvent e) {        startX = e.getX(); 
           startY = e.getY();     }     public void mouseReleased(MouseEvent e) { 
            endX = e.getX(); 
            endY = e.getY(); 
            repaint(); 
        }     public void mouseDragged(MouseEvent e) { 
            flag = 2; 
            x = e.getX(); 
            y = e.getY(); 
            repaint(); 
        }     public void mouseMoved(MouseEvent e) { 
            flag = 1; 
            x = e.getX(); 
            y = e.getY(); 
            repaint(); 
        }     public void update(Graphics g) { 
            Color c = g.getColor(); 
            g.setColor(this.getBackground()); 
            g.fillRect(0, 0, getWidth(), getHeight()); 
            g.setColor(c); 
            paint(g);     }     public void paint(Graphics g) { 
            g.setColor(Color.black);         if (flag == 1) { 
               g.drawString("鼠标坐标:(" + x + "," + y + ")", 10, 50); 
               g.drawLine(startX, startY, endX, endY);// here the parameter cann't 
            // be starX starY x y 
            } 
            if (flag == 2) { 
               g.drawString("拖拽鼠标坐标:(" + x + "," + y + ")", 10, 50); 
               g.drawLine(startX, startY, x, y); 
            } 
        }     public static void main(String[] args) { 
             new MouseDemo();     } 
    }
      

  8.   

    repaint()是不清除显示区域的问题
    重写paint方法时是推荐先调用container中的paint方法的,国外的权威书籍说不加这句话在处理复杂的程序时会出错。

    public void paint(Graphics g) 

      super.paint(g); 
      .... 
    } 看了paint方法的原码还是没弄太懂,还将继续研究