因为具体程序不清楚什么也没有猜想是不是setlayout的问题。
给你一个源程序参考一下。// Java core packages
import java.awt.*;
import java.awt.event.*;// Java extension packages
import javax.swing.*;public class SelfContainedPanel extends JPanel {
   private int x1, y1, x2, y2;   // set up mouse event handling for SelfContainedPanel
   public SelfContainedPanel()
   {
      // set up mouse listener
      addMouseListener(         // anonymous inner class for mouse pressed and 
         // released event handling
         new MouseAdapter() {            // handle mouse press event
            public void mousePressed( MouseEvent event )
            {
               x1 = event.getX();
               y1 = event.getY();
            }            // handle mouse release event
            public void mouseReleased( MouseEvent event )
            {
               x2 = event.getX();
               y2 = event.getY();
               repaint();
            }         }  // end anonymous inner class      ); // end call to addMouseListener      // set up mouse motion listener
      addMouseMotionListener(         // anonymous inner class to handle mouse drag events
         new MouseMotionAdapter() {
 
            // handle mouse drag event
            public void mouseDragged( MouseEvent event )
            {
               x2 = event.getX();
               y2 = event.getY();
               repaint();
            }         }  // end anonymous inner class      ); // end call to addMouseMotionListener   }  // end constructor   // return preferred width and height of SelfContainedPanel
   public Dimension getPreferredSize()
   {
      return new Dimension( 150, 100 );
   }   // paint an oval at the specified coordinates
   public void paintComponent( Graphics g )
   {
      super.paintComponent( g );      g.drawOval( Math.min( x1, x2 ), Math.min( y1, y2 ),
         Math.abs( x1 - x2 ), Math.abs( y1 - y2 ) );
   }}  // end class SelfContainedPanelimport java.awt.*;
import java.awt.event.*;// Java extension packages
import javax.swing.*;// Deitel packages
import SelfContainedPanel;public class SelfContainedPanelTest extends JFrame {
   private SelfContainedPanel myPanel;
   // set up GUI and mouse motion event handlers for 
   // application window
   public SelfContainedPanelTest()
   {
      // set up a SelfContainedPanel
      myPanel = new SelfContainedPanel();   
      myPanel.setBackground( Color.yellow );      Container container = getContentPane();
      container.setLayout( new FlowLayout() );
      container.add( myPanel );      // set up mouse motion event handling
      addMouseMotionListener(         // anonymous inner class for mouse motion event handling
         new MouseMotionListener() {            // handle mouse drag event
            public void mouseDragged( MouseEvent event )
            {
               setTitle( "Dragging: x=" + event.getX() +
                  "; y=" + event.getY() );
            }            // handle mouse move event
            public void mouseMoved( MouseEvent event )
            {
               setTitle( "Moving: x=" + event.getX() +
                  "; y=" + event.getY() );
            }         }  // end anonymous inner class      ); // end call to addMouseMotionListener      setSize( 300, 200 );
      setVisible( true );
   }   // execute application
   public static void main( String args[] )
   {
      SelfContainedPanelTest application =
         new SelfContainedPanelTest();      application.setDefaultCloseOperation(
         JFrame.EXIT_ON_CLOSE );
   }}  // end class SelfContainedPanelTest

解决方案 »

  1.   

    试下重载repaint
    或者用double buffering
      

  2.   

    你的第一个问题的原因可能是你的JPanel的宿主窗口(你是用JFrame吧!)中setVisible(true)写在setSize(a,b)之前所致.
    第二个问题没遇到过,不过你最好用BufferedImage这个类做一下缓冲,画图在图像上画,然后在paint方法中显示这个BufferedImage,这样子会好点.
      

  3.   

    通常不直接使用repaint,使用update。
      

  4.   

    代码很普通,就是在paint中画几条线,没有别的操作