我正在使用Swing GUI的MigLayout库。
我想覆盖两个JPanel,因此:
+----+-----------------------+
| 1 | 2 |
| | |
+----+ |
| |
| |
| |
| |
+----------------------------+
很像电子游戏中的小地图。
在我看来,有两种方法可以实现这一点:
JLayeredPane
JPanel main = new JPanel();
main.setBounds(0, 0, WIDTH, HEIGHT);
// ... fill it with Swing components ...
JPanel minimap = new JPanel();
minimap.setBounds(10, 10, 100, 100);
/// ... fill it with Swing components ...
JLayeredPane layer = new JLayeredPane();
layer.add(main, new Integer(0));
layer.add(minimap, new Integer(1));
然而,这种方法是脆弱的,因为我必须指定WIDTH
和HEIGHT
。如果调整了窗口的大小,那么我似乎必须再次计算这些值。
JLayeredPane&MigLayout
JPanel main = new JPanel();
// ... fill it with Swing components ...
JPanel minimap = new JPanel();
/// ... fill it with Swing components ...
JLayeredPane layer = new JLayeredPane();
layer.setLayoutManager(new MigLayout());
CC positioning;
positioning = // ??? something specified in percents and z-order?
layer.add(main, positioning, new Integer(0));
positioning = // ??? something specified in percents and z-order?
layer.add(minimap, positioning, new Integer(1));
是否可以在定位代码中填充允许使用MigLayout覆盖的内容,同时让我指定百分比值(与第一个示例中的像素分辨率WIDTH
和HEIGHT
相反)?
编辑:
以下是部分有效的解决方案:
positioning = new CC().width("100%").height("100%");
// ...
positioning = new CC().pos("10", "10");
但是,显示器会抖动,有时是不可见的。我相信这与不确定的渲染顺序有关(尽管这只是直觉)。
我也尝试过setComponentZOrder,但这似乎对没有任何影响
我不知道MigLayout在幕后是如何工作的,但我认为ZOrder很重要。
看看Overlap Layout,它使用ZOrder来布置组件,并对我对ZOrder的工作原理有一点了解。
文章中提到的isOptimizedDrawingEnabled()方法也很重要。在这种情况下,