JLayeredPane在getParent()上返回null

时间:2016-06-26 17:15:52

标签: java swing jlayeredpane

我的情况:我有一个扩展JFrame的类MainScreen(它实际上只是一个带有启动应用程序的main方法的JFrame),我在其上添加了一个扩展JLayeredPane的类GameManager,我用来显示它。

Call<ResponseBody> call = service.getAutoComplete("firefox", "tayl");

call.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
        if (response.isSuccessful()) {
            ResponseBody body = response.body();
            try {
                // autocompleteOptions => ["tayl",["taylor swift","taylor lautner",...
                String autocompleteOptions = body.string();
                JSONArray jsonArray = new JSONArray(autocompleteOptions).getJSONArray(1);
                // list => "taylor swift","taylor lautner",...
                ArrayList<String> list = GetAutocompleteOptions(jsonArray);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
         }
     }

     @Override
     public void onFailure(Call<ResponseBody> call, Throwable t) {
     }
});

private ArrayList<String> GetAutocompleteOptions(JSONArray jsonArray) throws JSONException {
    ArrayList<String> list = new ArrayList<>();
    if (jsonArray != null) {
        for (int i = 0; i < jsonArray.length(); i++) {
            list.add(jsonArray.get(i).toString());
        }
    }
    return list;
}

现在,我想要做的是,从GameManager类我想将JButton添加到主JFrame。我认为这很容易,只需这样做:

public static void main(String[] args) {
    MainScreen ms = new MainScreen();
}

public MainScreen() {
    this.initScreen();
    this.gm = new GameManager();
    this.add(gm, BorderLayout.CENTER);
    this.setVisible(true);
}       

但是getParent()返回null,所以很明显它不起作用。我不知道为什么,我之前做过类似的事情(尽管有JComponent和JPanel),我认为每个JComponent在添加到容器时都会将容器作为其父容器。我错过了什么?

1 个答案:

答案 0 :(得分:1)

如果声明如下:

this.getParent().add(button, BorderLayout.SOUTH);

存在于GameManager.java的构造函数中,然后getParent() is returning null是正确的。这是因为GameManager的对象在调用MainScreen后被添加到this.getParent().add(button, BorderLayout.SOUTH);

根据https://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html

  

每个顶级容器都有一个内容窗格,一般来说,   包含(直接或间接)其中的可见组件   顶级容器的GUI。

如果JFrame,则默认内容窗格为JPanel。因此,当您拨打this.add(gm, BorderLayout.CENTER);时,您实际上已将GameManager的实例添加到JFrame的默认内容窗格,即a JPanel。这就是GameManager.getParent()JPanel的原因。希望,这有帮助。