Java 打开jdialog后更新jlabel文本
我必须查询数据库以获取要在Java 打开jdialog后更新jlabel文本,java,swing,jlabel,swingworker,Java,Swing,Jlabel,Swingworker,我必须查询数据库以获取要在JLabel上写入的数据,并加快打开对话框的速度 我已经创建了无文本的JLabel,并在完成SwingWorker过程后设置了文本 但是JLabel文本不会被更新 有没有办法做到这一点 以下是我的对话框的src代码: package com.caisse.caisseFrame.dialogs; import java.awt.Dimension; import java.awt.Font; import java.awt.GridBagConstraints; im
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();
}
};
}
}
package com.caisse.caisseFrame.dialogs;
导入java.awt.Dimension;
导入java.awt.Font;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.Image;
导入java.awt.Insets;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.io.IOException;
导入javax.imageio.imageio;
导入javax.swing.ImageIcon;
导入javax.swing.JButton;
导入javax.swing.JDialog;
导入javax.swing.JLabel;
导入javax.swing.SwingWorker;
导入com.caisse.ConnectDB;
导入com.caisse.CustomComponent.JButtonCustom;
导入com.caisse.CustomComponent.JPanelCustom;
导入com.caisse.caisseFrame.caisseFrame;
导入com.soqop.caisse.dao.TicketDAO;
公共类讲师对话框扩展JDialog{
/**
*
*/
私有静态最终长serialVersionUID=1L;
JButton ok_btn;
TicketDAO TicketDAO;
公共讲师对话框(最终CaisseFrame父级){
setAlwaysOnTop(真);
设置尺寸(新尺寸(300280));
setLocationRelativeTo(父级);
片名(“第十讲”);
setVisible(真);
setModalityType(ModalityType.DOCUMENT_MODAL);
parent.setEnabled(false);
ticketDAO=newticketdao(ConnectDB.getInstance());
最终JPanelCustom组件spanel=新JPanelCustom();
GridBagLayout组件SpanelLayout=新的GridBagLayout();
componentsPanel.setLayout(componentsPanelLayout);
最终的JLabel标签=新的JLabel();
setFont(新字体(“Cambria”,Font.BOLD,24));
讲师标签。设置首选尺寸(新尺寸(250,55));
讲师标签。设置最小尺寸(新尺寸(250,55));
GridBagConstraints gbc_讲师标签=新的GridBagConstraints();
gbc_讲师ExLabel.insets=新的插图(2,2,2,2);
gbc_-exlabel.gridx=0;
gbc_=0;
gbc_texlabel.anchor=GridBagConstraints.CENTER;
组件spanel.add(讲师标签、gbc_讲师标签);
ok_btn=新的JButtonCustom(“ok”);
ok_btn.setFont(新字体(“Cambria”,Font.BOLD,24));
试一试{
Image img=ImageIO.read(getClass().getResource(“/resources/ok.png”);
ok_btn.设置图标(新图像图标(img));
}捕获(IOE1异常){
e1.printStackTrace();
}
ok_btn.设置首选尺寸(新尺寸(150,55));
确定最小尺寸(新尺寸(150,55));
ok_btn.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
parent.setEnabled(true);
setFocus();
depose();
}
});
GridBagConstraints gbc_ok_btn=新的GridBagConstraints();
gbc_ok_btn.insets=新的插图(2,2,2,2);
gbc_ok_btn.gridx=0;
gbc_ok_btn.gridy=1;
组件spanel.add(ok_btn,gbc_ok_btn);
添加(组件spanel);
addWindowListener(新java.awt.event.WindowAdapter(){
@凌驾
公共无效窗口关闭(java.awt.event.WindowEvent){
parent.setEnabled(true);
setFocus();
depose();
}
});
SwingWorker worker=新SwingWorker(){
字符串文本=”;
@凌驾
公共布尔doInBackground(){
text=“讲座X:+ticketDAO.get讲师()+”;
返回true;
}
@凌驾
公众假期结束(){
讲师标签.setText(文本);
讲师标签。重新验证();
repaint();
组件spanel.revalidate();
组件spanel.repaint();
getContentPane().revalidate();
getContentPane().repaint();
}
};
}
}
要使您的Swing Worker
执行后台工作,您需要调用该方法。如果你不加上它,那么。。。它不知道什么时候开始工作。它与其他变量类似,如:
JLabel label = new JLabel("Hello world");
但是,如果您从未将标签添加到任何内容(或者像ActionListener
那样未添加到JButton
)中,它将永远不会被添加/执行
worker.execute();
在构造器内部或您希望它开始工作的任何地方
根据@MadProgrammer的评论:
请记住,SwingWorker
可以返回数据,因此您可以返回String
而不是返回Boolean
,并在done
方法中使用get
来获取工作人员的返回,这比使用实例字段更安全、更可用
他指的是像这样更改员工的代码:
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();
}
};
SwingWorker-worker=新的SwingWorker(){
@凌驾
公共字符串doInBackground(){
返回“讲座X:+ticketDAO.get讲师()+”;
}
@凌驾
公众假期结束(){
setText(get());
讲师标签。重新验证();
repaint();
组件spanel.revalidate();
组件spanel.repaint();
getContentPane().revalidate();
getContentPane().repaint();
}
};
要使您的Swing Worker
执行后台工作,您需要调用该方法。如果你不加上它,那么。。。它不知道什么时候开始工作。它与其他变量类似,如:
JLabel label = new JLabel("Hello world");
但是如果你从未将标签添加到任何东西中(或者像ActionListener
那样没有添加到