2016-10-29 1 views
0

Je travaille sur un cadre de connexion où je récupère et remplit JComboBox avec des bases de données créées par l'utilisateur, puis je règle le texte de JLabel sur la base de Item sélectionné de JComboBox. Je veux retarder l'exécution et afficher le texte 'Connexion ...' dans JLabel lorsque l'utilisateur sélectionne un élément de JComboBox mais quand je sélectionne un élément, l'interface se fige et après 5 secondes il affiche 'Connecté' Il ignore le 'Connexion. .. 'JLabel.GUI geler lorsque JCombobox sélectionné, Comment utiliser Timer dans l'application Swing avec condition Statement dans actionListener?

Un grand merci à l'avance.

package com.softoak.dba; 

import java.awt.Color; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 

import java.awt.Font; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 
import java.util.ArrayList; 
import java.util.concurrent.TimeUnit; 

import javax.swing.JComboBox; 

public class Login{ 

private JFrame frame; 
static ArrayList<String> dbcom = new ArrayList<String>(); 
static String[] usecom; 
JLabel status = new JLabel("•"); 
JLabel lblNotConnected; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) throws Exception{ 
    Connection m_Connection = DriverManager.getConnection("jdbc:sqlserver://localhost;integratedSecurity=true"); 

    String dbs = "SELECT * FROM sys.databases WHERE owner_sid != 1"; 

    Statement st = m_Connection.createStatement(); 

    ResultSet m_ResultSet = st.executeQuery(dbs); 
    dbcom.add("-None-"); 

    while(m_ResultSet.next()){ 
     dbcom.add(m_ResultSet.getString(1)); 
    } 
    usecom = new String[dbcom.size()]; 
    usecom = dbcom.toArray(usecom); 

    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       Login window = new Login(); 
       window.frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the application. 
*/ 
public Login() { 
    initialize(); 
} 

/** 
* Initialize the contents of the frame. 
*/ 

private void initialize() { 
    frame = new JFrame(); 
    frame.setBounds(100, 100, 450, 300); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout(null); 

    status.setBounds(385, 235, 10, 10); 
    status.setForeground(Color.red); 
    frame.getContentPane().add(status); 

    JLabel lblLoginApplication = new JLabel("Login Application"); 
    lblLoginApplication.setFont(new Font("Lucida Calligraphy", Font.BOLD, 20)); 
    lblLoginApplication.setBounds(120, 25, 220, 30); 
    frame.getContentPane().add(lblLoginApplication); 

    JComboBox comboBox = new JComboBox(usecom); 
    comboBox.setBounds(230, 80, 110, 30); 
    comboBox.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (comboBox.getSelectedIndex() == 1 || comboBox.getSelectedIndex() == 2) { 
        lblNotConnected.setText("Connecting..."); 
        try{ 
         Thread.sleep(5000); 
        }catch(InterruptedException ex){ 
         JOptionPane.showMessageDialog(null,ex.getMessage()); 
        } 
        status.setForeground(Color.green); 
        lblNotConnected.setText("Connected"); 
        JOptionPane.showMessageDialog(null, "Connected"); 
       } 
        else{ 
         status.setForeground(Color.red); 
         lblNotConnected.setText("Not Connected"); 
        } 
       } 
     }); 
    frame.getContentPane().add(comboBox); 

    JLabel lblSelectDatabase = new JLabel("Select Database"); 
    lblSelectDatabase.setFont(new Font("Microsoft Sans Serif", Font.BOLD, 14)); 
    lblSelectDatabase.setBounds(91, 79, 129, 30); 
    frame.getContentPane().add(lblSelectDatabase); 

    lblNotConnected = new JLabel("Not Connected"); 
    lblNotConnected.setFont(new Font("Elephant", Font.PLAIN, 12)); 
    lblNotConnected.setBounds(280, 230, 110, 20); 
    frame.getContentPane().add(lblNotConnected); 
} 

}

Répondre

2

code exécuté dans un auditeur exécute sur le Event Dispatch Thread(EDT). Lorsque vous utilisez Thread.sleep() cela provoque le sommeil de l'EDT ce qui signifie que l'interface graphique ne peut pas se repeindre. Lisez la section du tutoriel Swing sur Concurrency pour plus d'informations.

Toute tâche potentiellement longue ne devrait pas s'exécuter sur l'EDT pour la raison ci-dessus. Au lieu de cela, vous devez utiliser un thread distinct. Découvrez le SwingWorker du tutoriel ci-dessus. Vous pouvez utiliser Thread.sleep() ici et publier des valeurs à afficher comme vous le souhaitez.

Cependant, pourquoi voudriez-vous que l'utilisateur attende 5 secondes? Je sais que je serais frustré. Peut-être que vous devriez plutôt utiliser un ProgressMonitor pour indiquer à l'utilisateur que vous êtes en train d'exécuter une tâche de longue durée. Lire la section du tutoriel Swing sur How to Use Progress Bars pour plus d'informations et des exemples de travail.

+0

Merci. Je voulais juste que le delay s'amuse, sinon il fonctionne parfaitement bien. En outre, je ne pouvais pas comprendre le terme EDT (Event Dispatch Thread) car je suis un débutant en GUI. –

+0

Quelqu'un peut-il s'il vous plaît fournir le bon code de le faire correctement. –

+0

Je vous ai déjà donné deux possibilités. C'est à ça que servent les liens du tutoriel. Ils fournissent le code pour le faire correctement. Lisez le tutoriel. téléchargez les exemples et jouez avec eux. Nous ne sommes pas ici pour écrire le code pour vous. – camickr