- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我有一个 JList 的自定义单元格渲染器,它在其中显示一个嵌套的 JList 和另一个显示按钮的自定义单元格渲染器。我遇到的问题是任何用户输入(例如鼠标点击按钮、滚动操作)都没有得到处理,嵌套的 J
所以,我有两个选项卡,两个选项卡都有 JList,并且都有一个存储数据的数组列表,现在我需要找到一种方法,可以将数据从一个选项卡中的一个 JList 复制到另一个选项卡中的另一个 JList。 谢谢
您好,我需要有关填充第二个 Jlist 的紧急帮助,我已成功从数据库填充第一个 Jlist,但在找到填充第二个 Jlist 的方法时遇到了巨大困难。 我愿意, 从 Jlist1 中选择,单击按钮,将所
我有两个 Jlist( block 列表和层列表),当我单击层列表中的不同项目时,我尝试更新 block 列表的值。由于某种原因它不起作用。这是我的代码: JButton openButton,
如何从 JList 中获取 3 个单独的字符串?如果我使用 model.elementAt ,我会得到字符串,但它们不会彼此分离。 数据如何存储在 JList 中? 我可以使用数组将数据彼此分开吗?
我正在尝试创建一个循环,将项目添加到 jlist,但是当我放入 actionlistener 时,它似乎没有这样做...... textFieldSearch.addActionListener(ne
美好的一天,我是窗口构建器的新手(64 位 mac eclipse,如果重要的话)。鉴于教程代码中的错误数量,我猜它最近已经更新了很多。 基本上,我有一个位于面板中的 jlist 中的项目列表,以及位
我一直在这里进行研究并一直在寻找问题的解决方案。我是java新手,所以我不知道所有的语法。我试图让我的代码使用 jlist 之间的按钮将项目从一个 jlist 传输到另一个 jlist。左侧列表包含开
我创建了一个菜单,其中有 4 个类(class)。我为每道菜创建了一个 Jlist,其中包含不同的元素。我如何知道让这些选定的项目显示在另一个包含 Jlist 的类中的另一个 Jlist 中。 最佳答
我有一个 MySQL 数据库,其中包含我想填充到我的 Java 程序中的 JList 中的数据。我有两个 JList,一个填充事件标题,第二个填充客人姓名。 我想要的是当用户单击任何事件标题时,第二个
这是我的代码。为什么这些值没有进入第二个 JList?此外,第二个 Jlist 不可见。所有导入均已到位,并且在以下代码中不可见: public class Gui extends JFrame {
我有以下代码在工作 made_list.setListData(original_list.getSelectedValues()); 这里made_list是一个JList,original_lis
这是任何人都可以轻松快速运行的代码,它显示了我的问题: import java.awt.Color; import java.awt.Component; import java.awt.EventQ
这个问题已经有答案了: How to clear a JList in Java? (4 个回答) 已关闭 9 年前。 我正在使用 jlist.removeall 删除 jlist 中的所有项目,但它
我有一个 JList,它将根据用户指向选定的 JList。它的作用就像一个监视器,将监视选定的 JList。当我实现自定义单元格渲染器并以编程方式执行诸如 this.list = getSelecte
我有一个工作得非常完美的自定义渲染器 - 我如何将它用作“绘图引擎”来生成与 JList 中生成的相同对象? 最佳答案 how can I use it as a "drawing engine" t
我的程序是基于API的。我有一个 JList 和一个有一些名称的模型。还有一个用于获取所选项目的 selectListener 和一个按钮,用于将该项目发送到另一个窗口,该窗口还有另一个这是我的第一个
请耐心等待。我有一个包含 3 个 JList 的 Denist 程序。添加患者的患者 JList、添加患者历史的历史 jlist 以及应与历史 jlist 和患者 jlist 链接的发票历史。我让他们
我在这里遇到了一个问题,我创建了一个actionListener,它的目的是创建一个随机的人类并将其添加到JList以显示在JScrollPane上。到目前为止,一切都很顺利,除了每当我单击 JBut
我正在尝试创建一个带有 JList 和按钮的表单我想要做的是从 JList 中选择一个项目,然后按下按钮以根据选择执行操作。但是,一旦点击按钮,JList 就会失去焦点,选择消失,导致按钮无法确定选择
我是一名优秀的程序员,十分优秀!