如果我将一个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);
}
});
}
}
答案 0 :(得分:1)
聚会晚了四年半,但是发布了我的解决方案,因为遇到这个问题时找不到。
这个问题似乎与WorldWindowGLJPanel无关,我相信这与任何GLJPanel都有关。
从父级中删除GLJPanel时,它将其内部像素缩放比例重置为某些前哨值。这就是为什么它变得很小,但仍继续工作的原因。
以下3行代码为我修复了该问题(我将它们添加到层次结构侦听器中,并在父项更改时调用它们,但是您可以在按钮处理程序中将它们添加到上面的SSCCE)
wwPanel.initializeBackend(false);
wwPanel.reshape(0, 0, 0, 0);
wwPanel.revalidate();
initializeBackend告诉OpenGL初始化后端(如果未初始化)(不是100%确定是什么原因造成的,但似乎与在父窗口之间移动有关)。
“重塑”将覆盖那些像素比例的前哨值,因此它将实际上计算出要显示的适当大小。
Revalidate使它重新计算面板的大小,由于那些前哨值不碍眼,因此我相信这会启动大小计算。