gpt4 book ai didi

java - 线程和重绘()

转载 作者:行者123 更新时间:2023-12-01 11:45:39 25 4
gpt4 key购买 nike

嗨,我有一个项目要显示一些信息,我所做的是将特定信息放在一些 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 是具有顺序的数组,这是类:

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 设计用于仅使用此线程的单线程访问。如果您在不同的线程上进行 swing 调用,例如 Paint() 或 repaint() 或 foo.setText() 或类似的调用,您将得到不可预测的结果。

这个问题解释了如何让你的代码在此线程上运行。将所有 Swing 调用移至此线程,它会工作得更好。

Java Swing - running on EDT

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

关于java - 线程和重绘(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29154858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com