【问题标题】:how to find out a java Component being displayed on screen如何找出屏幕上显示的java组件
【发布时间】:2012-03-07 13:47:59
【问题描述】:

我想知道 JPanel 是否在屏幕上。这并不意味着isVisible() 方法可以用于这种情况。我的意思是我想知道以前启动的组件现在是否是我主面板上的组件之一。

编辑和更多解释:我之前在我的程序中启动了几个面板,并根据需要在我的表单上使用它们。例如,我想知道现在出现在我的表单上的任何面板上的jpanel1

例子:

public class GUI extends JFrame() {

    private JPanel1, jPanel2;

    public static void main(String[] args) {
        GUI gui = new GUI();
        jPanel1 = new JPanel();
        jPanel2 = new JPanel();
        gui.setContentpane(jPanel1);
        gui.setVisible(true);
    }

}

现在jPanel1 在屏幕上可见但jPanel2 不可见。 我怎样才能知道这个?

【问题讨论】:

  • 是的,可以,请您用SSCCE 编辑您的问题,也许还有其他选择
  • 你的意思是 isShowing() 吗?:docs.oracle.com/javase/6/docs/api/java/awt/…
  • @mKorbel :很清楚,我按我的意思解释了。
  • @Guillaume PoletIt:我之前调查过,但没有找到我的目标
  • 如果组件是 setVisible(true) 但组件的边界在 JPanel 之外,因此用户实际上看不到它,会发生什么情况。 isVisibleisDisplayableisShowing 会输出什么?

标签: java swing user-interface


【解决方案1】:

经过调查,我发现这个方法代表组件是否显示在屏幕上:

isDisplayable()

在我的例子中:

jPanel1.isDisplayable() // 返回真

jPanel2.isDisplayable() // 返回错误

就这么简单!

【讨论】:

  • @mKorbel 所以我重新发明了轮子? :)
  • @deporter 我认为不是 :-),基本上你的答案是正确的,因为你必须时刻知道你的代码是什么,在哪里以及如何工作
  • @mKorbel 这不是轮子,它更像是一个三角形;-)
  • 在我的应用程序中,如果组件不在屏幕上,此方法会 NOT 返回 false。正确的调用方法是Component.isShowing()。我这么说,但我仍然不能确定isShowing() 是正确的方法,但我知道isDisplayable() 是不正确的。一旦有人验证了这一点并更新了答案,我就会取消我的反对票。
  • 如果组件是setVisible(true),但组件的边界在 JPanel 之外,因此用户实际上看不到它,会发生什么情况。 isVisibleisDisplayableisShowing 会输出什么?
【解决方案2】:

jPanel1.isVisible()==true jPanel1.isVisible()==false

用于面板 jPanel1.isShowing() 也可以

【讨论】:

  • 是的,isShowing() 适用于标签页中的组件
【解决方案3】:

如果您正在寻找主面板的子面板,您可以在主面板上调用 getComponents() 以返回其组件数组,然后遍历它们以检查其中是否有您正在寻找的面板.如果面板不是主面板的直接子面板,您可能需要递归调用它。

【讨论】:

  • 不先生。我之前在我的程序中启动了几个面板,并根据需要在我的表单上使用它们。例如,我想知道现在出现在我的表单上的任何面板上的 jpanel1。
【解决方案4】:

编写您自己的扩展JPanel 的面板类。向这个类添加一个名为 isOnTheScreen() 的新方法,它返回一个 boolean 指示面板是否添加到窗口中。

public class MyPanel extends JPanel
{
    boolean isAdded = false;

    public boolean isOnTheScreen()
    {
       return isAdded;
    }

    public void setOnTheScreen(boolean isAdded)
    {
       this.isAdded = isAdded;
    }
}

创建自己的面板对象后,使用上述方法了解面板是否添加到主面板/框架。假设您在框架中添加了一个面板:

JFrame frame = new JFrame()
MyPanel panel = new MyPanel();
frame.getContentPane().add(panel);
panel.setOnTheScreen(true);

将其添加到主屏幕后,在本例中为框架,调用setOnTheScreen(true) 同样,当您移除面板时调用setOnTheScreen(false)

在此设计之后,您可以通过在代码中的其他任何位置调用isOnTheScreen() 来确定是否将面板添加到主窗口。我希望这个设计对你有所帮助。

【讨论】:

  • 谢谢,但这不是一个很干净的方法。这很难在我的所有面板中应用。我添加了一个我的例子。请看
  • @sajad 这是一种非常干净的方式。如果你相信继承的力量,扩展 jpanel 应该不难。反正这只是一个建议,那你得另找办法了。
  • -1 a) 复制现有功能,只会更糟(需要从客户端代码调用才能生效) b) 如果不需要,不要子类化(应该不难 不是一个足够好的理由)。 @sajad 很好发现 :-)
猜你喜欢
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多