0

这是我的第一个 Java 项目,所以很抱歉问我肯定是一个明显的答案。我一直在搜索谷歌和我能拿到的每一本 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)

和类似的变化。这真的让我发疯了。谢谢您的帮助!

4

2 回答 2

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());
于 2012-12-27T19:04:40.557 回答
0

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

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

在容器中添加窗口是违法的。

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

经验教训:即使错误消息对您来说毫无意义,它也包含有价值的信息。如果您不发布它,我们不知道问题是什么。代码还包含有价值的信息。如果您不发布它,我们不知道它的作用。

于 2012-12-27T21:28:33.790 回答