JDK-4335162 : Graphics.drawLine() freezes in paint() in DoubleBuffer mode
  • Type: Bug
  • Component: client-libs
  • Sub-Component: 2d
  • Affected Version: 1.3.0
  • Priority: P3
  • Status: Closed
  • Resolution: Duplicate
  • OS: windows_nt
  • CPU: x86
  • Submitted: 2000-05-02
  • Updated: 2000-05-04
  • Resolved: 2000-05-04
Related Reports
Duplicate :  
Description

Name: krC82822			Date: 05/02/2000


2 May 2000, eval1127@eng -- reproducible with 1.3.0-C on NT 4.0 SP 6a.  Task Manager must be used to kill the process. 
(Works fine with double-buffering turned off.) 

java version "1.3.0rc3"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0rc3-Z)
Java HotSpot(TM) Client VM (build 1.3.0rc3-Z, mixed mode)

If we set a large x or y value for a point's coordinate, Graphics.drawLine()
freezes in the paint() method for Swing components in
DoubleBuffer mode (under Windows NT).

Try the following program :

If you run this DrawLineFreeze class, NT freezes after the JFrame becomes visible.
This happens when JPanel's paint() is invoked with DoubleBuffer mode
//----------------------------------------------------------
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

class DrawLineFreeze extends JFrame {
   JButton test1, test2;
    
   public static void main( String[] arg ){
      JFrame w = new DrawLineFreeze();
      w.setDefaultCloseOperation(3);
      w.setSize( 500, 500 );
      w.setVisible( true );
   }
   DrawLineFreeze(){
      FreezePanel panel = new FreezePanel();
      Container pane = getContentPane();
      pane.add( panel, BorderLayout.CENTER );
      
RepaintManager.currentManager(getRootPane()).setDoubleBufferingEnabled(true);
      
//RepaintManager.currentManager(getRootPane()).setDoubleBufferingEnabled(false);
   }

  class FreezePanel extends JPanel {
    public void paint( Graphics g ){
         g.drawLine( -100000, -100000, 100000, 100000 );
         g.drawLine( -100000, 100000, 500, 0 );
    }
  }
}
//---------------------------------------------------------------------------
(Review ID: 103963) 
======================================================================

Comments
WORK AROUND Name: krC82822 Date: 05/02/2000 Do not use DoubleBuffer mode in paint() on Swing components. ======================================================================
11-06-2004

EVALUATION It looks as if this is happening in 2D land, judging by the stack trace: Full thread dump: "Thread-1" prio=5 tid=0x779750 nid=0xde waiting on monitor [0..0x6fb38] "AWT-Windows" prio=5 tid=0x775a10 nid=0xe3 runnable [0x904f000..0x904fdc8] at sun.awt.windows.WToolkit.eventLoop(Native Method) at sun.awt.windows.WToolkit.run(WToolkit.java:186) at java.lang.Thread.run(Thread.java:484) "SunToolkit.PostEventQueue-0" prio=5 tid=0x774570 nid=0x120 waiting on monitor [0x900f000..0x900fdc8 ] at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:420) at sun.awt.PostEventQueue.run(SunToolkit.java:496) "AWT-EventQueue-0" prio=7 tid=0x773050 nid=0xe1 runnable [0x8fcf000..0x8fcfdc8] at sun.java2d.loops.ThreeByteRenderer.devDrawLine(Native Method) at sun.java2d.loops.BGR3DrawLineRasterContext.invoke(ThreeByteRenderer.java:226) at sun.awt.image.BufferedImageGraphics2D.drawLine(BufferedImageGraphics2D.java:626) at sun.java2d.pipe.ValidatePipe.drawLine(ValidatePipe.java:30) at sun.java2d.SunGraphics2D.drawLine(SunGraphics2D.java:1514) at DrawLineFreeze$FreezePanel.paint(DrawLineFreeze.java:27) at javax.swing.JComponent.paintChildren(JComponent.java:523) at javax.swing.JComponent.paint(JComponent.java:748) at javax.swing.JComponent.paintChildren(JComponent.java:523) at javax.swing.JComponent.paint(JComponent.java:748) at javax.swing.JLayeredPane.paint(JLayeredPane.java:546) at javax.swing.JComponent.paintChildren(JComponent.java:523) at javax.swing.JComponent.paint(JComponent.java:719) at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:23) at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:54) at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:91) at java.awt.Container.paint(Container.java:960) at sun.awt.RepaintArea.paint(RepaintArea.java:298) at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:193) at java.awt.Component.dispatchEventImpl(Component.java:2665) at java.awt.Container.dispatchEventImpl(Container.java:1213) at java.awt.Window.dispatchEventImpl(Window.java:912) at java.awt.Component.dispatchEvent(Component.java:2499) at java.awt.EventQueue.dispatchEvent(EventQueue.java:319) at java.awt.EventDispatchThread.pumpOneEvent(EventDispatchThread.java:103) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:84) "Signal Dispatcher" daemon prio=10 tid=0x768610 nid=0x14b waiting on monitor [0..0] "Finalizer" daemon prio=9 tid=0x7650a0 nid=0x10c waiting on monitor [0x8daf000..0x8dafdc8] at java.lang.Object.wait(Native Method) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:108) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:123) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:162) "Reference Handler" daemon prio=10 tid=0x765d70 nid=0xfc waiting on monitor [0x8d6f000..0x8d6fdc8] at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:420) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:110) "VM Thread" prio=5 tid=0x763030 nid=0x13e runnable "VM Periodic Task Thread I'm going to direct this their way brent.christian@eng 2000-05-03
03-05-2000