【问题标题】:Swing Overlapping components摆动重叠组件
【发布时间】:2010-11-28 12:43:12
【问题描述】:

我在一个框架中有两个 AWT 组件,面板 A 和面板 B。我希望面板 A 的大小调整为框架的高度宽度(并在调整框架大小时保持该大小),但我希望面板 B重叠 A. B 将位于具有固定高度和宽度的固定位置(0,0 以使其更容易)。我不确定我需要什么样的布局管理器才能完成这项工作。如果我使用空布局,我想我必须自己管理面板 A 的大小调整,但这会使面板 B 的大小调整相对容易。关于如何实现这一点的任何想法?

谢谢, 杰夫

【问题讨论】:

  • 您说面板 A 的宽度应该与框架的宽度相匹配,那么它的高度呢?
  • 是的,基本上我想让 A 填满整个 Frame,包括高度和宽度。

标签: java swing layout


【解决方案1】:

看看JLayeredPanesHere is a tutorial.

编辑:

如果 panelA 是 AWT 组件,您将很难让 panelB 重叠。摘自 Sun 题为Mixing Heavy and Light Components的文章:

不要在容器中混合轻量级 (Swing) 和重量级 (AWT) 组件,因为轻量级组件与重量级组件重叠。

但是,如果您希望 panelA 完全填充 Frame,为什么不将 panelB 添加为 panelA 的组件?

编辑2:

如果您可以让 panelB 成为重量级组件,那么您可以使用JLayeredPane

这是一个快速的模型,展示了如何:

public static void main(String[] args){
    new GUITest();
}

public GUITest() {
    frame = new JFrame("test");
    frame.setSize(300,300);
    addStuffToFrame();
    SwingUtilities.invokeLater(new Runnable(){
        public void run() {
            frame.setVisible(true);
        }
    });

}       

private void addStuffToFrame() {    
    Panel awtPanel = new Panel();
    awtPanel.setBackground(Color.blue);
    //here you can fool around with the pane:
    //first, you can see how the layered pane works by switching the 
    //DEFUALT_LAYER and PALLETTE_LAYER back and forth between the two panels
    //and re-compiling to see the results
    awtPanel.setSize(200,300);
    frame.getLayeredPane().add(awtPanel, JLayeredPane.DEFAULT_LAYER);
    //next you comment out the above two lines and 
    //uncomment the following line. this will give you the desired effect of
    //awtPanel filling in the entire frame, even on a resize. 
    //frame.add(awtPanel);

    Panel awtPanel2 = new Panel();
    awtPanel2.setBackground(Color.red);
    awtPanel2.setSize(300,200);
    frame.getLayeredPane().add(awtPanel2,JLayeredPane.PALETTE_LAYER);
}   

【讨论】:

  • 我应该提到 JPanel A 实际上是一个 AWT 组件,我的错。我会编辑帖子。
  • 我也可以制作 B AWT,没有问题。问题是 PanelA(我无法控制)不是容器,因此它没有 add 方法。我只想将它们都添加到某个父容器中,但这就是我不确定如何正确布置它们的地方,因此 A 填充了整个容器,但 B 只填充了其中的一部分。
  • 抱歉,暂时离开了。稍后我会检查一下,如果可行,请投票/接受。谢谢!
  • 我并没有真正想到将 JLayeredPane 与 AWT 组件一起使用,但这很有效,谢谢。
【解决方案2】:

最好的办法是拥有自己的 LayoutManager。最简单的方法大概就是扩展或者代理BorderLayout,对布局面板B有具体的案例。

【讨论】:

    【解决方案3】:

    也许我错过了什么。如果 B 是固定大小并且位于 (0,0) 并且 A 运行全宽度,那么 B 与 A 重叠有什么用?你永远不会看到放在 B 下的任何东西。

    我想不出任何默认的布局管理器,但 Orielly 有这个你可以使用: relative layout manager(见源代码链接)和documentation。好久没用了,不过应该比自己管理布局好。

    【讨论】:

    • 最终我会让 B 不固定,以便它可以移动到不同的位置。在第一遍中,我只是将其保持在 0,0。不过你是对的,我不会看到 B 覆盖的那部分,但没关系。屏幕空间非常宝贵,而 B 很小,所以我宁愿掩盖 A 的一小部分,也不愿使用 BorderLayout 之类的东西并浪费我不会使用的大部分屏幕。
    猜你喜欢
    • 1970-01-01
    • 2016-04-26
    • 2015-02-04
    • 2014-01-16
    • 2013-04-20
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多