线程和重绘()

Thread and repaint()

你好我有一个显示一些信息的项目,我所做的是将特定信息放在一些 JPanel 中。这是一个生产项目,我有 7 条生产线,所以对于每条生产线,我都使用一个 panelCel,在那个 panelCel 中,我用订单创建了 JPanel,但我不知道为什么它不显示所有订单。 我为每一行使用一个线程来填充所有订单,所以我总共有 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 是有顺序的数组,这是 class:

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 中。

您必须在 "Swing Thread" 上,也称为 EDT。 Swing 专为仅使用此线程的单线程访问而设计。如果您在不同的线程上进行诸如 paint() 或 repaint() 或 foo.setText() 之类的 swing 调用,您将得到不可预知的结果。

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

Java Swing - running on EDT

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

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