gpt4 book ai didi

java - 从 swingworker 或在 swingworker 之后更新 JList

转载 作者:行者123 更新时间:2023-12-02 05:49:03 28 4
gpt4 key购买 nike

jList 模型中包含的数据由 swingworker 更新。问题是我在独立的 *.java 文件中对 SwingWorker 类进行了子类化。所以我无法访问 GUI 组件(在本例中为模型和 jList)。事实上,我认为最好不要将这个子类放在 JFrame 形式中,以避免它变得困惑,但这是我能找到使其工作的唯一方法。如果我把这个子类放在jframe形式中,我想我可以使用swingworker抽象类的done()方法来更新模型和Jlist。

但是当 swingWorker 位于另一个 *.java 文件中时,有什么方法可以从 swingworker 访问 GUI 组件(jList 和模型)吗?

我使用 INVOKE LATER 来调用此处的 swingworker。在我尝试更新模型后,但似乎它没有等待 swingworker 结束其工作,因此当它更新模型时,swingworker 尚未完成,因此数据尚未更新。

正如您在下一段代码中看到的,我还尝试将更新代码放在第一个代码之后的 INVOKE LATER 中,但它似乎也不同步。

private void jMenuItem2MousePressed(java.awt.event.MouseEvent evt) {                                        
// BOTON DESCARGAR DATOS DEL SERVIDOR OPCION DEL MENU
File filePref = new File("preferencias.config");
if (filePref.exists()) {
int n = JOptionPane.showConfirmDialog(
this, "¿Está seguro de que desea descargar todos los datos del servidor"
+ " (datos e imágenes)a local? Todos los datos locales serán reemplazados"
+ " y no se podrán recuperar.",
"Confirmación de descarga",
JOptionPane.YES_NO_OPTION);

if (n == JOptionPane.YES_OPTION) {
// *** THIS invokeLater() calls the SwingWorker subclass to update the data
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
DescargarDatosDelServidor.createAndShowGUI();
}
});
// *** THIS invokeLater() updates the model and the jList
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// BORRAMOS MODELO DE LOS JList
modelo.clear();
modelo2.clear();
modelo3.clear();

// AGREGAMOS ELEMENTOS AL MODELO Y
// SETEAMOS EL MODELO EN LAS JList
// seguros
for (int i = 0; i < AlmacenSeguros.getInstance().getListaSeguros().size(); i++) {
modelo.addElement(AlmacenSeguros.getInstance().getListaSeguros().get(i));
}
jList_seguros.setModel(modelo);
// gestoria
for (int i = 0; i < AlmacenGestoria.getInstance().getListaGestoria().size(); i++) {
modelo2.addElement(AlmacenGestoria.getInstance().getListaGestoria().get(i));
}
jList_gestoria1.setModel(modelo2);
// consultoria
for (int i = 0; i < AlmacenConsultoria.getInstance().getListaConsultoria().size(); i++) {
modelo3.addElement(AlmacenConsultoria.getInstance().getListaConsultoria().get(i));
}
jList_consultoria.setModel(modelo3);
}
});

} else if (n == JOptionPane.NO_OPTION) {

}

} else {
// PREFERENCIAS SERVIDOR FTP
JTextField jTF_dirFTP = new JTextField();
JTextField jTF_usrFTP = new JTextField();
JPasswordField jTF_pssFTP = new JPasswordField();
final JComponent[] inputs = new JComponent[]{
new JLabel("Direccion del Servidor FTP"),
jTF_dirFTP,
new JLabel("Nombre de Usuario FTP"),
jTF_usrFTP,
new JLabel("Password de Usuario FTP"),
jTF_pssFTP
};

// seteamos jTF
jTF_dirFTP.setText(AlmacenPreferencias.getInstance().preferencias.getDirFTP());
jTF_usrFTP.setText(AlmacenPreferencias.getInstance().preferencias.getUsrFTP());
jTF_pssFTP.setText(AlmacenPreferencias.getInstance().preferencias.getPssFTP());

JOptionPane.showMessageDialog(null, inputs, "Preferencias del Servidor FTP", JOptionPane.PLAIN_MESSAGE);

AlmacenPreferencias.getInstance().preferencias.setDirFTP(jTF_dirFTP.getText());
AlmacenPreferencias.getInstance().preferencias.setUsrFTP(jTF_usrFTP.getText());
AlmacenPreferencias.getInstance().preferencias.setPssFTP(new String(jTF_pssFTP.getPassword()));
AlmacenPreferencias.getInstance().guardarPreferencias();
}
}

