繁体   English   中英

Java / Swing应用程序随机冻结

[英]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();

}

编辑2:我做了建议,我得到了空指针异常,这是我的代码:

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;


}

编辑3:我将此代码添加到按钮的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM