0

私はJava Swingアプリケーションの初心者で、次の問題があります。

私はこの単純なLoginFrame2クラスを持っています:

package com.test.login;

import java.awt.Container;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

import net.miginfocom.swt.MigLayout;

import org.jdesktop.application.SingleFrameApplication;

public class LoginFrame2 extends SingleFrameApplication {

    public static void main(String[] args) {
        System.out.println("DENTRO: LoginFrame() ---> main()");
        launch(LoginFrame2.class, args);
    }

    @Override
    protected void startup() {
        // TODO Auto-generated method stub
        System.out.println("Inside startup()");

        JFrame mainFrame = this.getMainFrame();         // main JFrame that represents the Windows
        mainFrame.setTitle("XCloud Login");

        Container mainContainer = mainFrame.getContentPane();       // main Container into the main JFrame

        // JPanel creation and settings of the MigLayout on it:
        JPanel externalPanel = new JPanel();
        externalPanel.setLayout(new net.miginfocom.swing.MigLayout("fill"));

        externalPanel.add(new JLabel("Username"));

        mainContainer.add(externalPanel);
        mainFrame.add(mainContainer);


    }

}

ご覧のとおり、私はJDesktopフレームワークのSingleFrameApplication抽象クラスを使用しています。この抽象クラスは、1 つのプライマリ JFrame を提供するだけです (この抽象クラスは、コンポーネント プロパティの挿入、終了処理、セッション状態の保存/復元も適切な方法で処理します)。単純な単一フレーム アプリケーション)。

クラスが実行されると、startUp()メソッドが実行されます。

ご覧のとおり、次の操作を実行しました。

  1. getMainFrame()メソッドを使用してメインのJframeを取得し、その参照をmainFrame変数に入れます。

  2. getContentPane()メソッドを呼び出すメインコンテナー(つまり、mainFrame オブジェクト内) を取得します。

  3. 次に、externalPanelという名前のJPanelオブジェクトを作成します。このオブジェクトに、文字列を表示する初期化済みのJLabelを配置します。

  4. 最後に、JPanelオブジェクトをContainerオブジェクトに追加してから、 ContainerをメインのJFrameオブジェクトに追加しようとします。

問題は、このクラスを実行すると、次のエラー メッセージが表示されることです。

DENTRO: LoginFrame() ---> main()
Inside startup()
8-nov-2013 12.35.23 org.jdesktop.application.Application$1 run
GRAVE: Application class com.test.login.LoginFrame2 failed to launch
java.lang.IllegalArgumentException: adding container's parent to itself
    at java.awt.Container.checkAddToSelf(Container.java:418)
    at java.awt.Container.addImpl(Container.java:1036)
    at java.awt.Container.add(Container.java:957)
    at javax.swing.JFrame.addImpl(JFrame.java:540)
    at java.awt.Container.add(Container.java:363)
    at com.test.login.LoginFrame2.startup(LoginFrame2.java:38)
    at org.jdesktop.application.Application$1.run(Application.java:187)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:672)
    at java.awt.EventQueue.access$400(EventQueue.java:81)
    at java.awt.EventQueue$2.run(EventQueue.java:633)
    at java.awt.EventQueue$2.run(EventQueue.java:631)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:642)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception in thread "AWT-EventQueue-0" java.lang.Error: Application class com.test.login.LoginFrame2 failed to launch
    at org.jdesktop.application.Application$1.run(Application.java:192)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:672)
    at java.awt.EventQueue.access$400(EventQueue.java:81)
    at java.awt.EventQueue$2.run(EventQueue.java:633)
    at java.awt.EventQueue$2.run(EventQueue.java:631)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:642)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Caused by: java.lang.IllegalArgumentException: adding container's parent to itself
    at java.awt.Container.checkAddToSelf(Container.java:418)
    at java.awt.Container.addImpl(Container.java:1036)
    at java.awt.Container.add(Container.java:957)
    at javax.swing.JFrame.addImpl(JFrame.java:540)
    at java.awt.Container.add(Container.java:363)
    at com.test.login.LoginFrame2.startup(LoginFrame2.java:38)
    at org.jdesktop.application.Application$1.run(Application.java:187)
    ... 14 more

問題は、Jframe オブジェクトに Container オブジェクトを追加することだと思います。しかし、なぜ?私が理解したことから、コンテナオブジェクトはJFrame内にラップされたオブジェクトです...どこに問題がありますか? どうすれば解決できますか?

TNX

アンドレア

4

3 に答える 3