【问题标题】:How to put JFrame into existing JPanel in Java Swing?如何将 JFrame 放入 Java Swing 中现有的 JPanel?
【发布时间】:2012-10-17 04:27:32
【问题描述】:

我有一个像这样的开源 java swing 应用程序: http://i47.tinypic.com/dff4f7.jpg

在截图中可以看到,有一个JPanel,分为左右两个区域。左侧区域有许多文本链接。当我点击SLA Criteria链接时,会弹出SLA Criteria窗口。弹出的窗口是JFrame对象。

现在,我正在尝试将弹出窗口放入 JPanel 的右侧区域,这意味着不再有弹出窗口,即当我单击 SLA 标准 链接时,它的内容将显示在 JPanel 的右侧区域。 JPanel 右侧区域的现有内容将不再使用。该概念与 java api 文档页面中的概念相同:http://docs.oracle.com/javase/6/docs/api。您点击左侧框架中的链接,您将获得在右侧框架中显示的内容。

示例图是这样的:

(注意:它是使用图像编辑器制作和编辑的,这不是工作应用程序的真实截图)

http://i48.tinypic.com/5vrxaa.jpg

那么,我想知道有没有办法将 JFrame 放入 JPanel 中?

我正在考虑使用 JInternalFrame,可以吗?还是有别的办法?

更新:
源码:
http://pastebin.com/tiqRbWP8(VTreePanel.java,这是左右分区的面板)
http://pastebin.com/330z3yuT(CPanel.java,这是VTreePanel的超类,也是JPanel的子类)
http://pastebin.com/MkNsbtjh(AWindow.java,这是弹出窗口)
http://pastebin.com/2rsppQeE(CFrame.java,这是AWindow的超类,也是JFrame的子类)

【问题讨论】:

标签: java swing jframe jpanel


【解决方案1】:

您想要嵌入框架的内容,而不是尝试嵌入框架。

我可以看到(至少)一个问题。

菜单栏由框架的RootPane 控制。

为你自己创建一个新的JPanel。将其布局设置为BorderLayout。

从框架中获取菜单栏(使用JFrame#getJMenuBar)并添加到新面板的北方位置。

获取框架ContentPane并将其添加到面板的中心位置。

毫无疑问,您在尝试执行此操作时会遇到无数其他特定于应用程序的问题...

【讨论】:

    【解决方案2】:

    不,您不想“将 JFrame 放入 JPanel”,并且您上面的插图也没有说明这一点。相反,它在另一个窗口的顶部(而不是内部)显示一个从属窗口。如果您绝对需要显示一个新的从属窗口,我建议您创建并显示一个 JDialog。教程将解释如何执行此操作,或者如果您在尝试发布代码时遇到困难,我们将帮助您解决此问题。


    编辑 1
    你说:

    我需要从弹出窗口样式转换为 jpanel 内容样式。这就像java api文档页面样式:docs.oracle.com/javase/6/docs/api 当您单击左框架中的文本时,它不会显示任何弹出窗口,对吗?内容直接显示在右边框。所以这基本上是我的目标。源代码相当大。如果可能,我会尝试粘贴源代码。

    您正在寻找的是在 JList 或 JTable 中简单地实现 MouseListener,并在响应单击时根据所做的选择获取内容。这与在 JPanel 中放置 JFrame 无关,而是与编写正确的程序逻辑有关。同样,在模态 JDialog 中显示它——但这对于您编写正确的非 GUI 逻辑是次要的。你真的在这里吠错了树。忘掉 JFrame,暂时忘掉 JPanel,而是专注于如何在单击 SLA 标准数据时提取它。


    编辑 2
    我想我明白了你想要做什么——而不是 JFrames 和 JDialogs,使用 JPanel 并使用 CardLayout 交换它们,这将允许你交换 views。

    【讨论】:

    • 我需要从弹窗样式转换为jpanel内容样式。就像java api文档页面样式:docs.oracle.com/javase/6/docs/api当你点击左框中的文字时,它没有任何弹出,对吧?内容直接显示在右边框。所以这基本上是我的目标。源代码相当大。如果可能,我会尝试粘贴源代码。
    • 我已经发布了源代码(虽然只有相关的类,如果需要我可以添加更多)。那么您是否建议正确的方法是获取弹出窗口的内容而不是在 jpanel 中托管弹出窗口?然后我也不了解 JDialog 部分,您的意思是使用 JDialog 是某种技巧,因此 JDialog 看起来像是覆盖了面板的正确区域?
    • @suud:啊,我想我明白你在做什么了——而不是 JFrames 和 JDialogs,使用 JPanel 并使用 CardLayout 交换它们。
    • 好的,我会尝试了解 CardLayout 的工作原理,看看是否可以针对这种情况实现。
    • 好像我需要得到弹出窗口的内容面板不管是否使用CardLayout,就像MadProgrammer说的那样。
    【解决方案3】:

    我浏览了源代码,我看到 AWindow.java 有一个内部面板 (APanel.java) 来保存窗口的内容,它还有一个公共方法来返回内容面板对象 (getAPanel())。有了这个,我可以用它来获取窗口的内容到其他容器中。

    最后,我决定在 VTreePanel 的右侧区域使用 JTabbedPane 来显示弹出窗口的内容。

    【讨论】:

      【解决方案4】:

      您不能将 Jframe 放入 JPanel。相反,您应该尝试创建一个具有 JFrame 等功能的单独面板并将其嵌入到您的 JPanel 中。 因为您可以将 JPanel 放入另一个 JPanel 但不能将 JFrame 放入另一个 JPanel

      【讨论】:

        猜你喜欢
        • 2011-05-25
        • 2015-07-06
        • 1970-01-01
        • 2012-03-27
        • 1970-01-01
        • 1970-01-01
        • 2013-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多