使用分层窗格在JLabel上方进行JPanel

时间:2013-08-15 20:14:47

标签: java swing layout-manager jlayeredpane

我有一个包含一堆小图标的JPanel,以及一个包含更大图标的JLabel。

首先,我需要澄清一些事情。如果不设置panel.isOpaque,则所述panel将具有透明背景,并且会正确覆盖我的JPanel和JLabel的图标。这是真的吗?

现在我的问题。我一直在关注Oracle网站上的LayeredPanes教程,我似乎无法在我的案例中做到正确。

    JFrame window = new JFrame();
    ImageIcon underIcon;
    URL urlUnder = myClass.class.getResource("images/underImage.gif");
    underIcon = new ImageIcon(urlUnder);
    JLabel labelUnder = new JLabel(underIcon);

    ImageIcon panelIcon;
    URL urlAbove = myClass.class.getResource("images/aboveImage.gif");
    panelIcon = new ImageIcon(urlAbove);
    JLabel aboveIcon1 = new JLabel(panelIcon);
    JLabel aboveIcon2 = new JLabel(panelIcon);

    JPanel panelAbove = new JPanel(new BorderLayout());
    panelAbove.setOpaque(false);
    panelAbove.add(aboveIcon1, BorderLayout.WEST);
    panelAbove.add(aboveIcon2, BorderLayout.EAST);

    JLayeredPane layeredPane = new JLayeredPane();

    layeredPane.setLayout(new BorderLayout());

    layeredPane.add(labelUnder, BorderLayout.CENTER, 1);
    layeredPane.add(panelAbove, BorderLayout.CENTER, 2);

    layeredPane.setOpaque(true);

    window.setContentPane(layeredPane);

    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.pack();
    window.setVisible(true);

我只看到面板的内容。而且我100%确定图像在getResource上,所以这不是问题。请提供有关如何正确使用分层窗格的建议。

2 个答案:

答案 0 :(得分:3)

问题是您要将布局管理器设置为JLayeredPane

layeredPane.setLayout(new BorderLayout());

在其中,这不是问题,但您选择的布局管理器是。

BorderLayout只会有一个组件占据其中任意一个5个预定位置。这意味着当您添加第二个组件时,它会有效地替换第一个组件。

尝试使用GridBagLayout之类的人。提供单个GridBagConstaint集,以使weightx/y值等于1,fill属性设置为BOTH,其gridx/y属性设置为{ {1}}

0不同,BorderLayout允许您将组件布局到同一位置

答案 1 :(得分:1)

来自Java Tutorial

layeredPane.add(dukeLabel, new Integer(2), 0);
  

此代码使用add方法的三参数版本。第三个参数指定Duke标签在其深度内的位置,它决定了组件与相同深度的其他组件的关系。

     

使用介于-1和(n - 1)之间的int指定位置,其中n是深度处的组件数。与层数不同,位置编号越小,其深度内的组件越高。 使用-1与使用n - 1相同;它表示最底部的位置。使用0指定组件应位于其深度内的最顶部位置。如下图所示,除-1外,较低的位置编号表示深度内的较高位置。

所以你的深度订单是错误的,也是从0开始。

我也在Solving Common Component Problems部分

中找到了这个
  

问题:我的分层窗格中的组件未正确分层。事实上,这些层似乎是倒置的 - 深度越低,组件越高。

     

如果在向分层窗格中添加组件时使用int而不是Integer,则会发生这种情况。要查看会发生什么,请在LayeredPaneDemo类中更改

layeredPane.add(label, new Integer(i));

layeredPane.add(label, i);.