打开jdialog后更新jlabel文本 [英] update jlabel text after opening jdialog

查看:51
本文介绍了打开jdialog后更新jlabel文本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须查询数据库以获取要写入JLabel的数据并加速打开对话框

I have to query database to get data to write on JLabel and to accelerate opening dialog

我创建了没有文字的JLabel,并在执行SwingWorker程序后设置了文字

I have created JLabel with no text and set text after done a SwingWorker process

JLabel文本不会更新

有什么办法可以实现这一目标

Is there any way to achieve this

这是我对话框的src代码:

Here is my dialog's src code:

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进行后台工作,您需要调用

To make your Swing Worker to do the background work you need to call the SwingWorker#execute() method. If you don't add it, well... it won't know when to start working. It's like any other variable like:

JLabel label = new JLabel("Hello world");

但是,如果您从未将label添加到任何内容(或未添加到JButtonActionListener),则将永远不会添加/执行.

But if you never add that label to anything (or like an ActionListener not added to the JButton) it will never be added / executed.

worker.execute();

在构造函数内部或您希望其开始工作的任何地方.

Inside your constructor or wherever you want it to start working.

根据@MadProgrammer的评论:

As per @MadProgrammer's comment:

请记住,SwingWorker可以返回数据,因此您可以返回String并在done方法中使用get来获取工作人员的返回,而不是返回Boolean,这在某种程度上更安全​​且更可用然后使用实例字段

Remember, SwingWorker can return data, so instead of returning Boolean, you could return String and use get in the done method to get the returns of the worker, somewhat safer and more usable then using an instance field

他指的是这样更改您工人的密码:

He refers to change your worker's code like this:

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();
    }
};

这篇关于打开jdialog后更新jlabel文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