Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 打开jdialog后更新jlabel文本_Java_Swing_Jlabel_Swingworker - Fatal编程技术网

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
那样没有添加到