【问题标题】:JPanel above JLabel using Layered Panes使用分层窗格的 JLabel 上方的 JPanel
【发布时间】:2013-08-15 20:14:47
【问题描述】:

我有一个 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 上,所以这不是问题。请就如何正确使用分层窗格提出建议。

【问题讨论】:

  • 您使用的是 IDE,如果是,是哪一个?我最近遇到了类似的问题,也许可以提供帮助。
  • @JeremyJohnson:我正在使用 Netbeans 自动取款机。
  • 您是否将“images”文件夹设置为源文件夹?
  • 如果你想对这个问题投反对票,也请给 OP 一个解释。单靠反对票并不能阻止您不赞成的行为。

标签: java swing layout-manager jlayeredpane


【解决方案1】:

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

layeredPane.setLayout(new BorderLayout());

就其本身而言,这不是问题,但您选择的布局管理器是。

BorderLayout 将只有一个组件占据它的 5 个预定义位置中的任何一个。这意味着当您添加第二个组件时,它实际上会替换第一个。

尝试改用GridBagLayout 之类的人。提供单个GridBagConstaint 集,使weightx/y 值ara 等于1,填充属性设置为BOTHgridx/y 属性设置为0

BorderLayout 不同,GridBagLayout 将允许您将组件布局到相同位置

【讨论】:

  • 我明白了。我只是诚实地猜测它是否会起作用。我会查看GridBagLayout(还没有搞砸)并回来寻求更多反馈。
【解决方案2】:

来自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);.

【讨论】:

  • 这不是确切的问题,但也感谢您指出这个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多