我必须查询数据库以获取要写入的数据JLabel
并加速打开对话框
我没有创建JLabel
任何文本,并在完成SwingWorker
处理后设置了文本
但是JLabel
文字没有更新
有什么办法可以做到这一点
这是我对话框的src代码:
package com.caisse.caisseFrame.dialogs;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.SwingWorker;
import com.caisse.ConnectDB;
import com.caisse.CustomComponent.JButtonCustom;
import com.caisse.CustomComponent.JPanelCustom;
import com.caisse.caisseFrame.CaisseFrame;
import com.soqop.caisse.dao.TicketDAO;
public class LectureXDialog extends JDialog {
/**
*
*/
private static final long serialVersionUID = 1L;
JButton ok_btn;
TicketDAO ticketDAO;
public LectureXDialog(final CaisseFrame parent) {
setAlwaysOnTop(true);
setSize(new Dimension(300, 280));
setLocationRelativeTo(parent);
setTitle("Lecture X");
setVisible(true);
setModalityType(ModalityType.DOCUMENT_MODAL);
parent.setEnabled(false);
ticketDAO = new TicketDAO(ConnectDB.getInstance());
final JPanelCustom componentsPanel = new JPanelCustom();
GridBagLayout componentsPanelLayout = new GridBagLayout();
componentsPanel.setLayout(componentsPanelLayout);
final JLabel lectureXlabel = new JLabel();
lectureXlabel.setFont(new Font("Cambria", Font.BOLD, 24));
lectureXlabel.setPreferredSize(new Dimension(250, 55));
lectureXlabel.setMinimumSize(new Dimension(250, 55));
GridBagConstraints gbc_lectureXlabel = new GridBagConstraints();
gbc_lectureXlabel.insets = new Insets(2, 2, 2, 2);
gbc_lectureXlabel.gridx = 0;
gbc_lectureXlabel.gridy = 0;
gbc_lectureXlabel.anchor = GridBagConstraints.CENTER;
componentsPanel.add(lectureXlabel, gbc_lectureXlabel);
ok_btn = new JButtonCustom("ok");
ok_btn.setFont(new Font("Cambria", Font.BOLD, 24));
try {
Image img = ImageIO.read(getClass().getResource("/resources/ok.png"));
ok_btn.setIcon(new ImageIcon(img));
} catch (IOException e1) {
e1.printStackTrace();
}
ok_btn.setPreferredSize(new Dimension(150, 55));
ok_btn.setMinimumSize(new Dimension(150, 55));
ok_btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
parent.setEnabled(true);
parent.setFocus();
LectureXDialog.this.dispose();
}
});
GridBagConstraints gbc_ok_btn = new GridBagConstraints();
gbc_ok_btn.insets = new Insets(2, 2, 2, 2);
gbc_ok_btn.gridx = 0;
gbc_ok_btn.gridy = 1;
componentsPanel.add(ok_btn, gbc_ok_btn);
add(componentsPanel);
addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent windowEvent) {
parent.setEnabled(true);
parent.setFocus();
LectureXDialog.this.dispose();
}
});
SwingWorker worker = new SwingWorker<Boolean, Void>() {
String text = "";
@Override
public Boolean doInBackground() {
text = "<html><center>Lecture X : " + ticketDAO.getLectureX() + "</center></html>";
return true;
}
@Override
public void done() {
lectureXlabel.setText(text);
lectureXlabel.revalidate();
lectureXlabel.repaint();
componentsPanel.revalidate();
componentsPanel.repaint();
getContentPane().revalidate();
getContentPane().repaint();
}
};
}
}
为了使您Swing Worker
能够进行后台工作,您需要调用SwingWorker#execute()
方法。如果您不添加它,那么…它将不知道何时开始工作。就像其他任何变量一样:
JLabel label = new JLabel("Hello world");
但是,如果您从未将其添加label
到任何内容(或未ActionListener
添加到JButton
),则将永远不会添加/执行该内容。
worker.execute();
在构造函数内部或您希望其开始工作的任何地方。
根据@MadProgrammer的评论:
请记住,
SwingWorker
可以返回数据,因此Boolean
可以String
使用方法实例字段返回,而不是返回,而是可以get
在done
方法中返回并使用它来获取工作程序的返回值,该方法更安全,更实用。
他指的是这样更改您的工人的代码:
SwingWorker worker = new SwingWorker<Boolean, Void>() {
@Override
public String doInBackground() {
return "<html><center>Lecture X : " + ticketDAO.getLectureX() + "</center></html>";
}
@Override
public void done() {
lectureXlabel.setText(get());
lectureXlabel.revalidate();
lectureXlabel.repaint();
componentsPanel.revalidate();
componentsPanel.repaint();
getContentPane().revalidate();
getContentPane().repaint();
}
};
问题内容: 我有一个使用JPA的项目J2SE。在某些JDialogs中,我确实返回并在类的构造函数中填充JTable,JComboBox,JList等。 因此,当我为这些对话框创建任何实例时,有时会很慢。 我认为使用SwingWorker和JProgressbar并创建一个(加载)来打开JDialogs是一个很好的解决方案,但是我不知道该怎么做。 我正在尝试这个。 如何打开JDialog并创建要使
场景如下: 将windowOpened()处理程序添加到JDialog的新实例 首次使用jdialog显示对话框。setVisible(true) 如预期:windowOpened()处理程序已触发 jdialog。setVisible(false) jdialog。setVisible(true) 预期,但未发生:windowOpened()处理程序已触发 当我的模态对话框第一次出现在屏幕上时,
我创建了一个自定义的JDialog,其中有一些处于内部状态,我想在JDialog关闭后在父JFrame中查询这些状态。我将JDialog的模态设置为“true”,这会阻止JFrame,直到JDialog被释放。 在JDialog中,我更新状态并使用用户交互调用dispose。我验证状态是否已更新。但是,当JDialog关闭后父帧恢复时,我查询的状态不是我将JDialog设置为的状态。我不确定我在这
问题内容: 我正在尝试制作一个JDialog,它将在JLabel上向用户显示动态消息。该消息应该是从1到10的计数(并且应该每秒更改一个数字)。问题是,当我进行调试时- 它在“ dia.setVisible(true);”之后立即停止 ,除非我将关闭JDialog,否则它将不会继续。有什么可能的解决办法?谢谢。 看一下代码: 问题答案: 不要用于Swing GUI,导致冻结直到结束 使用而不是通过
问题内容: 我想用setText()方法更新jlabel和jtextfield,但是它不起作用。但是,其余代码仍在工作。代码如下; 在这里,islemSureci是JLabel,而textFiled是JTextField。设置它们后,它不起作用。代码中的所有工作完成后,它们就会出现。请问原因是什么? 问题答案: 我认为您的意思是 “所有工作完成之后” 是从文件(您注释的行)中加载文本。我认为这段代
问题内容: 当我打开自定义JDialog以及关闭对话框以再次继续时,如何使我的应用程序暂停。 问题答案: 只需使用: 我通常从的构造函数中调用它。 请参阅中的Javadocs 。 http://java.sun.com/javase/6/docs/api/java/awt/Dialog.html#setModal(boolean) 这将导致执行在当前线程上阻塞,直到对话框关闭。 或者,您可以使用: