【问题标题】:How to make JPanel stay onTop (on z-axis), using setLayout(null)如何使用 setLayout(null) 使 JPanel 保持在顶部(在 z 轴上)
【发布时间】:2016-03-26 20:12:38
【问题描述】:

我有一个名为 Scene 的 JPanel,其中包括以下 JPanel: Frame, Projector, Tools.

我在Scene 上使用空布局,因为我想使用特定的坐标,所以没有其他布局适合我。我使用以下代码将 3 个 JPanel 添加到主 JPanel Scene

setLayout(null);
add(Tools);
add(Frame);
add(Projector);

我使用此顺序是因为我希望 Tools 始终位于顶部(在 z 轴上)。

现在,如果我在 Projector 中执行导致重绘的操作,则 Projector 会出现在其他层之上,隐藏 Tools。我可以使用线程重新绘制整个Scene JPanel,但是当Projector 出现在顶部并继续底部时,我看到了这个“闪光”,我不想这样做。

有什么想法吗?

【问题讨论】:

  • 这是个好问题,但更多代码会有所帮助。
  • 特别需要创建并发布minimal reproducible example。此外,不要认为“没有任何布局适合我”,因为这很可能正是您所需要的——一个体面的工作布局......但鉴于目前发布的信息很难说。
  • 预期的输出是什么??
  • 请注意,“在顶部”也是模棱两可的。如果你的意思是它应该放在其容器的上部位置,那么容器(这里是场景JPanel——注意变量名应该以小写字母开头,所以场景,而不是场景)应该使用BorderLayout,并且应该添加工具组件 BorderLayout.PAGE_START。如果“在顶部”是指它应该覆盖其他组件,那么如果要覆盖但显示底层组件,则需要使用 CardLayout 来交换组件或 JLayeredPane。
  • "but I think creating 3 JPanels is not that hard" -- 我同意,这是您的问题,也是您的问题,所以请务必使用 3 个 JPanel 创建您的小程序,并通过发布您的问题来帮助我们。努力的责任应该由承担,因为 1)这是您的问题,2)我们是志愿者。

标签: java swing jpanel repaint always-on-top


【解决方案1】:

如果您想将组件相对于其 z 轴放置在彼此之上,请考虑使用 JLayeredPane 作为主容器,然后使用将 Integer 作为其第二个参数的 add(...) 方法添加组件。最底层应该使用JLayeredPane.DEFAULT_LAYER 添加,我相信它是0。这将允许非oqaque 顶部组件通过它们显示较低的组件。

【讨论】:

  • 仍然需要重新绘制主容器才能让tools 再次出现在顶部
  • @GiannisTzagarakis:仍然需要创建并发布 minimal reproducible example,它为我们展示了这个问题。关于回答,我能做的就是使用你给我们的东西。
  • @GiannisTzagarakis Swing 布局在设计上是惰性的,它们允许您将许多组件添加到容器中,而无需更新容器层次结构或安排重绘,直到您告诉它这样做,这正是 API 的设计方式
  • 我用 4 个 JPanel 做了一个小程序,它工作得很好..也许 java 是在开玩笑..
  • @GiannisTzagarakis:不,这只是意味着您还没有隔离错误。继续添加代码,直到出现错误。
猜你喜欢
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多