[英]Java/Swing app Freezes randomly
我有一个简单的Swing按钮,它刷新了一个jtable,但是在随机单击之后,应用程序冻结了,有时是无限期的,有时它在一分钟左右后就会响应。 我从未做过任何线程专用方法,所以我认为可能是s the issue but I don
所在, s the issue but I don
如果这是冻结的原因, s the issue but I don
知道从哪里开始或如何修改方法。
这是代码:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
recorrerLista();
}
public EventList recorrerLista(){
Persistir p = Persistir.getInstancia();
Vector<Pedidos> lista2 = p.listarPedidos();
Iterator it = lista2.iterator();
if(!pedList.isEmpty()){
pedList.clear();
}
while(it.hasNext()){
Vector v = new Vector();
v = (Vector) it.next();
int index = (Integer)v.get(0);
Pedidos ped = new Pedidos();
ped = p.buscarPedidoPorId(index);
pedList.add(ped);
}
return pedList;
}
编辑:我尝试在SwingWorker中插入持久性类(Persistir)的方法,但现在UI不显示。
这是代码
public Vector listarPedidos() throws InterruptedException, ExecutionException{
SwingWorker listar = new SwingWorker<Vector, Vector>(){
@Override
protected Vector doInBackground() throws Exception {
Vector<Articulos> lista = null;
EntityManagerFactory emf = Persistence.createEntityManagerFactory("PedidosPU" );
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
try {
Query query = em.createNativeQuery("SELECT * FROM pedidosview WHERE ENTREGADO='P' ORDER BY fecha_pedido");
lista = (Vector) query.getResultList();
} catch (Exception e) {
System.out.println( e.getMessage() );
em.getTransaction().rollback();
} finally {
em.close();
emf.close();
}
return lista;
}
};
return (Vector) listar.get();
}
public Vector listarPedidos(){
//Vector<Articulos> lista = null;
final EntityManagerFactory emf = Persistence.createEntityManagerFactory("PedidosPU" );
final EntityManager em = emf.createEntityManager();
final SwingWorker worker = new SwingWorker(){
private Vector lista;
@Override
protected Object doInBackground() throws Exception {
em.getTransaction().begin();
try {
Query query = em.createNativeQuery("SELECT * FROM pedidosview WHERE ENTREGADO='P' ORDER BY fecha_pedido");
lista = (Vector) query.getResultList();
} catch (Exception e) {
System.out.println( e.getMessage() );
em.getTransaction().rollback();
} finally {
em.close();
emf.close();
}
return lista;
}
};
worker.execute();
return lista;
}
ActionPerformed()
。 但是似乎完全跳过了代码 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
final Persistir p = Persistir.getInstancia();
SwingWorker<Void, Pedidos> worker = new SwingWorker<Void, Pedidos>() {
//private Vector lista2;
@Override
protected Void doInBackground() throws Exception {
EntityManagerFactory emf = Persistir.createEntityManagerFactory("PedidosPU" );
EntityManager em = emf.createEntityManager();
String jqpl = "SELECT * FROM pedidosview WHERE ENTREGADO='P' ORDER BY fecha_pedido";
//TypedQuery<Articulos> query = em.createQuery(jpql, Articulos.class);
Query query = em.createNativeQuery("SELECT * FROM pedidosview WHERE ENTREGADO='P' ORDER BY fecha_pedido");
//query.setParameter("param", "P");
//lista = (Vector) query.getResultList();
List<Pedidos> lista2 = query.getResultList();
publish((Pedidos[])lista2.toArray());
em.close();
emf.close();
return null;
}
@Override
protected void process(List<Pedidos> chunks) {
Iterator it = lista2.iterator();
if(!pedList.isEmpty()){
pedList.clear();
}
while(it.hasNext()){
Vector v = new Vector();
v = (Vector) it.next();
int index = (Integer)v.get(0);
Pedidos ped = new Pedidos();
ped = p.buscarPedidoPorId(index);
pedList.add(ped);
}
}
@Override
protected void done() {
jButton1.setEnabled(true);
}
};
worker.execute();
}
您的SwingWorker实现几乎就像什么都不做一样,因为在listarPedidos()
的末尾您调用get()方法:
public Vector listarPedidos() throws InterruptedException, ExecutionException {
...
return (Vector) listar.get();
}
因此,导致事件调度线程被阻塞,直到doInBackground()完成为止:
您应该改为使用publish()和process() 。 由于您使用的是JPA,因此我假设您可以设法获得一个称为Articulos
的实体,因此您可以执行以下操作:
SwingWorker<Void, Articulos> worker = new SwingWorker<Void, Articulos>() {
@Override
protected Void doInBackground() throws Exception {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("PedidosPU" );
EntityManager em = emf.createEntityManager();
String jqpl = "SELECT a FROM Articulos a WHERE a.entregado = :param";
TypedQuery<Articulos> query = em.createQuery(jpql, Articulos.class);
query.setParameter("param", "P");
List<Articulos> resultList = query.getResultList();
publish((Articulos[])resultList.toArray());
em.close();
emf.close();
}
@Override
protected void process(List<Articulos> chunks) {
// add your items to the table model here
// this code runs in the EDT
}
@Override
protected void done() {
refreshButton.setEnabled(true);
}
};
worker.execute();
考虑到使用Vector classm,我怀疑您的表模型是DefaultTableModel (如果不是这种情况,请忽略此无关紧要的注释),这不是处理复杂模型类的最佳盟友。
如果是这种情况(考虑到您似乎会说西班牙语的事实),请参阅有关使用域类创建可重用表模型的文章(西班牙语) (或英语 ,由Google翻译提供) 。 如果您不会说西班牙语,您仍然可以查看此条目末尾(或用英语 )发布的GenericDomainTableModel
类代码,因为这很容易解释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.