Java TableModel未加载来自鼠标上JPA查询的数据单击JTabbedPane
我有一个Java类,我创建了一个查询(JPA with EclipseLink)来从DB加载信息。当单击JTabbedPane时,数据被加载到绑定到JTable的TableModel中。 我使用MouseEvent的MouseClicked来获取所选选项卡。但有些表加载失败,我感觉好像什么都没有点击,但当我浏览选项卡并返回到加载失败的选项卡时,它最终有时会加载数据。我的代码如下:Java TableModel未加载来自鼠标上JPA查询的数据单击JTabbedPane,java,swing,jpa,jtable,jtabbedpane,Java,Swing,Jpa,Jtable,Jtabbedpane,我有一个Java类,我创建了一个查询(JPA with EclipseLink)来从DB加载信息。当单击JTabbedPane时,数据被加载到绑定到JTable的TableModel中。 我使用MouseEvent的MouseClicked来获取所选选项卡。但有些表加载失败,我感觉好像什么都没有点击,但当我浏览选项卡并返回到加载失败的选项卡时,它最终有时会加载数据。我的代码如下: private void jTabbedPane1MouseClicked(java.awt.event.Mouse
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));
}
private void jTabbedPane1MouseClicked(java.awt.event.MouseEvent evt){
int selectTab=jTabbedPane1.getSelectedIndex();
如果(selectTab==1){
bookValueTable.getColumnModel().getColumn(0).setMaxWidth(150);
bookValueTable.getColumnModel().getColumn(1).setMaxWidth(150);
如果(!tab2Opened){//这将确保数据不会多次加载。。。。
tab2Opened=true;
Query q=em.createQuery(“从企业投资e中选择e,其中e.acctYear=:acctYear”);
q、 设置参数(“acctYear”,acctYear);
List resultList=q.getResultList();
对于(企业投资p:resultList){
对象行[]={p.getEnterprise().getRcNo(),p.getAcctYear(),p.getInvestmentItem(),
格式(p.getInvestmentAmount())};
shareCapitalModel.addRow(行);
}
}
bookValueTable.setRowSorter(新的TableRowSorter(shareCapitalModel));
}
我不知道问题出在哪里:JPA、TabbedPane或EventHandler!如果我理解正确,您希望在选中包含表的选项卡后加载表的内容 首先,您不应该使用鼠标侦听器来执行此操作。它的级别太低。此外,您可以使用键盘切换选项卡。要检测到选项卡选择的更改,您应该在选项卡窗格中添加ChangeListener 您应该做的另一件事是从侦听器中删除JPA代码,并将其放在单独的方法中,甚至放在单独的类中。GUI代码的职责不是知道如何从数据库中获取数据。在数据访问对象中执行此操作,并对该数据访问对象进行单元测试,以了解其是否正常工作。如果您知道,请在y中使用它我们的GUI。如果有问题,它将出现在GUI代码中,因为您已经测试了数据访问代码的工作情况
使用调试器,最终使用日志语句,也有助于诊断问题的来源。如果我理解正确,您希望在选择包含表的选项卡后加载表的内容 首先,您不应该使用鼠标侦听器来执行此操作。它的级别太低。此外,您可以使用键盘切换选项卡。要检测到选项卡选择的更改,您应该在选项卡窗格中添加ChangeListener 您应该做的另一件事是从侦听器中删除JPA代码,并将其放在单独的方法中,甚至放在单独的类中。GUI代码的职责不是知道如何从数据库中获取数据。在数据访问对象中执行此操作,并对该数据访问对象进行单元测试,以了解其是否正常工作。如果您知道,请在y中使用它我们的GUI。如果有问题,它将出现在GUI代码中,因为您已经测试了数据访问代码的工作情况
使用调试器,以及最终的日志语句,也有助于诊断问题的来源。除了@JB对侦听器的指导之外,我怀疑JPA查询中的延迟正在阻止事件调度线程(EDT)。尽管您必须在EDT上更新表模型,但您可以在
doInBackground()中执行查询
SwingWorker的方法,如API中所示。除了@JB对侦听器的指导之外,我怀疑JPA查询中的延迟正在阻止事件调度线程(EDT)。尽管您必须在EDT上更新表模型,但您可以在doInBackground()中进行查询
SwingWorker的方法,如API中所示。考虑在代码中使用调试器或记录器,或println语句来首先尝试隔离错误的位置。非常幸运。顺便说一句,我不是你的投票人。为了获得更好的帮助,单击选项卡时,会触发事件,但我不想立即重画。我对JTAT有点新。考虑使用调试器或记录器,或者代码中的PrtLnn语句,首先尝试隔离错误的位置。运气好。顺便说一下,我不是你的下级选民。为了更好地帮助,当我点击了标签后,我确实打印出了日志。表没有我想马上重新粉刷。我对JTable有点陌生。