Java Swing自定义JList渲染器在添加新元素后未绘制所有元素
这是我作为新手的第一个更大的项目。这个项目主要是一个SwingGUI应用程序,它基本上是一个公寓猎人应用程序。事实上,这是一个非常大的程序(至少对我来说),代码非常混乱,但我会尽我所能包含所有必要的内容。 因此在这个程序中,一个JPanel包含一个Jlist,它包含所有可用的单元,并且有一个定制的cellRenderer类。如下所示(我将在代码片段之后详细介绍所有内容): 这里:Java Swing自定义JList渲染器在添加新元素后未绘制所有元素,java,swing,user-interface,paint,jlist,Java,Swing,User Interface,Paint,Jlist,这是我作为新手的第一个更大的项目。这个项目主要是一个SwingGUI应用程序,它基本上是一个公寓猎人应用程序。事实上,这是一个非常大的程序(至少对我来说),代码非常混乱,但我会尽我所能包含所有必要的内容。 因此在这个程序中,一个JPanel包含一个Jlist,它包含所有可用的单元,并且有一个定制的cellRenderer类。如下所示(我将在代码片段之后详细介绍所有内容): 这里:data\u storage=mainc.getApartments(sqldata.getApartments())
data\u storage=mainc.getApartments(sqldata.getApartments())代码>刷新内部ArrayList,它基本上包含JList的元素
还有一些可能很重要的代码:
mainJListPanel = new JList(nameList);
public String[] nameList = makeList();
public String[] makeList(){
int n = sqldata.getApartments().size();
HashMap<String,List<String>> kt = sqldata.getApartments();
String[] tmp =new String[n];
ids = new ArrayList<>();
int i = 0;
for (String x : kt.keySet()){
tmp[i++] = x; //Getting the owner names
}
return tmp;
}
public static String[] searchList(){
int n = MainController.data_storage.size();
String[] tmp = new String[n];
int i = 0;
for (String x : MainController.data_storage.keySet()){
tmp[i++] = x;
}
return tmp;
}
奇怪的是,如果我选中一个过滤器选项,比如阳台,JList会绘制结果。甚至连新公寓也在结果中,这是上传的。但是当我去掉所有的过滤器时(所以基本上我想要所有的公寓都回来),这个列表不会画出任何东西。因此,只有当我处于“上传后”状态,并且我希望在Jlist上绘制每个公寓时,才会出现错误。如果我重新启动程序,新公寓将被绘制在列表上,在我再次上传新公寓之前,一切都正常。这不是我们能够解决的问题,因为我们没有完整的图片或轻松复制它的方法,相反,你需要回到一些基本的调试。首先,我要确定更新后的ListModel
是否确实包含任何数据(即ListModel#getSize
)-如果没有-我会检查查询结果,如果有,我会转到渲染器,看看它在做什么。注意不要在上下文中下载图像如果事件调度线程失败,这将导致应用程序在操作完成时“挂起”。这是本地缓存和观察者模式最有用的地方。请记住使渲染器尽可能哑,它不应该做可能会改变列表状态的事情,而只代表它所提供的数据的当前状态。嗯,不幸的是,你是对的,为了解决这个问题,我必须共享所有内容,但这在这里是不可能的(Howewer,我开始调试,ListModel返回了正确的大小,应该在那里。我打印了所有数据,所有内容都在那里。因此ListModel和所有相关数组都成功更新,并且它们包含了新的数据。所以我认为这很好。Howewer,没有任何内容被绘制。在JList上。我将转到t同时,是的,我确实把下载部分放到了第二个线程中。如果你可以确定<代码> jList使用正确的模型,验证它正在尝试渲染数据,如果调用它,考虑减少ReDeReWror的复杂性,我保存了T初始化的初始列表模型。上传并按search之后,我做了一个初始listmodel.equals(上传后的listmodel)
check,如果这是检查listModel是否相等的正确方法,它将返回true.Idk。此外,程序中没有这样的代码试图编辑内部listModel。顺便问一下,我如何验证列表是否正在尝试呈现数据?
if(validFile()){
if(!uploadMenuValidate()){
if(!img_container.isEmpty()){
for(File f : img_container){
try {
ftp.putFileToPath(f, FtpClient.DEST_DIR+SQLData.APP_USERNAME+"/"+f.getName());
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
sqldata.insert(SQLData.QUERY_ADD_APARTMENT, SQLData.APP_USERNAME,uploadmenu.getPriceField().getText(),uploadmenu.getCityField().getText(),uploadmenu.getRoomTypeSelector().getSelectedItem().toString(),
uploadmenu.getRoomNum().getText(),uploadmenu.getBalconyCheck().isSelected()+"",uploadmenu.getPetCheck().isSelected()+"",uploadmenu.getYardCheck().isSelected()+"",uploadmenu.getSmokeCheck().isSelected()+"",
uploadmenu.getFreqCheck().isSelected()+"",uploadmenu.getDepositCheck().isSelected()+"",img_container.size()>0 ? FtpClient.DEST_DIR+SQLData.APP_USERNAME+"/"+img_container.get(0).getName() : "",
img_container.size()>1 ? FtpClient.DEST_DIR+SQLData.APP_USERNAME+"/"+img_container.get(1).getName() : "",img_container.size()>2 ? FtpClient.DEST_DIR+SQLData.APP_USERNAME+"/"+img_container.get(2).getName() : "",
img_container.size()>3 ? FtpClient.DEST_DIR+SQLData.APP_USERNAME+"/"+img_container.get(3).getName() : "",uploadmenu.getDetailsBox().getText(),uploadmenu.getApTitle().getText(),mainc.getUniqueId());
showInfoPanel("misc.INFO_UPLOAD_SUCCESS");
data_storage = mainc.getApartments(sqldata.getApartments());
}
}
}
mainJListPanel = new JList(nameList);
public String[] nameList = makeList();
public String[] makeList(){
int n = sqldata.getApartments().size();
HashMap<String,List<String>> kt = sqldata.getApartments();
String[] tmp =new String[n];
ids = new ArrayList<>();
int i = 0;
for (String x : kt.keySet()){
tmp[i++] = x; //Getting the owner names
}
return tmp;
}
public static String[] searchList(){
int n = MainController.data_storage.size();
String[] tmp = new String[n];
int i = 0;
for (String x : MainController.data_storage.keySet()){
tmp[i++] = x;
}
return tmp;
}
data_storage = getApartments(sqldata.getSearchedApartments(mainmenu.getMenuMinPrice().getText()+"",mainmenu.getMenuMaxPrice().getText(),mainmenu.getMenuCity().getText(),
String.valueOf((int)mainmenu.getMenuRoomNum().getValue()),mainmenu.getMenuRoomType().getSelectedItem()+"",mainmenu.getMenuBalcony().isSelected()+"",mainmenu.getMenuYard().isSelected()+"",mainmenu.getMenuPet().isSelected()+"",
mainmenu.getMenuSmoke().isSelected()+"",mainmenu.getMenuFreq().isSelected()+"",mainmenu.getMenuDeposit().isSelected()+"", mainmenu.getMenuMiscText().getText()));
//Getting everything from the filter, and //converting it into an SQL query --> This is working, the sql command is OK.
mainmenu.setNameList(mainmenu.searchList());
mainmenu.getMenuMainPanel().revalidate();
mainmenu.getMenuMainPanel().repaint();
//mainmenu is the instance of the JPanel, which contains the Jlist