鼠标画线条小程序

来源:互联网 发布:php视频教程全集 编辑:程序博客网 时间:2024/05/24 15:40
import java.awt.*;import java.awt.event.*;import javax.swing.*;public class DrawLine {public static void main(String[] args) {DrawLineFrame frame = new DrawLineFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}}class DrawLineFrame extends JFrame {public DrawLineFrame() {setTitle("DrawLineTest");setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);DrawLinePanel panel = new DrawLinePanel();Container contentPane = getContentPane();contentPane.add(panel);}public static final int DEFAULT_WIDTH = 250;public static final int DEFAULT_HEIGHT = 250;}class DrawLinePanel extends JPanel implements MouseListener {int x1, x2;int y1, y2;DrawLinePanel() {addMouseListener(this);}public void mouseClicked(MouseEvent event) {}public void mousePressed(MouseEvent event) {x1 = event.getX();y1 = event.getY();}public void mouseReleased(MouseEvent event) {x2 = event.getX();y2 = event.getY();repaint();// Graphics g=getGraphics();// g.setColor(Color.RED);// g.drawLine(x1,y1,x2,y2);}public void mouseEntered(MouseEvent event) {}public void mouseExited(MouseEvent event) {}public void paintComponent(Graphics g) {// super.paintComponent(g);// super.paintComponent(g)是否注释掉会产生不同的结果// 是父类JPanel里的方法,会把整个面板用背景色重画一遍,起到清屏的作用(恢复原状)g.setColor(Color.RED);g.drawLine(x1, y1, x2, y2);}}

 

好像把第18、19行注释掉

然后再加上add(panel);

也能得到相同的结果啊!

求知道的人解释下!

 


 与AWT组件不同,Swing组件不能直接添加到顶层容器中,它必须添加到一个与Swing顶层容器相关联的内容面板(content pane)上。
内容面板是顶层容器包含的一个普通容器,它是一个轻量级组件。
基本规则如下:
1、把Swing组件放入一个顶层Swing容器的内容面板上
2、避免使用非Swing的重量级组件。

super.paintComponent()这一句是调用了父类的方法,每次重绘(repaint())的时候,程序就会调用到自身的paintComponent()方法(它覆盖了父类的同名方法),这个程序在paintComponent方法中第一行就先调用了super.paintComponent进行界面重绘,那么就由父类先进行界面重绘(一般是恢复原状),父类重绘完之后,界面就恢复到某个界面,这时候才调用drawLine画出一条线。
在JDK中查到paintComponent()有"如果不调用超类的实现,则必须遵守不透明属性,也就是说,如果此组件是不透明的,则必须以透明的颜色完全填充背景。如果不遵守不透明属性,则很可能看到可视的人为内容。"
如果注释掉super.paintComponent()的话,那么这个类本身已经覆盖掉它的父类的paintComponent方法,
所以不会执行到它,界面需要重绘的时候,只是执行了drawLine方法(进行重绘)。