【问题标题】:Using GridBagLayout in a JLayeredPane在 JLayeredPane 中使用 GridBagLayout
【发布时间】:2011-10-12 23:10:40
【问题描述】:

我试图在 JPanel 的右上角有一个小型浮动“小部件”。它是一个固定大小的组件 - 如果有帮助,请考虑一下 google maps 视图中的指南针。

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

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

谁能提出一种伪装这种行为的方法?

【问题讨论】:

  • 确切的结果是什么?您可以发布一些(示例)代码来解决问题吗?也许还有截图?
  • 是的,请发帖SSCCE

标签: java swing layout gridbaglayout jlayeredpane


【解决方案1】:

或者,考虑javax.swing.OverlayLayout。可以在herehere 中找到示例。 here 显示了一个说明对齐约束的示例; JLabel 仍位于面板下半部分的中心:

label.setAlignmentX(0.5f);
label.setAlignmentY(0.75f);

[

【讨论】:

    【解决方案2】:

    这是一个分层窗格,因此每个层都可以有一个容器,如果需要,它使用自己的布局。我根本不会给 JLayeredPane 本身任何布局,而是使用其默认的空布局,然后考虑将小型浮动小部件放在使用所需任何布局的透明(非透明)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://upload.wikimedia.org/" +
            "wikipedia/commons/c/c4/Maps-for-free_Sierra_Nevada.png";
       public static final String COMPASS_URL = "http://upload.wikimedia.org/" +
            "wikipedia/commons/thumb/f/f8/Compass_Rose_English_North.svg/" +
            "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();
             }
          });
       }
    }
    

    【讨论】:

    • +1 overlain image 是半透明的,与默认的 AlphaComposite.SRC_OVER 规则完美融合。
    • 哇,这真是太完美了。谢谢!
    • @Goren:不客气!祝您的项目和 Java 教育好运!
    猜你喜欢
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    相关资源
    最近更新 更多