将新类添加到JInternalFrame

时间:2012-12-27 18:48:35

标签: java swing class jframe

这是我的第一个Java项目,所以我很遗憾地问我确定是一个明显的答案。我一直在搜索谷歌和每本书,我可以得到我的手,但有些我是如何错过它...

我正在创建一个项目,其中包括第一类中的四个内部框架。我希望每个内部框架都能从其他类中获取内容(而不是将所有内容分组到主类中。代码看起来非常草率,最终只有几百行。导航太多了。这应该是关注或我是否太乏味?)。

无论如何,这是我的主类(称为Main)的GUI:

private static void createAndShowGUI() {
    frame = new JFrame("Perceptum");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setJMenuBar(createMenuBar());
    desk = new JDesktopPane();
    frame1 = new JInternalFrame("Notepad", true, true, true, true);
    frame1.setBounds(0, 0, 1088, 500);
    frame1.getContentPane().setLayout(new BorderLayout()); 
    frame1.setDefaultCloseOperation(HIDE_ON_CLOSE);
    frame1.setVisible(true);

    frame2 = new JInternalFrame("Research", true, true, true, true);
    frame2.setBounds(1089, 0, 265, 670);
    frame2.getContentPane().setLayout(new BorderLayout());
    frame2.setVisible(true);

    frame3 = new JInternalFrame("Share", true, true, true, true);
    frame3.setBounds(790, 500, 300, 170);
    frame3.getContentPane().setLayout(new BorderLayout());
    frame3.setVisible(true);

    frame4 = new JInternalFrame("References", true, true, true, true);
    frame4.setBounds(0, 500, 790, 170);
    frame4.setVisible(true);

    desk.add(frame1);
    desk.add(frame2);
    desk.add(frame3);
    desk.add(frame4);
    frame.add(desk);
    frame.setSize(1370, 730);
    frame.setVisible(true);
}

我想将课程NotepadReferencesResearchShare放入第1-4帧。我尝试过使用:

Notepad notes = new Notepad();
frame1.getContentPane().add(notes);

也:

frame1.setContentPane(notes)

和类似的变化。这让我疯狂。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

尝试将用于创建每个帧的代码分解为一个然后返回该帧的方法。这将代码分解为可读部分。你可以使用每帧一个类,但这是过度的,除非框架中有很多独特的东西。

private JInternalFrame frame1 = null;

...

private JInternalFrame getFrame1() {
    if (frame1 == null) {
        frame1 = new JInternalFrame("Notepad", true, true, true, true);
        frame1.setBounds(0, 0, 1088, 500);
        frame1.getContentPane().setLayout(new BorderLayout()); 

        // TODO: Add code to fill in the contents by calling getXxx()
        //  for each major contained component OR just creating all the
        //  minor bits that go inside.

        frame1.setDefaultCloseOperation(HIDE_ON_CLOSE);
        frame1.setVisible(true);
    }
    return frame1;
}

然后在您在问题中显示的方法中使用以下行:

desk.add(getFrame1());

答案 1 :(得分:0)

JFrame是一个顶级组件。一个主窗口。您无法将主窗口添加到JInternalFrame。这就是堆栈跟踪所说的:

  

java.lang.IllegalArgumentException:向容器添加窗口

向容器添加窗口是违法的。

记事本和其他类应该扩展JPanel,而不是JFrame。 JPanel是一个可以添加到JInternalFrame的组件。

要学习的课程:即使错误信息对您没有意义,它也包含有价值的信息。如果您不发布,我们不知道问题是什么。代码还包含有价值的信息。如果你不发布它,我们不知道它的作用。