【问题标题】:JLayeredPane. Dynamically change layer index of JPanelJLayeredPane。动态改变JPanel的图层索引
【发布时间】:2015-12-20 22:00:36
【问题描述】:

我正在使用 JLayeredPane 来定位我的 JPanel 3 维,这样当有人点击 jpanel 时我可以实现“缩放”效果,我需要动态更改图层索引,所以点击的组件总是在上面”。

JPanel jp = new JPanel();

JLayeredPane jlp = new JLayeredPane();
jlp.add(jp, new Integer(50));

这是我第一次放置 JPanel,但我怎样才能再次“到达”它并更改索引?

【问题讨论】:

  • 也许,您应该将组件保存在某种Map 中,与当前层相关联,或者将它们保存在某种List 中。您还可以使用JLayeredPane#getLayer 来获取它的当前布局。假设您使用的是MouseListenerMouseEvent 返回事件的source,但您可以使用getComponent 作为纵容。
  • 我将 JPanel 保存在一个列表中。但是层索引不是 JLayeredPane 对象的函数吗?
  • 所以你需要维护JLayeredPane的引用作为实例字段

标签: java swing focus jlayeredpane


【解决方案1】:

JLayeredPane 同时具有“层”和“位置”的概念。
您可以将所有组件放置在同一层上,但位置不同。
0 是层内的最顶部位置,-1 是最底部位置。
JLayeredPane 方法moveToFrontmoveToBacksetPosition 可用于在其层内重新定位组件。

以下是这种方法的示例,它将用户单击的组件置于最前面:

JLayeredPane pane = new JLayeredPane();
for (int i = 0; i < 4; i++) {
    JLabel lbl = new JLabel("Jlabel-"+(i+1));

    lbl.setOpaque(true);
    lbl.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            if (pane.getPosition(lbl) != 0) 
                pane.moveToFront(lbl);
        }
    });
    lbl.setFont(lbl.getFont().deriveFont(48f));
    lbl.setForeground(new Color(i*10, i*50, i*50));
    lbl.setBorder(new LineBorder(Color.BLACK, 2));
    lbl.setBounds(i*100, i*25, lbl.getPreferredSize().width, lbl.getPreferredSize().height);
    pane.add(lbl, 0, new Integer(i+1));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 2012-07-07
    • 1970-01-01
    • 2013-01-16
    • 2012-09-05
    • 1970-01-01
    相关资源
    最近更新 更多