下面这段程序是教科书上的一个例子,实现在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();
}
}
而在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();
}
}
{
super.paint(g);
....
}增加如上的代码
下面这句是什么意思?为什么不能是 starX starY x y ?
g.drawLine(startX,startY,endX,endY);//here the parameter cann't be starX starY x y
把具体的症状说出来。
线出的线会一直留在屏幕上,下次重画的时候不会被擦除。
1楼的作法可以解决这个问题,不过主为什么在JRE1.5中不需要加入这行
代码,java的这两个版本在这个地方到底有些差异,不知道1楼方不方便
介绍一下,本人也在研究中!
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(); }
}
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(); }
}
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(); }
}
重写paint方法时是推荐先调用container中的paint方法的,国外的权威书籍说不加这句话在处理复杂的程序时会出错。
即
public void paint(Graphics g)
{
super.paint(g);
....
} 看了paint方法的原码还是没弄太懂,还将继续研究