Пример Java Swing JPanel, ошибка GLCanvas

public class Activator implements BundleActivator {

TestFrame testFrame = new TestFrame();

public static JPanel graphPanel;

public void start(BundleContext context) throws Exception {


        graphPanel = cartesianGraphs.getGraphPanel();


        testFrame.getPanel1().add(graphPanel);

        testFrame.setVisible(true);
    } 
}



public class TestFrame extends JFrame {

private static final long serialVersionUID = 1L;

private library kutuphane = null;

private JPanel contentPane;
private JTabbedPane tabbedPane;
private JPanel panel1;
private JButton btn;


public TestFrame() {
    initComponents();
}

private void initComponents() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 800, 600);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setContentPane(contentPane);
    contentPane.add(getTabbedPane(), BorderLayout.CENTER);
    contentPane.add(getBtn(), BorderLayout.NORTH);
}



public JPanel getPanel1() {
    if (panel1 == null) {
        panel1 = new JPanel();
        panel1.setLayout(new BoxLayout(panel1, BoxLayout.Y_AXIS));
    }
    return panel1;
}

private JButton getBtn() {
    if (btn == null) {
        btn = new JButton("Remove All and Add");
        btnTabSil.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {


                TestFrame.this.getPanel1().removeAll();
                Activator.graphPanel.revalidate();

                 // where it throws the exception is below
                TestFrame.this.getPanel1().add(Activator.graphPanel);
                TestFrame.this.revalidate();
                TestFrame.this.repaint();
                TestFrame.this.setVisible(true);
            }
        });
    }
    return btn;
}

}

В приведенном выше классе активатора я добавляю графическую панель (JPanel) в (JPannel) testFrame.getPanel1 () Затем с помощью кнопки в классе testFrame я использовал метод removeAll() и снова добавил статический graphPannel, но я получил ошибку ниже.

Когда я отлаживаю его, я вижу, что GLcanvas теряет пира. Я не мог найти решение.

Исключение в потоке "Thread-3". Java.lang.RuntimeException: javax.media.opengl.GLException: невозможно создать временный контекст OpenGL для контекста устройства 0xffffffffde01148b в jogamp.common.awt.AWTEDTExecutor.invoke(AWTEDTExecutor.java:58) в jogamp.opengl.awt.AWTThreadingPlugin.invokeOnOpenGLThread(AWTThreadingPlugin.java:103) в jogamp.opengl..media.opengl.Threading.invoke(Threading.java:191) в javax.media.opengl.awt.GLCanvas.display(GLCanvas.java:449) в grafik.view.grafik.Gcontroller.draw(Gcontroller.java:169) на grafik.model.data.Dcontroller.drawAll(Dcontroller.java:272) на grafik.view.Wcontroller.GdataClean(Wcontroller.java:261) на grafik.view.WThread.run(WThread.java:57). Вызывается: javax.media.opengl.GLException: Невозможно создать временный контекст OpenGL для контекста устройства 0xffffffffde01148b в jogamp.opengl.windows.wgl.WindowsWGLContext.createImpl(WindowsWGLContext.java:306) по адресу jogamp.opengl.GLContextImpl.makeCurrentWithinLock(GLContextImpl.java:572) по адресу jogamp.opengl.GLContextImpl.makeCurrent(GLContextImpl.jelH.ImpHIJGIJGWG:48)) в jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:594) в javax.media.opengl.awt.GLCanvas$8.run(GLCanvas.java:996) в java.awt.event.InvocationEvent.dispatch(неизвестно) на java.awt.EventQueue.dispatchEventImpl(неизвестный источник) на java.awt.EventQueue.access$300(неизвестный источник) на java.awt.EventQueue$3.run(неизвестный источник) на java.awt.EventQueue$3.run(неизвестный источник)) в java.security.AccessController.doPrivileged(собственный метод) в java.security.ProtectionDomain$1.doIntersectionPrivilege(неизвестный источник) в java.awt.EventQueue.dispatchEvent(неизвестный источник) в java.awt.EventDispatchThreadFort (неизвестный). в java.awt.EventDispatchThread.pumpEventsForFilter(Неизвестный источник) в java.awt.EventDispatchThread.pumpEventsForHierarchy(неизвестный источник) на java.awt.EventDispatchThread.pumpEvents(неизвестный источник) на java.awt.EventDispatchThread.pumpEvents(неизвестный источник) на java.awt.EventDispatchThread.run(неизвестный источник)

1 ответ

Пожалуйста, переключитесь на JOGL 2.3.1. Затем замените "javax.media" на "com.jogamp", чтобы избежать ошибок компиляции.

Когда вы удаляете AWT GLCanvas из родительского контейнера, он теряет одноранговый узел и его контекст OpenGL уничтожается. Это то, что вы не можете избежать при использовании этого вида холста. Переключитесь на NEWT, если это не желаемое поведение.

Создание другого контекста может произойти сбой в некоторых конкретных случаях на некоторых аппаратных. Если вы все еще получаете ту же трассировку стека с последней версией JOGL, заполните отчет об ошибке: http://jogamp.org/wiki/index.php/Jogl_FAQ

Другие вопросы по тегам