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); 
}
}

在上面的代码中,如果你取出构造函数,它似乎可以完美地工作。我的问题是,代码有什么问题?为什么我似乎不能创建一个构造函数来首先加载数据?

我的第二个问题是我将如何创建一个面板来显示朋友姓名列表?这些名称被导入并存储在名为friendList 的朋友对象的arraylist 中,该对象存储在构造函数中。

谢谢,

4

4 回答 4

1

当您自己定义构造函数时,编译器不会创建默认构造函数,因为您定义的构造函数是私有的,您将没有公共构造函数

所以只需创建一个公共构造函数

public GUIapp(){
    // your code
}
于 2013-02-15T06:42:37.453 回答
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 回答
0

问题是这样的:private GUIapp(){。这意味着您的构造函数仅对该类可用。通常构造函数是public,尽管确实存在例外,其中的例子可能是Singleton Pattern

删除构造函数是可行的,因为每个类默认都有一个无参数的构造函数。查看教程以获取有关访问修饰符的更多信息。

或者,你可以在你的GUIapp类中有这样的方法:

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

你从你的主类中调用它,但我认为在这种情况下,将你的构造函数从更改privatepublic应该就足够了。

关于您的第二个问题,教程应该会有所帮助。

于 2013-02-15T06:04:20.647 回答
0

您需要将 syour 构造函数更改为 public 并调试为:

a.getFriendsGroup();

它不清楚这个方法做了什么,我假设由于某种原因(可能文件中的列表是空的)方法试图访问导致空引用异常的未分配对象,尝试调试到方法中以查看发生的位置或发布方法的代码。

于 2013-02-15T06:16:11.960 回答