您好我有一个项目来显示一些信息,我所做的是将特定信息放在一些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。
答案 0 :(得分:1)
你必须参加&#34; Swing Thread&#34;,这也称为EDT。 Swing专为仅使用此线程的单线程访问而设计。如果你在另一个线程上进行诸如paint()或repaint()或foo.setText()等类似的swing调用,你将得到不可预测的结果。
此问题解释了如何在此线程上运行代码。将所有Swing调用移动到此线程,它将更好地工作。
另外,请确保不要在EDT上执行长时间阻塞调用,例如数据库读取。这样做会导致应用程序在EDT繁忙时冻结。只能将EDT用于Swing或AWT。
答案 1 :(得分:0)
我为解决这个问题所做的是做一个包含所有内容的线程,所以这个单线程有上面的两个方法,但它不是调用更多的线程,而是只调用一个方法。我曾尝试使用EDT,但它对我不起作用,感谢所有帮助过我的人!