线程和重绘()
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 但它对我不起作用,感谢所有帮助我的人!
你好我有一个显示一些信息的项目,我所做的是将特定信息放在一些 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 但它对我不起作用,感谢所有帮助我的人!