在JLayeredPane中使用GridBagLayout

我试图在JPanel的右上角有一个小的浮动“小部件”。 它是一个固定大小的组件 – 如果有帮助的话,可以考虑谷歌地图中的指南针。

我意识到JLayeredPane只对所有层使用一个布局管理器,因此认为使用GBL成功: – 使右上角(1,0)框非常小并将窗口小部件放在那里 – 使内容面板具有宽度/身高2

但经过实验,似乎GBL在重叠时会删除一些组件。

任何人都可以建议一种伪造这种行为的方法吗?

它是一个分层窗格,因此每个层都可以有一个容器,如果需要,它可以使用自己的布局。 我不会给JLayeredPane本身任何布局,而是使用其默认的null布局,然后考虑将小浮动小部件放在透明(非透明)JPanel中,使用任何所需的布局,并将透明JPanel添加到鞋面JLayeredPane的一层。

例如,此代码将指南针的图像放在非不透明JPanel的右上角,该JPanel分层显示在显示浮雕贴图的JLabel上:

import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import javax.imageio.ImageIO; import javax.swing.*; @SuppressWarnings("serial") public class LayeredExample extends JLayeredPane { public static final String MAP_URL = "http://sofzh.miximages.com/java/Maps-for-free_Sierra_Nevada.png"; public static final String COMPASS_URL = "http://sofzh.miximages.com/java/   200px-Compass_Rose_English_North.svg.png"; private Dimension imageSize; private JLabel defaultLabel = new JLabel(); private JPanel palettePane = new JPanel(); private JLabel compassLabel = new JLabel(); public LayeredExample() { try { URL mapUrl = new URL(MAP_URL); BufferedImage mapImage = ImageIO.read(mapUrl); ImageIcon mapIcon = new ImageIcon(mapImage); defaultLabel.setIcon(mapIcon); URL compassUrl = new URL(COMPASS_URL); BufferedImage compassImage = ImageIO.read(compassUrl); ImageIcon compassIcon = new ImageIcon(compassImage); compassLabel.setIcon(compassIcon); imageSize = new Dimension(mapImage.getWidth(), mapImage.getHeight()); setPreferredSize(imageSize); defaultLabel.setSize(imageSize); defaultLabel.setLocation(0, 0); palettePane.setSize(imageSize); palettePane.setLocation(0, 0); JPanel northPalettePane = new JPanel(new BorderLayout()); northPalettePane.setOpaque(false); northPalettePane.add(compassLabel, BorderLayout.EAST); palettePane.setOpaque(false); palettePane.setLayout(new BorderLayout()); palettePane.add(northPalettePane, BorderLayout.NORTH); add(defaultLabel, JLayeredPane.DEFAULT_LAYER); add(palettePane, JLayeredPane.PALETTE_LAYER); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private static void createAndShowUI() { JFrame frame = new JFrame("LayeredExample"); frame.getContentPane().add(new LayeredExample()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { createAndShowUI(); } }); } } 

或者,考虑javax.swing.OverlayLayout 。 以下是一些例子 。