ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 在JLayeredPane中使用GridBagLayout

2019-07-26 08:12:18  阅读:234  来源: 互联网

标签:gridbaglayout java layout swing jlayeredpane


我试图在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://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();
         }
      });
   }
}

标签:gridbaglayout,java,layout,swing,jlayeredpane
来源: https://codeday.me/bug/20190726/1542255.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有