4

私は、JPanelの右上にある種の小さなフローティング「ウィジェット」を配置しようとしています。これは固定サイズのコンポーネントです。役立つ場合は、Googleマップの一種のビューでコンパスを考えてみてください。

JLayeredPaneはすべてのレイヤーに1つのレイアウトマネージャーしか使用しないことを認識しているため、GBLの使用は成功すると考えました。-右上(1、0)ボックスを非常に小さくし、そこにウィジェットを配置します-コンテンツパネルの幅を大きくします/高さ2

しかし、実験した後、GBLはそれらがオーバーラップするときにいくつかのコンポーネントを削除するようです。

誰かがこの行動を偽造する方法を提案できますか?

4

2 に答える 2

6

これは階層化されたペインであるため、必要に応じて、各レイヤーに独自のレイアウトを使用するコンテナーを含めることができます。JLayeredPane自体にレイアウトを与えるのではなく、デフォルトのnullレイアウトを使用してから、小さなフローティングウィジェットを、必要なレイアウトを使用する透明な(不透明でない)JPanelに配置し、透明なJPanelを上部に追加することを検討します。 JLayeredPaneのレイヤー。

たとえば、このコードは、浮き彫り地図を示すJLabelの上に重ねられた不透明でないJPanelの右上隅にコンパスの画像を配置します。

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();
         }
      });
   }
}
于 2011-07-25T23:22:00.107 に答える
4

または、を検討してjavax.swing.OverlayLayoutください。例はここここにあります。配置の制約を示す例をここに示します。JLabelパネルの下半分の中央に残っているもの:

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

[画像

于 2011-07-26T00:25:30.990 に答える