我的情况:我有一个扩展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在添加到容器时都会将容器作为其父容器。我错过了什么?
答案 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
的原因。希望,这有帮助。