所以我想知道如何才能让它发挥作用。我希望我能正确地解释自己。

我还阅读了有关 RUNANDWAIT() 方法的信息,但似乎您无法从 EDT 调用它。所以...我现在有点迷失了。我是新手,所以请怜悯您的评论;)

提前致谢!!

Swing worker 所在的类(class):

public class DescargarDatosDelServidor extends JPanel implements PropertyChangeListener {

private JProgressBar progressBar;
private JTextArea taskOutput;
private Task task;
private static JFrame frame;
private String taskOutputString;
InputStream is = null;
FileOutputStream fos = null;
final String AbsolutePath = new File(".").getAbsolutePath();
final String imagesPath = AbsolutePath.substring(0, AbsolutePath.length() - 1);

class Task extends SwingWorker<Void, Void> {

@Override
protected Void doInBackground() {

String ftpDir = AlmacenPreferencias.getInstance().preferencias.getDirFTP();
String ftpUsr = AlmacenPreferencias.getInstance().preferencias.getUsrFTP();
String ftpPwd = AlmacenPreferencias.getInstance().preferencias.getPssFTP();

// DESCARGAR IMAGENES
taskOutputString = "de las imagenes del servidor descargadas\n";
int progress = 0;
setProgress(0);

FTPClient cliente1 = new FTPClient();

try {
cliente1.connect(ftpDir);
cliente1.login(ftpUsr, ftpPwd);

cliente1.enterLocalPassiveMode();
cliente1.setFileType(FTP.BINARY_FILE_TYPE);
cliente1.changeWorkingDirectory("html/androidlyc/imagenes");

FTPFile[] ftpFiles = cliente1.listFiles();

if (ftpFiles != null && ftpFiles.length > 0) {
//loop thru files
for (FTPFile file : ftpFiles) {
if (!file.isFile()) {
continue;
}
System.out.println("File is " + file.getName());

// descargar imagen
String dir = "imagenes";
File dirFile = new File(dir);
boolean existe = dirFile.mkdir();
File fileFile = new File(dirFile, file.getName());
fos = new FileOutputStream(fileFile);
cliente1.retrieveFile(file.getName(), fos);

// actualizamos progreso
progress += (100 / (ftpFiles.length));
setProgress(Math.min(progress, 100));
}
}

fos.close();
cliente1.logout();
cliente1.disconnect();

} catch (IOException ex) {
Logger.getLogger(DescargarDatosDelServidor.class.getName()).log(Level.SEVERE, null, ex);
}

//
//
// DESCARGAR seguros.XML
//
// Borrar datos de local
AlmacenSeguros.getInstance().getListaSeguros().clear();
AlmacenGestoria.getInstance().getListaGestoria().clear();
AlmacenConsultoria.getInstance().getListaConsultoria().clear();
File fileSegCheck1 = new File("seguros.dat");
File fileSegCheck2 = new File("gestoria.dat");
File fileSegCheck3 = new File("consultoria.dat");
if (fileSegCheck1.exists()) {
fileSegCheck1.delete();
}
if (fileSegCheck2.exists()) {
fileSegCheck2.delete();
}
if (fileSegCheck3.exists()) {
fileSegCheck3.delete();
}
//
// PARSEAR SEGUROS
//
taskOutputString = "de los datos de SEGUROS del servidor descargados\n";
progress = 0;
setProgress(0);

FTPClient cliente2 = new FTPClient();

try {
cliente2.connect(ftpDir);
cliente2.login(ftpUsr, ftpPwd);
cliente2.enterLocalPassiveMode();
cliente2.setFileType(FTP.BINARY_FILE_TYPE);
cliente2.changeWorkingDirectory("/html/androidlyc");

fos = new FileOutputStream("seguros.xml");
cliente2.retrieveFile("seguros.xml", fos);

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
File fileXML = new File("seguros.xml");
Document document = builder.parse(fileXML);

Element root = document.getDocumentElement();
NodeList items = root.getElementsByTagName("seguro");

for (int i = 0; i < items.getLength(); i++) {
Seguro seguroActual = new Seguro();
Node item = items.item(i);
NodeList datosSeguro = item.getChildNodes();
for (int j = 0; j < datosSeguro.getLength(); j++) {
Node dato = datosSeguro.item(j);
String etiqueta = dato.getNodeName();

if (etiqueta.equals("seg_tipo")) {
seguroActual.setSeg_tipo(dato.getTextContent());
} else if (etiqueta.equals("seg_subtipo")) {
seguroActual.setSeg_subtipo(dato.getTextContent());
} else if (etiqueta.equals("seg_title")) {
seguroActual.setSeg_title(dato.getTextContent());
} else if (etiqueta.equals("seg_descr")) {
seguroActual.setSeg_descr(dato.getTextContent());
} else if (etiqueta.equals("seg_carac_title")) {
seguroActual.setSeg_carac_title(dato.getTextContent());
} else if (etiqueta.equals("seg_carac")) {
seguroActual.setSeg_carac(dato.getTextContent());
} else if (etiqueta.equals("seg_cober_title")) {
seguroActual.setSeg_cober_title(dato.getTextContent());
} else if (etiqueta.equals("seg_cober")) {
seguroActual.setSeg_cober(dato.getTextContent());
} else if (etiqueta.equals("seg_pack_title1")) {
seguroActual.setSeg_pack_title1(dato.getTextContent());
} else if (etiqueta.equals("seg_pack1")) {
seguroActual.setSeg_pack1(dato.getTextContent());
} else if (etiqueta.equals("seg_pack_title2")) {
seguroActual.setSeg_pack_title2(dato.getTextContent());
} else if (etiqueta.equals("seg_pack2")) {
seguroActual.setSeg_pack2(dato.getTextContent());
} else if (etiqueta.equals("seg_pack_title3")) {
seguroActual.setSeg_pack_title3(dato.getTextContent());
} else if (etiqueta.equals("seg_pack3")) {
seguroActual.setSeg_pack3(dato.getTextContent());
} else if (etiqueta.equals("seg_pack_title4")) {
seguroActual.setSeg_pack_title4(dato.getTextContent());
} else if (etiqueta.equals("seg_pack4")) {
seguroActual.setSeg_pack4(dato.getTextContent());
} else if (etiqueta.equals("seg_pack_title5")) {
seguroActual.setSeg_pack_title5(dato.getTextContent());
} else if (etiqueta.equals("seg_pack5")) {
seguroActual.setSeg_pack5(dato.getTextContent());
} else if (etiqueta.equals("seg_imagen_url")) {
seguroActual.setSeg_imagen_url(dato.getTextContent());
}
seguroActual.setSeg_imagen_loc(imagesPath + "imagenes\\" + seguroActual.getSeg_imagen_url());
}
AlmacenSeguros.getInstance().guardarSeguro(seguroActual);

// actualizamos progreso
progress += (100 / (items.getLength()));
setProgress(Math.min(progress, 100));
}

fos.close();
cliente2.logout();
cliente2.disconnect();

} catch (IOException ex) {
Logger.getLogger(DescargarDatosDelServidor.class.getName()).log(Level.SEVERE, null, ex);
} catch (ParserConfigurationException ex) {
Logger.getLogger(DescargarDatosDelServidor.class.getName()).log(Level.SEVERE, null, ex);
} catch (SAXException ex) {
Logger.getLogger(DescargarDatosDelServidor.class.getName()).log(Level.SEVERE, null, ex);
}

//
// PARSEAR GESTORIA
//
taskOutputString = "de los datos de GESTORIA del servidor descargados\n";
progress = 0;
setProgress(0);

try {
DocumentBuilderFactory factory2 = DocumentBuilderFactory.newInstance();
DocumentBuilder builder2 = factory2.newDocumentBuilder();
File fileXML = new File("seguros.xml");
Document document2 = builder2.parse(fileXML);

Element root2 = document2.getDocumentElement();
NodeList items2 = root2.getElementsByTagName("gestoria");

for (int i = 0; i < items2.getLength(); i++) {
Gestoria gestoriaActual = new Gestoria();
Node item2 = items2.item(i);
NodeList datosGestoria = item2.getChildNodes();
for (int j = 0; j < datosGestoria.getLength(); j++) {
Node dato2 = datosGestoria.item(j);
String etiqueta2 = dato2.getNodeName();

if (etiqueta2.equals("ges_title")) {
gestoriaActual.setGes_title(dato2.getTextContent());
} else if (etiqueta2.equals("ges_area01_title")) {
gestoriaActual.setGes_area01_title(dato2.getTextContent());
} else if (etiqueta2.equals("ges_serv01_title")) {
gestoriaActual.setGes_serv01_title(dato2.getTextContent());
} else if (etiqueta2.equals("ges_serv01")) {
gestoriaActual.setGes_serv01(dato2.getTextContent());
} else if (etiqueta2.equals("ges_cuota01_title")) {
gestoriaActual.setGes_cuota01_title(dato2.getTextContent());
} else if (etiqueta2.equals("ges_cuota01")) {
gestoriaActual.setGes_cuota01(dato2.getTextContent());
} else if (etiqueta2.equals("ges_area02_title")) {
gestoriaActual.setGes_area02_title(dato2.getTextContent());
} else if (etiqueta2.equals("ges_serv02_title")) {
gestoriaActual.setGes_serv02_title(dato2.getTextContent());
} else if (etiqueta2.equals("ges_serv02")) {
gestoriaActual.setGes_serv02(dato2.getTextContent());
} else if (etiqueta2.equals("ges_cuota02_title")) {
gestoriaActual.setGes_cuota02_title(dato2.getTextContent());
} else if (etiqueta2.equals("ges_cuota02")) {
gestoriaActual.setGes_cuota02(dato2.getTextContent());
} else if (etiqueta2.equals("ges_area03_title")) {
gestoriaActual.setGes_area03_title(dato2.getTextContent());
} else if (etiqueta2.equals("ges_serv03_title")) {
gestoriaActual.setGes_serv03_title(dato2.getTextContent());
} else if (etiqueta2.equals("ges_serv03")) {
gestoriaActual.setGes_serv03(dato2.getTextContent());
} else if (etiqueta2.equals("ges_cuota03_title")) {
gestoriaActual.setGes_cuota03_title(dato2.getTextContent());
} else if (etiqueta2.equals("ges_cuota03")) {
gestoriaActual.setGes_cuota03(dato2.getTextContent());
} else if (etiqueta2.equals("ges_imagen_url")) {
gestoriaActual.setGes_imagen_url(dato2.getTextContent());
}
gestoriaActual.setGes_imagen_loc(imagesPath + "imagenes\\" + gestoriaActual.getGes_imagen_url());
}
AlmacenGestoria.getInstance().guardarGestoria(gestoriaActual);

// actualizamos progreso
progress += (100 / (items2.getLength()));
setProgress(Math.min(progress, 100));
}

} catch (IOException ex) {
Logger.getLogger(DescargarDatosDelServidor.class.getName()).log(Level.SEVERE, null, ex);
} catch (ParserConfigurationException ex) {
Logger.getLogger(DescargarDatosDelServidor.class.getName()).log(Level.SEVERE, null, ex);
} catch (SAXException ex) {
Logger.getLogger(DescargarDatosDelServidor.class.getName()).log(Level.SEVERE, null, ex);
}

//
// PARSEAR CONSULTORIA
//
taskOutputString = "de los datos de CONSULTORIA del servidor descargados\n";
progress = 0;
setProgress(0);

try {
DocumentBuilderFactory factory3 = DocumentBuilderFactory.newInstance();
DocumentBuilder builder3 = factory3.newDocumentBuilder();
File fileXML = new File("seguros.xml");
Document document3 = builder3.parse(fileXML);

Element root3 = document3.getDocumentElement();
NodeList items3 = root3.getElementsByTagName("consultoria");

for (int i = 0; i < items3.getLength(); i++) {
Consultoria consultoriaActual = new Consultoria();
Node item3 = items3.item(i);
NodeList datosConsultoria = item3.getChildNodes();
for (int j = 0; j < datosConsultoria.getLength(); j++) {
Node dato3 = datosConsultoria.item(j);
String etiqueta3 = dato3.getNodeName();

if (etiqueta3.equals("con_title")) {
consultoriaActual.setCon_title(dato3.getTextContent());
} else if (etiqueta3.equals("con_resumen")) {
consultoriaActual.setCon_resumen(dato3.getTextContent());
} else if (etiqueta3.equals("con_texto")) {
consultoriaActual.setCon_texto(dato3.getTextContent());
} else if (etiqueta3.equals("con_imagen_url")) {
consultoriaActual.setCon_imagen_url(dato3.getTextContent());
}
consultoriaActual.setCon_imagen_loc(imagesPath + "imagenes\\" + consultoriaActual.getCon_imagen_url());
}
AlmacenConsultoria.getInstance().guardarConsultoria(consultoriaActual);

// actualizamos progreso
progress += (100 / (items3.getLength()));
setProgress(Math.min(progress, 100));
}

} catch (IOException ex) {
Logger.getLogger(DescargarDatosDelServidor.class.getName()).log(Level.SEVERE, null, ex);
} catch (ParserConfigurationException ex) {
Logger.getLogger(DescargarDatosDelServidor.class.getName()).log(Level.SEVERE, null, ex);
} catch (SAXException ex) {
Logger.getLogger(DescargarDatosDelServidor.class.getName()).log(Level.SEVERE, null, ex);
}

return null;
}

// @Override
// protected void process(List<Void> list) {
// super.process(list); //To change body of generated methods, choose Tools | Templates.
// }
@Override
protected void done() {
frame.dispose();
JOptionPane.showMessageDialog(null, "Todos los datos del servidor han sido descargados en local.", "Descargar datos", JOptionPane.PLAIN_MESSAGE);
}
}

public DescargarDatosDelServidor() {
super(new BorderLayout());

// Create the demo's UI.
progressBar = new JProgressBar(0, 100);
progressBar.setValue(0);
progressBar.setStringPainted(true);
progressBar.setPreferredSize(new Dimension(500, 30));

taskOutput = new JTextArea(10, 40);
taskOutput.setMargin(new Insets(5, 5, 5, 5));
taskOutput.setEditable(false);

JPanel panel = new JPanel();
panel.add(progressBar, BorderLayout.NORTH);

add(panel, BorderLayout.PAGE_START);
add(new JScrollPane(taskOutput), BorderLayout.CENTER);
setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

task = new Task();
task.addPropertyChangeListener(this);
task.execute();
}

@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("progress")) {
int progress = (Integer) evt.getNewValue();
progressBar.setValue(progress);
taskOutput.append(String.format("%d%% " + taskOutputString, task
.getProgress()));
}
}

public static void createAndShowGUI() {
// Create and set up the window.
frame = new JFrame("Descargando datos del servidor...");
//frame.setSize(400, 600);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

// Create and set up the content pane.
JComponent newContentPane = new DescargarDatosDelServidor();
newContentPane.setOpaque(true); // content panes must be opaque
frame.setContentPane(newContentPane);

// Display the window.
frame.pack();
frame.setVisible(true);
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation(dim.width / 2 - frame.getSize().width / 2, dim.height / 2 - frame.getSize().height / 2);
frame.setAlwaysOnTop(true);
}
}

最佳答案

让您的工作人员能够访问 View 组件的模型。对其模型的更改将更新监听的JList。在此example ,该模型是从封闭类引用的,但您可以将引用传递给工作器的构造函数。

附录:如何让工作人员访问 JList 模型?_

例如,给定以下工作器声明,将 ListModel 作为参数传递到合适的构造函数中,并在 process() 的实现中更新模型:

class MyTask extends SwingWorker<List<…>, …> {

MyTask(ListModel model) {

}
}

关于java - 从 swingworker 或在 swingworker 之后更新 JList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23742354/

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