1

友人のオブジェクトのリストをリスト形式で表示する独自の GUI を構築しています。最初に遭遇した問題は、コンストラクターを使用せずにコードを実行すると、すべて正常に動作することです。しかし、GUI クラスのコンストラクターを作成すると、次のエラー メッセージが表示されます。

load: GUIapp.class is not public or has no public constructor.
java.lang.IllegalAccessException: Class sun.applet.AppletPanel can not access a member of             class GUIapp with modifiers ""
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
at java.lang.Class.newInstance0(Class.java:349)
at java.lang.Class.newInstance(Class.java:308)
at sun.applet.AppletPanel.createApplet(AppletPanel.java:807)
at sun.applet.AppletPanel.runLoader(AppletPanel.java:714)
at sun.applet.AppletPanel.run(AppletPanel.java:368)
at java.lang.Thread.run(Thread.java:680)

私のコード:

public class GUIapp extends JApplet{

/*
 * Attributes
 */

//** Friends Objects**//
private FriendsGroup a;
private ArrayList<friends> friendList;

//** PANEL **//
private JPanel outerPanel;

//** Button **//
private JButton button1;


/*
 * Constructor for Getting all the friends set up
 */

private GUIapp(){
    a = null;  //initialize variable

    try {
        a = new FriendsGroup("friends.txt"); //import friend list
    } catch (IOException e) {
        System.out.println("Fail Import.");
    }

    friendList = a.getFriendsGroup(); //return an arrayList of Friends Object
}


/*
 * Create Stuff
 */
public void createStuff() {
    outerPanel = new JPanel(); //create outer panel
    button1 = new JButton("Click Me");
    outerPanel.add(button1,BorderLayout.SOUTH);
}


/*
 * Initialize Stuff
 * 
 */
public void init(){
    createStuff(); //initialize create stuff

    this.add (outerPanel); 
}
}

上記のコードで、コンストラクタを取り出すと、完全に動作するようです。私の質問は、コードの何が問題なのですか? 最初にデータをロードするコンストラクタを作成できないように見えるのはなぜですか?

2 番目の質問は、友人の名前のリストを表示するパネルを作成するにはどうすればよいですか? これらの名前は、コンストラクターに格納された friendList と呼ばれる友人オブジェクトの配列リストにインポートされて格納されます。

ありがとう、

4

4 に答える 4

1

自分でコンストラクターを定義している場合、コンパイラーはデフォルトのコンストラクターを作成しません。定義されたコンストラクターはプライベートであるため、パブリックコンストラクターはありません

したがって、単純にパブリックコンストラクターを作成します

public GUIapp(){
    // your code
}
于 2013-02-15T06:42:37.453 に答える
0

問題は次のとおりprivate GUIapp(){です。つまり、コンストラクターはそのクラスでのみ使用できます。通常、コンストラクターは ですがpublic、例外が存在しますが、その例としてSingleton Patternがあります。

各クラスにはデフォルトでパラメーターなしのコンストラクターがあるため、コンストラクターの削除は機能します。アクセス修飾子の詳細については、このチュートリアルをご覧ください。

GUIappまたは、クラスに次のようなメソッドを含めることもできます。

public static GUIapp getInstance() { return new GUIapp(); }

メインクラスからそれを呼び出しますが、この場合、コンストラクターを からprivateに変更するpublicだけで十分だと思います。

2 番目の質問については、このチュートリアルが役に立ちます。

于 2013-02-15T06:04:20.647 に答える
0

コンストラクターを public に変更し、次のようにデバッグする必要がありました。

a.getFriendsGroup();

このメソッドが何をするのかは明確ではありません。何らかの理由で(ファイルのリストが空である可能性があります)、メソッドがnull参照例外を引き起こす割り当てられていないオブジェクトにアクセスしようとすると、メソッドにデバッグして、これがどこで発生するかを確認してください。またはメソッドのコードを投稿してください。

于 2013-02-15T06:16:11.960 に答える
0

コンストラクターを定義しているため、それを次privateのように変更します。

public GUIapp(){
    a = null;  //initialize variable

    try {
        a = new FriendsGroup("friends.txt"); //import friend list
    } catch (IOException e) {
        System.out.println("Fail Import.");
    }

    friendList = a.getFriendsGroup(); //return an arrayList of Friends Object
}
于 2013-02-15T06:01:00.463 に答える