我写的一个类K继承了JPanel,
当最大化最小化或移出屏幕后,我用repaint()画的东西就不见了,只剩下paint()中的背景了,
怎么才能保留repaint()中画的东西呢?

解决方案 »

  1.   

    这说明你没用到JPanel中的双缓冲.在paintComponent(...)这个函数中调用super.paintComponent(...)就行了,但是在开始调用还是在这个函数结束处调用,对于不同的情况下可能有些不同,但大多数情况下是在函数结束处调用。
      

  2.   

    paintComponent(Graphics g)方法具体怎么用呢?是不是还得把paint() 中的代码重写一遍呢?
    我还不太清楚,谢谢!
      

  3.   

    不用重写,而且有一点要注意,当你使用的是JPanel后,以后的图形绘制都应该在paintComponent(...)这个函数中进行,因为这个函数系统直接给我们实现了双缓冲,而从JPanel从Panel继承过来的paint(...)函数没有双缓冲这个功能,如果要用这个函数,得我们自己去实现双缓冲,就是在paint中先把所以要画的东西画到一个imageBuffer上,然后再一次直接调用draw函数,把这个imageBuffer一下子全部画到屏幕上去。paintComponent的用法:
    protected void paintComponent(Graphics g) {...//你的绘制代码super.paintComponent(g); //这个函数调用是让系统为我们实现双缓冲
    }
      

  4.   

    我的程序是棋盘上画棋子。我在鼠标点击棋盘时,
    就调用repaint(0,column*40,row*40,40,40)方法绘棋子我把paint(Graphics g) 改成了paintComponent(Graphics g),但是就棋盘也显示不出来了。是不是还得改repaint()方法呢?
      

  5.   

    用paintComponent都能显示了,但最大化后,棋子又不见了,
    super.paintComponent(g);这一句我写在绘制代码的前边。
      

  6.   

    这还是说明双缓冲还没实现,super.paintComponent(g);这一句写在绘制代码的后面才行。
      

  7.   

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.awt.geom.*;public class JF extends JFrame { public JF() {
    Container container = this.getContentPane();
    container.add(new MyPanel()); this.setSize(400, 400);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    } /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    JF jf = new JF();
    jf.setVisible(true);
    }}class MyPanel extends JPanel {
    double x, y, w, h;
    int x1, y1, x2, y2;
    Ellipse2D ellipse;
    Ellipse2D selectedShape;
    Rectangle2D boundingRec;
    int count = 0; public MyPanel() {
    x = 20;
    y = 20;
    w = 100;
    h = 75;
    setBackground(Color.white);
    } protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2D = (Graphics2D) g;
    ellipse = new Ellipse2D.Double(x, y, w, h);
    g2D.draw(ellipse);

    System.out.println(count++); //super.paintComponent(g);
    }
    }
    很久都没写Java程序了,现在一直在用OpenGL,所以写了一个很烂的程序,但是能够很好的式作,在最大化和最小化后图形都能正常显示。
      

  8.   

    public void paintComponent(Graphics g)
    {
    super.paintComponent(g);
    //绘制棋盘
    for(int row=0;row<8;row++)
    {
    for(int column=0;column<8;column++)
    {
    g.setColor(knight[row][column].backColor);
    g.fillRect(knight[row][column].x, knight[row][column].y, 40, 40);
    }
    }

    //绘制棋子
    if(column2>=0 && column2<8 && row2>=0 && row2<8)
    {
    if(step==0 //判断走棋是否为马字形
    || ((java.lang.Math.abs(column2-stepX[step-1])+java.lang.Math.abs(row2-stepY[step-1]))==3) 
    && (column2!=stepX[step-1]) 
    && (row2!=stepY[step-1]) 
    )
    {
    stepX[step]=column2;
    stepY[step]=row2;
    step++; knight[row2][column2].setNotEmpty(); //标记该处已走过棋子

    g.setColor(Color.WHITE);
    g.fillOval(knight[row2][column2].x+10, knight[row2][column2].y+10, 20, 20);
    }
    }