1

如果我将 WorldWindowGLJPanel 的实例添加到我的 JFrame 中,然后将其删除并再次添加,则面板的 GL 视口将重新计算为比可用空间小得多的 Rectangle。尺寸似乎始终为 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

1 回答 1

1

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

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

当您从其父级移除 GLJPanel 时,它会将其内部像素缩放重置为某些标记值。这就是为什么它变得很小,但继续(排序)工作。

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

                wwPanel.initializeBackend(false);
                wwPanel.reshape(0, 0, 0, 0);
                wwPanel.revalidate();

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

Reshape 将覆盖这些像素比例标记值,因此它实际上会计算要显示的正确大小。

重新验证会导致它重新计算面板的大小,我相信这会启动大小计算,因为这些哨兵值不会妨碍您。

于 2020-12-03T19:33:05.137 回答