当前位置: 首页 > 面试题库 >

带有LayoutManager的JLayeredPane

戎亦
2023-03-14
问题内容

情况:像在纸牌游戏中一样,画一堆纸牌。堆好。

为实现此目的,我将JLayeredPane结合使用LayoutManager接口的自定义实现。使用自定义LayoutManager的原因是堆栈方向各不相同,有时纸牌彼此完全覆盖,有时彼此覆盖,而对于LayoutManager来说,此逻辑似乎是一项好工作,因为这基本上归结为设置布局的位置。牌。

因此,LayoutManager负责设置堆栈中所有组件的X和Y坐标。在JLayeredPane另一方面是负责他们的z坐标(通过其层)。

向组件添加组件JLayeredPane是这样的:

JLayeredPane pane = new JLayeredPane();
pane.setLayout(new StackLayout(...));
pane.add(new CardView(...), new Integer(j));

new Integer(j)卡的层在哪里。这一定是Integer由于的合同所致JLayeredPane

这里的问题是,由于上述原因,StackLayout除之外,我不能有任何其他约束对象Integer。该LayoutManager接口要求您实现以下方法:

addLayoutComponent(Component comp, Object constraints);

通过的Object在这里永远是一个Integer

在我的特殊情况下,我很幸运,因为我的XY坐标可以基于Z坐标进行计算。例如,层中的卡k必须位于Y坐标处k * offset。因此,在我的情况下,约束对象Integer是一个问题。

我想知道当Z坐标和XY坐标之间没有相关性时应该怎么做?那你怎么解决呢?例如,如何将a
GridBagLayout与a结合使用JLayeredPane,其中第一个需要一个GridBagConstraints对象,第二个需要一个Integer对象?当然,GBL的布局不会使组件重叠,但这仅是想法。


问题答案:

根据“气垫船充满鳗鱼”的评论,我将回答我自己的问题。

呼叫JLayeredPane.add(Component comp, Object constraints)将呼叫addImpl(Component comp, Object constraints, int index)。JLayeredPane本身会覆盖此方法,这是源:

protected void addImpl(Component comp, Object constraints, int index) {
    int layer;
    int pos;

    if(constraints instanceof Integer) {
        layer = ((Integer)constraints).intValue();
        setLayer(comp, layer);
    } else
        layer = getLayer(comp);

    pos = insertIndexForLayer(layer, index);
    super.addImpl(comp, constraints, pos);
    comp.validate();
    comp.repaint();
    validateOptimizedDrawing();
}

如您所见,该Integer对象被拦截,因此JLayeredPane知道comp应在其中放置的层。然后,它将constraintsInteger
传递给超级实现。超级实现的基本部分Container是:

protected void addImpl(Component comp, Object constraints, int index) {
    ...
    if (layoutMgr != null) {
        if (layoutMgr instanceof LayoutManager2) {
           ((LayoutManager2)layoutMgr).addLayoutComponent(comp, constraints);
        } else if (constraints instanceof String) {
           layoutMgr.addLayoutComponent((String)constraints, comp);
        }
    }
    ...
}

因此,解决方案是扩展JLayeredPane并覆盖其addImpl(Component comp, Object constraints, int index)方法,该方法可以接受您选择的任何对象:此对象应包含IntegerJLayeredPane的图层决策所需的对象,并且还应包含所选LayoutManager的约束对象。

StackConstraints:

public final class StackConstraints {
    public final int layer;
    public final Object layoutConstraints;
    public StackConstraints (int layer, Object layoutConstraints){
        this.layer = layer;
        this.layoutConstraints = layoutConstraints;
    }
}

JLayeredPane扩展:

protected void addImpl(Component comp, Object constraints, int index) {
    int layer;
    int pos;
    Object constr;
     if(constraints instanceof StackConstraints) {
        layer = constraints.layer.intValue();
        constr = ((StackConstraints) constraints).layoutConstraints;
        setLayer(comp, layer);
    } else {
        layer = getLayer(comp);
        constr = constraints;
    }

    pos = insertIndexForLayer(layer, index);
    super.addImpl(comp, constraints, pos);
    comp.validate();
    comp.repaint();
    validateOptimizedDrawing();

}



 类似资料:
  • 介绍 (Introduction) 界面LayoutManager用于为知道如何布置容器的类定义接口。 类声明 以下是java.awt.LayoutManager接口的声明: public interface LayoutManager 接口方法 (Interface methods) SN 方法和描述 1 void addLayoutComponent(String name, Compone

  • 介绍 (Introduction) 界面LayoutManager用于为知道如何布置容器的类定义接口。 Class 声明 (Class Declaration) 以下是java.awt.LayoutManager接口的声明 - public interface LayoutManager 接口方法 Sr.No. 方法和描述 1 void addLayoutComponent(String nam

  • layouts to remove blank spaces when a view is hidden equivalent to android View.GONE visibility mode.

  • 嗨,我在新的上遇到了一个问题

  • 创建一个 RecyclerView LayoutManager – Part 1 原文链接 : Building a RecyclerView LayoutManager – Part 1 原文作者 : Dave Smith 译文出自 : 开发技术前线 www.devtf.cn 译者 : tiiime 校对者: chaossss 状态 : 完成 本文是这个系列中的 Part 1,这里是 Part