2017-02-15 2 views
0

Je dois base de données interroger pour obtenir des données à écrire sur JLabel et pour accélérer l'ouverture de dialoguemise à jour du texte JLabel après l'ouverture JDialog

J'ai créé JLabel sans texte et texte figurant après fait un processus SwingWorker

mais JLabel texte ne sera mis à jour

N'est-il possible d'y parvenir

Voici le code de mon dialogue 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(); 
      } 
     }; 

    } 

} 
+1

Vous ne l'avez pas appelé 'worker.execute();' partout, de sorte que le travailleur n'est pas exécuté ... – Frakcool

+1

Rappelez-vous, 'SwingWorker' peut renvoyer des données, donc au lieu de retourner' boolean', vous pourrait renvoyer 'String' et utiliser' get' dans la méthode 'done' pour obtenir les retours de l'ouvrier, un peu plus sûr et plus utilisable, puis utiliser un champ d'instance – MadProgrammer

Répondre

2

Pour que votre Swing Worker effectue le travail en arrière-plan, vous devez appeler la méthode SwingWorker#execute(). Si vous ne l'ajoutez pas, eh bien ... il ne saura pas quand commencer à travailler. Il est comme toute autre variable comme:

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

Mais si vous n'ajoutez que label à quoi que ce soit (ou comme un ActionListener pas ajouté à la JButton) il ne sera jamais ajouté/exécuté.

worker.execute(); 

À l'intérieur de votre constructeur ou là où vous le voulez, il commence à fonctionner.


Selon le commentaire de @ MadProgrammer:

Rappelez-vous, SwingWorker peut renvoyer des données, donc au lieu de retourner Boolean, vous pourriez revenir String et utiliser get dans la méthode done pour obtenir le retour du travailleur , un peu plus sûr et plus utilisable, puis en utilisant un champ d'instance

Il se réfère à changer le code de votre travailleur comme ceci:

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