2

我完成了大学分配给我的项目,但现在我正在尝试为我的项目创建 MDI。我使用了 10 个 jFrame 和一个也是 jFrame 的主窗体,之后我添加了一个菜单栏、10 个用于调用 jFrame 的 jButton 和一个用于调用 jFrame 的 jDesktopPane。以下代码用于在所有 10 个 jButton 中调用 jFrame 放置到 jDesktopPane 中:

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
      try
      {
        asd t = new asd();
        dskp.add(t);
        t.setVisible(true);

      }
      catch(Exception ex)
      {
          JOptionPane.showMessageDialog(null, ex);
      }
    } 

但不与我合作并给出以下错误消息:

java.lang.illegalargumentexception: adding a window to a container

如何执行此操作并解决此问题,因为我没有使用任何 jInternal Frame。我认为此时我无法使用 jInternale Frame,因为我在 jFrame 上完成了所有工作,例如带有代码的完整 GUI,并在 jInternal Frame 上重新完成所有工作,这对我来说是不可能的,因为提交我的最终项目的时间很短。

4

1 回答 1

5

如果您希望将 windows intp 放置在 JDesktopPane 中,那么您需要使用 JInternalFrames。无论它是否吸引您,这都是您的最佳解决方案。

这方面的一个教训是,您应该努力避免创建扩展 Swing 组件的类,尤其是 JFrames 等顶级组件,而应创建生成 JPanel 的类,这些组件足够灵活,可以放置在任何地方,例如 JFrames、JInternalFrames , JDialogs, JOptionPanes, 其他 JPanel 等等...

请注意,kludge 是从您的 JFrame 获取 contentPane,将其放入 JInternalFrame 并将其放入 JDesktopPane,或者将 JInternalPanes 的 contentPane 设置为来自 JFrame 的内容。IE,

asd t = new asd();
JInternalFrame internalFrame = new JInternalFrame();
internalFrame.setContentPane(t.getContentPane());
internalFrame.pack();

// set the internalFrame's location
// ...

internalFrame.setVisible(true);
dskp.add(internalFrame);

但请再次注意,这是一个杂牌,带有潜在的陷阱。

于 2012-12-06T19:13:24.933 回答