[vtkusers] Java remove vtkImageViewer2 not working

Jim Peterson jimcp at cox.net
Fri Dec 3 17:54:32 EST 2010


Jonathan,
I am able to reproduce your problem, I made a minor change so that one 
image would be vertical lines and one horizontal, scrolling the image 
sizes as a test of the viewer interactor makes the two horizontal line 
images ambiguous. I still believe we are hitting the different 
interactor window for renderer problem. I believe a correct swap would 
need to be by switching the images being rendered, and leave the 
renderer associated with the frame it was created upon. You will notice 
that the top panel loses its data when you zoom. I believe this is the 
problem noted in this error message that would occur in a similar swap 
using C++:

                  "Attempting to call MakeCurrent for a different window"
                  " than the one doing the picking, this can causes crashes"
                  " and/or bad pick results"

My understanding is that the Viewer is an interactor with the render 
window, and my test does show bad pick resullts.

I believe you are trying to simplify VTK Java beyond its limits, In all 
things we should make them as simple as possible, but no simpler. I 
think if you swap the input to the renderwindow instead of swapping the 
panels, you will achieve the same result without the vtk errors.
Maybe Seb can provide some related insight in using the viewer approach 
in Java.
Hope that helps,
Jim

Jonathan Morra wrote:
> I apologize for the length of this example (it's a little long), but 
> it is totally self contained and shows my the error that I'm having. 
>  Please let me know if you need any more information, or the tweaks to 
> make what I have work.
>
> import vtk.*;
> import javax.swing.*;
> import java.awt.event.*;
> import java.awt.*;
>
> public class VTKSwingError {
>     static {
>         System.loadLibrary("vtkCommonJava");
>         System.loadLibrary("vtkFilteringJava");
>     }
>
>     static JPanel topPanel;
>     static JPanel bottomPanel;
>     static JFrame frame;
>
>     // This is just creating two different images so we can tell when 
> they're swapped
>     public static JPanel createImagePanel(boolean useMod0) {
>         vtkImageData image = new vtkImageData();
>         image.SetSpacing(1, 1, 1);
>         image.SetOrigin(0, 0, 0);
>         image.SetExtent(0, 511, 0, 511, 0, 0);
>         image.AllocateScalars();
>         for (int x=0; x<512; x++)             for (int y=0; y<512; y++) {
>                 if ((useMod0 && y%2 == 0) || (!useMod0 && y%2 == 1))
>                     image.SetScalarComponentFromDouble(x, y, 0, 0, 1);
>             }
>         }
>         vtkRenderWindowPanel renWin = new vtkRenderWindowPanel();
>         renWin.setInteractorStyle(new vtkInteractorStyleImage());
>         vtkImageViewer2 imageViewer = new vtkImageViewer2();
>         imageViewer.SetInput(image);
> imageViewer.SetColorLevel(0.5);
> imageViewer.SetColorWindow(1);
>         imageViewer.SetSliceOrientationToXY();
>         imageViewer.SetSlice(1);
>         imageViewer.SetRenderWindow(renWin.GetRenderWindow());
>         imageViewer.GetRenderer().ResetCamera();
>
>         JPanel renWinPanel = new JPanel(new BorderLayout());
>         renWinPanel.add(renWin, BorderLayout.CENTER);
>         return renWinPanel;
>     }
>
>     public static void main(String[] args) {
>         topPanel = new JPanel(new BorderLayout());
>         topPanel.setMinimumSize(new Dimension(400, 200));
>         topPanel.setPreferredSize(new Dimension(400, 200));
>         topPanel.add(createImagePanel(true), BorderLayout.CENTER);
>
>         bottomPanel = new JPanel(new BorderLayout());
>         bottomPanel.setMinimumSize(new Dimension(400, 200));
>         bottomPanel.setPreferredSize(new Dimension(400, 200));
>         bottomPanel.add(createImagePanel(false), BorderLayout.CENTER);
>
>         JButton switchButton = new JButton("Switch Panels");
>         switchButton.addActionListener(new ActionListener() {
>             public void actionPerformed(ActionEvent e) {
>                 // This is where VTK is going haywire
>                 Component oldTop = topPanel.getComponent(0);
>                 Component oldBottom = bottomPanel.getComponent(0);
>
>                 topPanel.remove(oldTop);
>                 bottomPanel.remove(oldBottom);
                topPanel.add(oldBottom, BorderLayout.CENTER);
>                 bottomPanel.add(oldTop, BorderLayout.CENTER);
>                 frame.getContentPane().validate();
>                 frame.getContentPane().repaint();
>             }
>         });
>
>         frame = new JFrame();
>         frame.getContentPane().setLayout(new BorderLayout());
>         frame.getContentPane().add(topPanel, BorderLayout.NORTH);
>         frame.getContentPane().add(bottomPanel, BorderLayout.CENTER);
>         frame.getContentPane().add(switchButton, BorderLayout.SOUTH);
>         frame.setSize(400, 400);
>         frame.setLocationRelativeTo(null);
>         frame.setVisible(true);
>     }
> }
>
>
> On Thu, Dec 2, 2010 at 8:10 PM, Jim Peterson <jimcp at cox.net 
> <mailto:jimcp at cox.net>> wrote:
>
>     Jonathan Morra wrote:
>
>
>         I have a java swing JPanel that contains another JPanel that
>         contains a vtkRenderWindowPanel which is hooked up to a
>         vtkImageViewer2. In the course of my program I want to remove
>         the inner JPanel from the outer JPanel with JPanel.remove(). I
>         then want to add the inner JPanel to a different outer JPanel.
>         However when I do this VTK throws the following exception
>
>         ERROR: In ..\..\src\Rendering\vtkWin32OpenGLRenderWindow.cxx,
>         line 247
>         vtkWin32OpenGLRenderWindow (00000004C8E4830): wglMakeCurrent
>         failed in MakeCurrent(), error: The handle is invalid.
>
>         This seems like a very simple swing operation that I'm trying
>         to do, but it's failing. Does anyone know what I'm doing wrong?
>         Thanks
>
>     Jonathan,
>     you do understand that the vtk classes are JNI interfaces to the
>     shared library version of vtk. I suspect you are causing Java to
>     free resources that are still referenced by the memory
>     instantiated by the still active structures outside Java in vtk.
>     Without an example it is pretty hard to try to visualize the java
>     and native system memory from your description. What you are doing
>     might be sensible with all java objects, but when JNI objects are
>     involved memory references may not be as clear as desired. are not
>     always completely in sync.
>     Chances are if you coded the same kind of operation in C++ the
>     make current routine would have detected the different potential
>     interaction source and issued this message: (from the
>     MakeCurrent() function in vtkWin32OpenGLRenderWindow.Cxx)
>
>       if(this->IsPicking && current)
>         {
>         vtkErrorMacro("Attempting to call MakeCurrent for a different
>     window"
>                       " than the one doing the picking, this can
>     causes crashes"
>                       " and/or bad pick results");
>         }
>
>     Unless you want to post an example, I would say "If it hurts,
>     don't do that".
>
>     Hope that helps,
>     Jim
>
>
>




More information about the vtkusers mailing list