线程和重绘()

时间:2015-03-19 20:56:54

标签: java multithreading repaint

您好我有一个项目来显示一些信息,我所做的是将特定信息放在一些JPanel中。这是一个生产项目,我有7条生产线,所以对于每一行,我使用了panelCel,在那个panelCel中,我用订单创建了JPanels,但我不知道它为什么没有显示所有订单。 我为每一行使用一个线程来填充所有订单,所以总共我有7个线程并且工作正常,但是当我的代码完成直到我移动鼠标或按下按钮时它没有实现,为什么它发生这个以及怎么能我解决了吗? 我使用了validate()和repaint()方法,但它没有什么区别。

以下是我如何调用线程的示例:

public void actualizarLineas(){
lineaProduccion linea1 = new lineaProduccion(panelCel1, ordenes1);
    lineaProduccion linea2 = new lineaProduccion(panelCel2, ordenes2);
    lineaProduccion linea3 = new lineaProduccion(panelCel3, ordenes3);
    lineaProduccion linea4 = new lineaProduccion(panelCel4, ordenes4);
    lineaProduccion linea5 = new lineaProduccion(panelCel5, ordenes5);
    lineaProduccion linea6 = new lineaProduccion(panelCel6, ordenes6);
    lineaProduccion linea7 = new lineaProduccion(panelCel7, ordenes7);

    linea1.start();
    linea2.start();
    linea3.start();
    linea4.start();
    linea5.start();
    linea6.start();
    linea7.start();}

ordenesX是具有订单的数组,这是类:

public class lineaProduccion extends Thread {
JPanel jpCelula;
    String []datos;

    public lineaProduccion(JPanel jpCelula, String[] datos) {
        this.jpCelula = jpCelula;
        this.datos = datos;
    }

    public JPanel getJpCelula() {
        return jpCelula;
    }

    public void setJpCelula(JPanel jpCelula) {
        this.jpCelula = jpCelula;
    }

    public String[] getDatos() {
        return datos;
    }

    public void setDatos(String[] datos) {
        this.datos = datos;
    }

    @Override
    public void run(){
        String auxOrdenAct = "0";
        String auxOrdenAnt  = "0";
        String celulaAnterior = "0";
        String celulaActual = "0";
        Color colorActual = null;
        Color colorAnterior = null;

        if(datos.length > 0){
            int posicionX = 10;

            for (String ordenActual : datos) {
                final JPanel orden = new JPanel();
                orden.setName(ordenActual);
                orden.setLocation(posicionX ,15);
                orden.setSize(65, 75);
                orden.setToolTipText(ordenActual);
                auxOrdenAnt = auxOrdenAct;
                auxOrdenAct = ordenActual;
                if(auxOrdenAnt.equals("0"))
                    auxOrdenAnt = ordenActual;
                celulaAnterior = celulaActual;
                celulaActual = jpCelula.getName();
                if(!celulaAnterior.equals(celulaActual))
                    celulaAnterior = celulaActual;
                String inf1 = transaccion.obtieneinf1(ordenActual);
                if(inf1.equals("-1"))
                    orden.setBackground(new java.awt.Color(0, 102,153));
                final JLabel etiqueta[] = new JLabel[3];
                for(int j=0; j<3; j++){
                    etiqueta[j]= new JLabel("etiqueta" +j);
                    etiqueta[j].setForeground(Color.white);
                }
                final String inf2 = transaccion.obtieneinf2(ordenActual);
                final String inf3 = transaccion.obtieneinf3(ordenActual);
                etiqueta[0].setText(ordenActual);
                etiqueta[1].setText("    "+ inf2 + "    ");
                if(!inf3.equals("-1"))
                    etiqueta[2].setText(inf3);

                orden.add(etiqueta[0]);
                orden.add(etiqueta[1]);
                orden.add(etiqueta[2]);
                posicionX = posicionX + 70;
                jpCelula.add(orden);
                Dimension d = new Dimension(posicionX , 70);
                jpCelula.setPreferredSize(d);
            }
        } else {
            System.out.println("No hay órdenes para esta línea");
        }
    }}

基本上我所做的是将信息放在一个JPanel中并将其添加到我的jPanel。

2 个答案:

答案 0 :(得分:1)

你必须参加&#34; Swing Thread&#34;,这也称为EDT。 Swing专为仅使用此线程的单线程访问而设计。如果你在另一个线程上进行诸如paint()或repaint()或foo.setText()等类似的swing调用,你将得到不可预测的结果。

此问题解释了如何在此线程上运行代码。将所有Swing调用移动到此线程,它将更好地工作。

Java Swing - running on EDT

另外,请确保不要在EDT上执行长时间阻塞调用,例如数据库读取。这样做会导致应用程序在EDT繁忙时冻结。只能将EDT用于Swing或AWT。

答案 1 :(得分:0)

我为解决这个问题所做的是做一个包含所有内容的线程,所以这个单线程有上面的两个方法,但它不是调用更多的线程,而是只调用一个方法。我曾尝试使用EDT,但它对我不起作用,感谢所有帮助过我的人!