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