鼠标画线条小程序

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方法(进行重绘)。

你可能感兴趣的:(java)