可能是你的对话的拥有者有问题吧
你得JOptionPane.showConfirmDialog(Owner,Message,...);
是不是Owner就是你得画图的面板,就是this,如果这样的话,你改成
其他的实验一下。再就是你得Paint()方法和PaintComponent()方法,这两个方法,可能有问题
没有代码也无法确定。

解决方案 »

  1.   

    没有重绘,肯定是抹掉了,建议把绘图的代码写到PAINT事件里!!这样窗口被遮盖后再显示就会发生该事件,进行绘图!!
      

  2.   

    可能jackkui说的第一个原因吧,我试试看
      

  3.   

    同意jackkui的看法,可能是你的取消按钮把图形对象给dispose了
    另外,一闪而过可能是因为你绘制的图形的作用域就是监听器的作用域吧
      

  4.   

    to jackkui:  我是自己用布局管理器建的一个对话框(用来进行规格说明的),不是用JOptionPane.showConfirmDialog(Owner,Message,...);得到的对话框呀
       to cuizm:   我是把绘图的代码写到paint事件里的呀   伪码如下:
         注明:paintpane是放在JScrollPane里的,另外窗口中还有其他很多控件
         
         JPanel paintpane=new JPanel(){
             public void paint(Graphics g){
       super.paint(g);
                //绘图代码
    }
         };
         paintpane.addMouseListener(new MouseListener(){
    public void mousePressed(MouseEvent e){
    }
    public void mouseReleased(MouseEvent e){
    }
    public void mouseClicked(MouseEvent e){
                MyDialog dialog=new MyDialog();
                dialog.setLocation(int,int);
                dialog.show();
    }
    public void mouseEntered(MouseEvent e){
    }
    public void mouseExited(MouseEvent e){
    }
         }
         );
         Class MyDialog extends JDialog{
            public MyDialog(){
               ...
            }
            .
            .
            .
         }
     
      

  5.   

    to flyingbug 那怎么使绘制的图形的作用域不是监听器的作用域,而是全局的呢?
      

  6.   

    建议你覆盖paintComponent方法,而不是paint方法
      

  7.   

    to:楼上的
    我认为应该是覆盖paint方法,在其中调用paintComponent方法
      

  8.   

    如果用标量图,就不会存在这些问题了,是矢量图的话,每次都得repaint用数组存下来的每个矢量图型,估计你出现的问题应该还是在这个repaint的过程中,或者就是没有在一些关键地方之后加一个repaint()方法,它会自动paint那些已有图形的。
      

  9.   

    to:楼主
    你的图形是在哪里声明的呢?
    我觉得你的问题出现在paint方法里调用的super.paint(g);
    你试试这样成不成:
            g.drawRect(0,0, this.getWidth(), this.getHeight());
            this.paintChildren(g);这个paint是每次你的窗口被遮住再出现(包括从别的窗口切换回来)都会被调用的
      

  10.   

    “如果在“取消”的响应函数中绘制一条直线,结果则是直线一闪而过,马上又恢复原来的情况了”这个原因很简单,应该是你没有保存下来这个新画的线,你一repaint后,就没有它了,估计你应该画的是矢量图吧,如果你的目的不是一个画图程序,而只是简单画个图,那么建议你画标量图,也就是将你要画的图形画到一个image上,然后在paint()中将这个image给画出来,
      

  11.   

    to flyingbug
      我是这样做的:每类图形元素都为之建立了一个类,选择了要画的图形元素后就调用该类的draw()方法将图画出来,然后将这个对象保存到一个Vector的对象protocol中,这个protocol是全局的静态变量,我有一个reDraw()方法,功能是将protocol中的所有对象的draw()方法都调用一遍,即把画出来的图形重新绘制,我贴出来的代码paint(Graphics g)方法中的“//绘图代码”实际上就是调用该类的reDraw()方法
       另外paintChildren(g)方法好象不可视呀,我的绘图面板重载了这个方法,但是好象也不起什么作用啊  to Bluecatr
      我在一些地方用了paintpane.repaint();但是好象不起作用啊,所以我干脆用上面说的reDraw()方法重绘图形了
      你所说的将画的图形画到一个image上,然后在paint()中将这个image画出来,这是不是就是用到了双缓冲啊
      

  12.   

    paintChildren(g)重载这个方法没错,但是在这个方法中得些绘制语句阿,什么都不写当然不管用了
      

  13.   

    是的,这是顺带用到了双缓冲,另外你用的是矢量图的概念,所以你看看你画完的那条线,是否存入到你得那个vector中了,还有不要调用太多你的那个reDraw方法,仔细检查你的逻辑才好