java - 如何重新绘制 JPanel

标签 java swing jpanel

我在更新后遇到 JPanel 重绘问题。所以,我有一个函数可以将一些(用户选择)JTable 添加到 JPanel 中。第一次使用时,一切正常,所有组件都正常。但是当我第二次运行相同的函数时,所有组件都消失了。我不明白为什么。当我检查 JPanel 中的组件列表时,一切正常,但我什至没有看到一个。

private void refreshTables(){
tablePanel.removeAll();

List resultListUzytkownicy=null;
    try {
        resultListUzytkownicy = DAO.GlobalDOA.getQuery("from Uzytkownik u where u.widokWPlanownaiu=1");}
    catch (IOException ex) {Logger.getLogger(PlanowanieFrame.class.getName()).log(Level.SEVERE, null, ex);}

int tabelaNr = 0;

Vector<String> tableHeaders = new Vector<String>();   
tableHeaders.add("ID:"); 
tableHeaders.add("Kategoria:");
tableHeaders.add("Podkategoria:");
tableHeaders.add("Data przyjęcia:");
tableHeaders.add("Przyjmujący:");
tableHeaders.add("Serwisujący:");
tableHeaders.add("Data zamknięcia:");
tableHeaders.add("Zamykający:");
tableHeaders.add("Klient:");
tableHeaders.add("Status:");
tableHeaders.add("Opis:");
tableHeaders.add("Termin:");
tableHeaders.add("Priorytet:");
tableHeaders.add("Podzlecenia:"); 

for(Object o : resultListUzytkownicy){
    Uzytkownik user = (Uzytkownik)o;

    List resultList = null;
    try {
        resultList = DAO.GlobalDOA.getQuery("from Zlecenie z where z.podzlecenie=0 and z.serwisujacy="+user.getId()+" order by id desc");}
    catch (IOException ex) {Logger.getLogger(PlanowanieFrame.class.getName()).log(Level.SEVERE, null, ex);}

    Vector tableData = new Vector();
    for(Object b : resultList) {
        Zlecenie actor = (Zlecenie)b;
        Vector<Object> oneRow = new Vector<Object>();
        oneRow.add(actor.getId());
        if(actor.getKategoria()!=null){oneRow.add(actor.getKategoria().getTemat());}
           else{oneRow.add(null);};
        if(actor.getPodkategoria()!=null){oneRow.add(actor.getPodkategoria().getTemat());}
           else{oneRow.add(null);};
        oneRow.add(DateRender.longDate(actor.getDataPrzyjecia()));
        oneRow.add(actor.getPrzyjmujacy().getImie()+" "+actor.getPrzyjmujacy().getNazwisko());
        if(actor.getSerwisujacy()!=null){oneRow.add(actor.getSerwisujacy().getImie()+" "+actor.getSerwisujacy().getNazwisko());}
           else{oneRow.add(null);};
        if(actor.getDataZamkniecia()!=null){oneRow.add(DateRender.longDate(actor.getDataZamkniecia()));}
           else{oneRow.add(null);}; 
        if(actor.getZamykajacy()!=null){oneRow.add(actor.getZamykajacy().getImie()+" "+actor.getZamykajacy().getNazwisko());}
           else{oneRow.add(null);};       
        if(actor.getKlient()!=null){oneRow.add(actor.getKlient().getNazwa());}   
           else{oneRow.add(null);};
        oneRow.add(DAO.StatusDAO.getStatusById(actor.getStatus()).getOpis());
        oneRow.add(actor.getOpis());
        oneRow.add(actor.getTermin());
        oneRow.add(actor.getPriorytet());
        oneRow.add(actor.getPodzlecenia());
        tableData.add(oneRow);
        }

    ZleceniaModel model = new ZleceniaModel(tableHeaders,tableData);
    JTable table = new JTable(model);              
    JScrollPane scrollPane = new JScrollPane(table);                  
    tableResizer(tablePanel, scrollPane, tabelaNr);
    tablePanel.add(scrollPane);
    tablePanel.revalidate();
    tablePanel.repaint();
    System.out.println(tablePanel.getComponents());
    tabelaNr++;
 }
}

 public static void tableResizer(JPanel panel, JScrollPane scrollPane, int tableaNr){

ComponentListener componentListener = new ComponentListener (){
        @Override
        public void componentResized(ComponentEvent e) {
                int panelWidth = panel.getWidth();
                scrollPane.setPreferredSize(new Dimension(panelWidth, 100));                   
                scrollPane.setBounds(0, tableaNr*100, panelWidth, 100);
                }
        @Override
        public void componentMoved(ComponentEvent e) {}
        @Override
        public void componentShown(ComponentEvent e) {    }
        @Override
        public void componentHidden(ComponentEvent e) {  }
    };
panel.addComponentListener(componentListener);  
 }

最佳答案

请勿从面板上移除组件。

您需要做的就是替换表的TableModel,表就会自行更新。

因此,当您创建框架时,在构造函数中创建表和滚动 Pane ,并将滚动 Pane 添加到框架中。

JTable table = new JTable();
JScrollPane = new JScrollPane(table);
panel.add( scrollPane );

然后在刷新逻辑中,代码将变为:

ZleceniaModel model = new ZleceniaModel(tableHeaders,tableData);
table.setModel( model );
//JTable table = new JTable(model);              
//JScrollPane scrollPane = new JScrollPane(table);                  
//tableResizer(tablePanel, scrollPane, tabelaNr);
//tablePanel.add(scrollPane);
//tablePanel.revalidate();
//tablePanel.repaint();

关于java - 如何重新绘制 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31894168/

相关文章:

java - 生产 EntityManager 抛出 __FIRST_PHASE__ 丢失

java - servlet api 试图解决什么问题?

Java 在资源文件夹上创建一个空的 .ser 文件(如果尚不存在)

java - 在 JPanel 上绘制图像并将其添加到 JFrame

java - 按钮多次打开新的 JFrame。我该如何阻止呢?

java - 在JAVA中通过不可靠的网络发送消息

java - 如何避免Java中的 "package does not exist"错误

java - 将 SWT 小部件添加到 swing JPanel

java - 将实体对象传递到 JFrame

java - JList 没有出现在 JPanel 中