Java Swing自定义JList渲染器在添加新元素后未绘制所有元素

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())

这是我作为新手的第一个更大的项目。这个项目主要是一个SwingGUI应用程序,它基本上是一个公寓猎人应用程序。事实上,这是一个非常大的程序(至少对我来说),代码非常混乱,但我会尽我所能包含所有必要的内容。 因此在这个程序中,一个JPanel包含一个Jlist,它包含所有可用的单元,并且有一个定制的cellRenderer类。如下所示(我将在代码片段之后详细介绍所有内容):

这里:
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