Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将WorldWindowGLJPanel重新添加到JFrame会导致GL视口计算错误_Java_Opengl_Jogl_Worldwind - Fatal编程技术网

Java 将WorldWindowGLJPanel重新添加到JFrame会导致GL视口计算错误

Java 将WorldWindowGLJPanel重新添加到JFrame会导致GL视口计算错误,java,opengl,jogl,worldwind,Java,Opengl,Jogl,Worldwind,如果将WorldWindowGLJPanel的实例添加到JFrame中,然后将其删除并再次添加,则面板的GL视口将重新计算为一个比可用空间小得多的矩形。尺寸似乎始终为116x26。这意味着框架大部分变成空白,只有一小块WorldWind面板显示在框架的左下角。调整帧大小似乎会重置视口,但是否有方法以编程方式重置视口 import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent

如果将WorldWindowGLJPanel的实例添加到JFrame中,然后将其删除并再次添加,则面板的GL视口将重新计算为一个比可用空间小得多的矩形。尺寸似乎始终为116x26。这意味着框架大部分变成空白,只有一小块WorldWind面板显示在框架的左下角。调整帧大小似乎会重置视口,但是否有方法以编程方式重置视口

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import gov.nasa.worldwind.Model;
import gov.nasa.worldwind.WorldWind;
import gov.nasa.worldwind.avlist.AVKey;
import gov.nasa.worldwind.awt.WorldWindowGLJPanel;

public class WorldWindTest {

    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final WorldWindowGLJPanel wwPanel = new WorldWindowGLJPanel();
        Model wwModel = (Model) WorldWind.createConfigurationComponent(AVKey.MODEL_CLASS_NAME);
        wwPanel.setModel(wwModel);
        JPanel buttons = new JPanel(new FlowLayout());
        buttons.add(new JButton(new AbstractAction("Re-add WorldWind panel") {
            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                frame.getContentPane().remove(wwPanel);
                frame.getContentPane().add(wwPanel);
                frame.getContentPane().repaint();
            }
        }));
        frame.getContentPane().add(buttons, BorderLayout.NORTH);
        frame.getContentPane().add(wwPanel);
        frame.setSize(800, 600);
        frame.setLocationRelativeTo(null);
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                frame.setVisible(true);
            }
        });
    }

}

派对迟到了4年半,但我发布了我的解决方案,因为我遇到这个问题时找不到解决方案

这个问题似乎与WorldWindowGLJPanel无关,我相信这是任何GLJPanel的问题

从其父级移除GLJPanel时,它会将其内部像素缩放重置为某些sentinel值。这就是为什么它变得很小,但仍能继续工作的原因

下面3行代码为我解决了这个问题(我将它们添加到层次结构侦听器中,并在父对象更改时调用它们,但您可以在按钮处理程序中将它们添加到上面的SSCCE中)

initializeBackend告诉OpenGL初始化未初始化的后端(不是100%确定是什么原因,但似乎与在父窗口之间移动有关)

“重塑”将覆盖那些像素比例哨兵值,因此它将实际计算出要显示的正确大小


重新验证会使它重新计算面板的大小,我相信这会启动大小计算,因为这些sentinel值没有碍事。

我实际上忘记了我在这里处理的问题。可能是某个我不再从事的项目。尽管如此,我真的很感谢你的回应。如果我再次遇到这个问题,我一定会测试它。听起来很简单,这很好。
                wwPanel.initializeBackend(false);
                wwPanel.reshape(0, 0, 0, 0);
                wwPanel.revalidate();