读书人

JPanel为什么不重绘?该如何解决

发布时间: 2012-01-07 21:41:55 作者: rapoo

JPanel为什么不重绘?
/**
*
*/
package test;

import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;

import java.awt.event.MouseMotionListener;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

/**
* @author zjy
*
*/
public class CrossTest {

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
CrossFrame frame = new CrossFrame();
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setVisible(true);

}

}

class CrossFrame extends JFrame {
public CrossFrame() {
// TODO 自动生成构造函数存根
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension dm = tk.getScreenSize();
WIDTH = dm.width;
HEIGHT = dm.height;

setTitle( "CrossTest ");
setSize(WIDTH / 2, HEIGHT / 2);
setLocation(WIDTH / 4, HEIGHT / 4);

CrossPanel panel = new CrossPanel(WIDTH, HEIGHT);
Container con = getContentPane();
con.add(panel);

}

private int WIDTH;

private int HEIGHT;
}

class CrossPanel extends JPanel {
public CrossPanel(double w, double h) {
// TODO 自动生成构造函数存根
frameHeight = h;
frameWidth = w;

addMouseMotionListener(new MouseCross());
setFocusable(true);
}

@Override
public void paint(Graphics g) {
// TODO 自动生成方法存根
super.paintComponents(g);
Graphics2D g2 = (Graphics2D) g;

Line2D lineH, lineV;
Point2D PointH1, PointH2, PointV1, PointV2;

PointH1 = new Point2D.Double(0.0, y);
PointH2 = new Point2D.Double(frameWidth, y);
lineH = new Line2D.Double(PointH1, PointH2);

PointV1 = new Point2D.Double(x, 0.0);
PointV2 = new Point2D.Double(x, frameHeight);
lineV = new Line2D.Double(PointV1, PointV2);

String str = "Current Position is: " + x + ', ' + y;


g2.drawString(str, 10, 10);
g2.draw(lineV);
g2.draw(lineH);

}



private double x;

private double y;

private double frameWidth;

private double frameHeight;

private class MouseCross implements MouseMotionListener {

public void mouseMoved(MouseEvent event) {
// TODO 自动生成方法存根
x = event.getX();


y = event.getY();
repaint();
}

public void mouseDragged(MouseEvent e) {
// TODO 自动生成方法存根
}

}

}



[解决办法]
swing 重绘用的方法是 JComponent 里的 paintComponent(Graphics g)
你所用的paint 是AWT里的绘图方法 是Component里的
你把paint 改成paintComponent 就行了

还有就是要重绘前先清除 swing已经实现了双缓冲 所以不用担心闪屏

读书人网 >J2SE开发

热点推荐