0

I have a Java Class, i create a Query (JPA with EclipseLink) to Load Info from DB when a JTabbedPane is clicked, the data is loaded into the TableModel which is bound to a JTable. I use MouseClicked of MouseEvent, to get the selected tab. But some tables fail to load, i feel as if nothing is clicked, but when i go around through the tabs and come back to the tab that failed to load it eventually loads the data sometimes. My Code below:

private void jTabbedPane1MouseClicked(java.awt.event.MouseEvent evt) {  
  int selectTab = jTabbedPane1.getSelectedIndex();
  if (selectTab == 1) {
    bookValueTable.getColumnModel().getColumn(0).setMaxWidth(150);
    bookValueTable.getColumnModel().getColumn(1).setMaxWidth(150);
    if (!tab2Opened) { //this makes sure the data is not loaded multiple time....
        tab2Opened = true;
        Query q = em.createQuery("select e from EnterpriseInvestments e Where e.acctYear = :acctYear");
        q.setParameter("acctYear", acctYear);
        List<EnterpriseInvestments> resultList = q.getResultList();
        for(EnterpriseInvestments p: resultList){
          Object row[] = {p.getEnterprise().getRcNo(), p.getAcctYear(), p.getInvestmentItem(),
                nf.format(p.getInvestmentAmount())};
            shareCapitalModel.addRow(row);
        }
    }
    bookValueTable.setRowSorter(new TableRowSorter(shareCapitalModel));
}

I dont know where the problem is coming from: The JPA, The TabbedPane or the EventHandler!

4

2 回答 2

3

除了@JB 对侦听器的指导之外,我怀疑您的 JPA 查询中的延迟会阻塞事件调度线程 (EDT)。虽然您必须在 EDT 上更新表模型,但您可以在 a 的doInBackground()方法中进行查询SwingWorker,如 API 所示。

于 2012-07-22T14:11:09.130 回答
2

如果我理解正确,您希望在选择包含表格的选项卡后加载表格的内容。

首先,您不应该使用 MouseListener 来做到这一点。这是一个太低级的听众。此外,您可以使用键盘切换选项卡。要检测选项卡选择更改,您应该将 ChangeListener 添加到选项卡式窗格。

您应该做的另一件事是从侦听器中删除 JPA 代码,并将其放在单独的方法中,甚至放在单独的类中。知道如何从数据库中获取数据不是 GUI 代码的工作。在数据访问对象中执行此操作,并对该数据访问对象进行单元测试以了解它是否正常工作。你知道的,在你的 GUI 中使用它。如果有问题,它会出现在 GUI 代码中,因为您已经测试了数据访问代码是否有效。

使用调试器,最终使用日志记录语句,也有助于诊断问题出在哪里。

于 2012-07-22T14:02:26.783 回答