Когда я выполняю получить LDAPConnection через Swing, он зависает - PullRequest
1 голос
/ 15 сентября 2009

Когда я запускаю следующий код через метод Main, он работает нормально, но когда я пытаюсь выполнить его по нажатию на кнопку поворота, он зависает.

Пожалуйста, помогите

import java.util.Hashtable;

import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

public class SimpleLdapAuthentication {
    public static void main(String[] args) {
        String username = "user";
        String password = "password";
        String base = "ou=People,dc=objects,dc=com,dc=au";
        String dn = "uid=" + username + "," + base;
        String ldapURL = "ldap://ldap.example.com:389";

        // Setup environment for authenticating

        Hashtable<String, String> environment = new Hashtable<String, String>();
        environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        environment.put(Context.PROVIDER_URL, ldapURL);
        environment.put(Context.SECURITY_AUTHENTICATION, "simple");
        environment.put(Context.SECURITY_PRINCIPAL, dn);
        environment.put(Context.SECURITY_CREDENTIALS, password);

        try {
            DirContext authContext =
            new InitialDirContext(environment);

            // user is authenticated
        } catch (AuthenticationException ex) {

            // Authentication failed

        } catch (NamingException ex) {
            ex.printStackTrace();
        }
    }
}

Ответы [ 4 ]

1 голос
/ 15 сентября 2009

Это действительно зависает, или просто долго возвращаться?

Не стоит делать большую обработку в обработчике событий Swing, поскольку Swing должен реагировать на действия пользователя. Вы должны делегировать длительные действия другому потоку.

0 голосов
/ 10 декабря 2010

Вы должны помнить, что код в слушателе событий не будет выполняться в отдельном потоке. Он всегда будет работать в потоке диспетчеризации событий (EDT), и пока этот код работает, никакие другие обновления графического интерфейса будут невозможны, и приложение будет выглядеть как зависшее. Прочитайте Создание адаптивных пользовательских интерфейсов с помощью Swing , чтобы понять больше. Вот небольшой пример кода, который демонстрирует передачу задачи другому потоку. Я даже оставил место для вас, чтобы вставить ваш вызов LDAP!

package examples;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class EDTSeparation {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame();
                f.setLayout(new GridLayout(2, 1));

                final JLabel label = new JLabel("");
                f.add(label);
                f.add(new JButton(new AbstractAction("Do Task") {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        // This method will be executed on the EDT
                        label.setText("Working...");

                        // Create a new Thread to do the long-running task so this method can finish quickly.
                        Thread t = new Thread(new LDAPTask(label));
                        t.setDaemon(true);
                        t.start();
                    }
                }));

                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.pack();
                f.setVisible(true);
            }
        });
    }

    private static class LDAPTask implements Runnable {
        private final JLabel label;

        public LDAPTask(JLabel label) {
            this.label = label;
        }

        @Override
        public void run() {
            try {
                // Use sleep to simulate something taking a long time.
                // Replace this your long-running method call.
                Thread.sleep(1000);

                // If you need to handle GUI components, it must be done on the EDT
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        label.setText("Done.");
                    }
                });
            } catch (InterruptedException e) {
            }
        }
    }
}
0 голосов
/ 16 сентября 2009

Используйте ActionListener вместо MouseListener

    btnYourLdapButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ev) {
            doLdapRequest(ev);
        }
    });
0 голосов
/ 15 сентября 2009

правильно, это 1 из кодов, которые я пробовал ... и это прослушиватель событий AWT. Но расскажите, в чем проблема, выполняя это таким образом. Если LDAPConnection работает с основным методом, почему не работает со слушателем событий? Я видел похожие посты на многих форумах и не смог получить разрешение

...