当前位置: 首页 > 面试题库 >

打开jdialog后更新jlabel文本

易阳朔
2023-03-14
问题内容

我必须查询数据库以获取要写入的数据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使用方法实例字段返回,而不是返回,而是可以getdone方法中返回并使用它来获取工作程序的返回值,该方法更安全,更实用。

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

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) 这将导致执行在当前线程上阻塞,直到对话框关闭。 或者,您可以使用: