VtkRenderWindowInteractor没有启动并导致程序冻结[java]

时间:2015-08-04 06:24:28

标签: java vtk

我最近在我的VTK Java程序中实现了剪辑。我使用BoxWidget来控制应该剪裁的内容。但是,我遇到了附加到BoxWidget的vtkRenderWindowInteractor的问题。该程序冻结在renderWindowInteractor.Start()声明中(我已在我的代码中对其进行了评论)。

这是我的重新模拟代码:

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import vtk.*;

public class VTKWindowInteractor extends JPanel {

    static {
        if (!vtkNativeLibrary.LoadAllNativeLibraries()) {
            for (vtkNativeLibrary lib : vtkNativeLibrary.values()) {
                if (!lib.IsLoaded()) {
                    System.out.println(lib.GetLibraryName() + " not loaded");
                }
            }
            System.out.println("Make sure the search path is correct: ");
            System.out.println(System.getProperty("java.library.path"));
        }
        vtkNativeLibrary.DisableOutputWindow(null);
    }

    private vtkPanel renWin;
    private vtkRenderWindowInteractor renderWindowInteractor;
    private vtkPolyDataMapper mapper;
    private vtkActor coneActor;
    private vtkPlanes planes;
    private vtkBoxWidget boxWidget;

    public VTKWindowInteractor() {
        setLayout(new BorderLayout());
        renWin = new vtkPanel();
        add(renWin, BorderLayout.CENTER);
        renWin.setMinimumSize(new Dimension(50, 50));
        renWin.GetRenderer().SetBackground(0, 0, 0); // black
        renWin.GetRenderWindow().AddRenderer(renWin.GetRenderer());
    }

    public void render() {

        mapper = new vtkPolyDataMapper();
        vtkConeSource cone = new vtkConeSource();
        cone.SetHeight(3.0);
        cone.SetRadius(1.0);
        cone.SetResolution(10);

        mapper.SetInputConnection(cone.GetOutputPort());
        coneActor = new vtkActor();
        coneActor.SetMapper(mapper);

        renWin.GetRenderer().AddActor(coneActor);

        planes = new vtkPlanes();
        renderWindowInteractor = new vtkRenderWindowInteractor();
        renderWindowInteractor.SetRenderWindow(renWin.GetRenderWindow());
        boxWidget = new vtkBoxWidget();
        boxWidget.SetInteractor(renderWindowInteractor);
        boxWidget.SetPlaceFactor(1.25);
        boxWidget.PlaceWidget(coneActor.GetBounds());
        boxWidget.AddObserver("InteractionEvent", this, "executeClipping");
        renderWindowInteractor.Initialize();
        boxWidget.On();
        renWin.Render();
        renWin.resetCamera();
        /**************************************/
        // This is where the freeze come from //
        //                                   //
        /************************************/
        renderWindowInteractor.Start(); // if i comment out this line, the program works but the boxWidget cannot be resized or rescale or moved
    }

    public void executeClipping() {
        planes = new vtkPlanes();
        boxWidget.GetPlanes(planes);
        mapper.SetClippingPlanes(planes);
        planes.Delete();
    }

    public static final int WINDOW_WIDTH = 1000;
    public static final int WINDOW_HEIGHT = 500;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                VTKWindowInteractor _vtkRendererPanel = new VTKWindowInteractor();

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setTitle("......");
                frame.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
                frame.setVisible(true);
                frame.setLayout(new BorderLayout());
                frame.add(_vtkRendererPanel);
                _vtkRendererPanel.render();
            }
        });
    }
}

我一直在发现我的错误数小时而且感到沮丧因此来到这里寻求帮助。如果有人经历过这个或知道我做错了什么,请纠正我。谢谢!!!

VTK版本:6.2.0

1 个答案:

答案 0 :(得分:1)

行。我终于解决了这个问题。以下是vtkPanel.java

的引用
  

/ *   *
  * Java AWT组件,封装vtkRenderWindow,vtkRenderer,vtkCamera,
  * vtkLight。
  *
  *如果需要vtkInteractor,请改用vtkCanvas。这是必要的   *使用小工具和选择器   *
  * @author Kitware * /

所以我改变了我的

vtkPanel

vtkCanvas

&安培;

renderWindowInteractor = new vtkRenderWindowInteractor();

renderWindowInteractor = renWin.getRenderWindowInteractor(); 它解决了这个问题。

谢谢,这对于将来会面临类似问题的人来说。