我有一个包含一堆小图标的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
上,所以这不是问题。请提供有关如何正确使用分层窗格的建议。
答案 0 :(得分:3)
问题是您要将布局管理器设置为JLayeredPane
layeredPane.setLayout(new BorderLayout());
在其中,这不是问题,但您选择的布局管理器是。
BorderLayout
只会有一个组件占据其中任意一个5个预定位置。这意味着当您添加第二个组件时,它会有效地替换第一个组件。
尝试使用GridBagLayout
之类的人。提供单个GridBagConstaint
集,以使weightx/y
值等于1
,fill属性设置为BOTH
,其gridx/y
属性设置为{ {1}}
与0
不同,BorderLayout
允许您将组件布局到同一位置
答案 1 :(得分:1)
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);.