Два вопроса по использованию Window Listeners в Java Swing Desktop - PullRequest
1 голос
/ 25 апреля 2011

**** Обратите внимание, что мой вопрос касается ответов в другой ветке. Однако, когда я разместил вопрос в этой теме, он был удален. Итак, я публикую здесь вопрос (со ссылкой на конкретный пост, на который я ссылаюсь). ****

У меня есть пара вопросов, связанных с этой веткой . Если у меня есть таймер (updateTimer), который я хочу отменить при закрытии окна, могу ли я поместить его вместо System.out.println («Закрытие Windows»); заявление? Или я должен был бы поместить его в фактический класс «View» (у меня есть три класса DesktopApplication.App, DesktopApplication.View и DesktopApplication.AboutBox, а метод настройки Window находится в классе .App).

В том же духе, если я смогу поставить updateTimer.cancel (); в строке, значит ли это, что я могу читать / писать из файла, а также заполнять текстовые поля (событие WindowOpen) и записывать информацию в файл в событии закрытия?

Я хочу сделать следующее: когда мое приложение запускается (и открывается главное окно), я хочу проверить файл конфигурации. Если он существует, я хочу получить имя пользователя, пароль, идентификатор туннеля и IP-адрес из этого файла - и заполнить их соответствующие текстовые поля в главной jPanel. Если его не будет, я ничего с ним не сделаю.

При закрытии приложения я хочу, чтобы произошли две вещи: 1) любые работающие UpdateTimers будут отменены (для эффективного и чистого закрытия приложения) и 2) записать имя пользователя, пароль, идентификатор туннеля и IP-адрес в файл конфигурации для следующего запуска.

Я создал файл в Netbeans, поэтому «exitMenu» генерируется автоматически, а «кнопка закрытия» не настроена. Поэтому мне нужно использовать WindowClosing для этого (или взломать метод exitMenu в текстовом редакторе и надеяться, что он не создаст проблем с Netbeans).

Я должен также добавить, что имя пользователя и пароль на самом деле являются MD5-хешами реального имени пользователя и пароля. Поэтому, хотя кто-то может открыть текстовый файл и прочитать его, он увидит только что-то вроде этого:

c28de38997efb893872d893982ac 3289ab83ce8f398289d938999cab 12345 192.168.2.2

Спасибо, и хорошего дня :)

Patrick. Отредактировано, чтобы включить информацию о «имени пользователя и пароле», которая будет сохранена.

Ответы [ 2 ]

1 голос
/ 25 апреля 2011

могу ли я поместить это вместо System.out.println («Закрытие Windows»); заявление?

Да, вы можете поместить произвольный код в ваш слушатель

Вдоль этой строки, если я смогу поставить updateTimer.cancel (); в строке, значит ли это, что я могу читать / писать из файла, а также заполнять текстовые поля (событие WindowOpen) и записывать информацию в файл в событии закрытия?

Да

0 голосов
/ 01 мая 2011

Как я это сделал, вот так.

В моем классе "TunnelbrokerUpdateView" (тот, который фактически обрабатывает основной кадр), я добавил следующий код:

WindowListener wl = new WindowListener(){

        public void windowOpened(WindowEvent e)
        {
            try
            {
                     FileReader fr = new FileReader (new File("userinfo.txt"));
                     BufferedReader br = new BufferedReader (fr);
                     jTextField1.setText(br.readLine());
                     jPasswordField1.setText(br.readLine());
                     jTextField2.setText(br.readLine());
                     oldIPAddress = br.readLine();
                     br.close();
             }
             catch (FileNotFoundException ex) {
                    // Pop up a dialog box explaining that this information will be saved
                 // and propogated in the future.. "First time running this?"
                    int result = JOptionPane.showConfirmDialog((Component)
            null, "After you enter your user information, this box will no longer show.", "First Run", JOptionPane.DEFAULT_OPTION);
        }
            catch (java.io.IOException ea)
            {
                Logger.getLogger(TunnelbrokerUpdateView.class.getName()).log(Level.SEVERE, null, ea);
            }
        }

        public void windowClosing(WindowEvent e) {
            updateTimer.cancel();
            BufferedWriter userData;

            //Handle saving the user information to a file "userinfo.txt"
            try
            {
                userData = new BufferedWriter(new FileWriter("userinfo.txt"));
                StringBuffer sb = new StringBuffer();
                sb.append(jTextField1.getText());
                sb.append(System.getProperty("line.separator"));
                sb.append(jPasswordField1.getText());
                sb.append(System.getProperty("line.separator"));
                sb.append(jTextField2.getText());
                sb.append(System.getProperty("line.separator"));
                sb.append(oldIPAddress);
                userData.write(sb.toString());
                userData.close();

            }
            catch (java.io.IOException ex)
            {
                Logger.getLogger(TunnelbrokerUpdateView.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

        public void windowClosed(WindowEvent e) {
            System.exit(0);
        }

        public void windowIconified(WindowEvent e) {}

        public void windowDeiconified(WindowEvent e) {}

        public void windowActivated(WindowEvent e) {}

        public void windowDeactivated(WindowEvent e) {}

    };
    super.getFrame().addWindowListener(wl);
}

Я добавил это в метод "public TunnelbrokerUpdateView (приложение SingleFrameApplication)". Итак, все работает так, как я хотел. Я уверен, что есть лучшие способы включения пользовательской информации, но это было быстро и грязно. В будущем я планирую зашифровать данные (или преобразовать их в формат, который обычно не читается), поскольку в этом случае используется хэш пароля.

Надеюсь, это поможет кому-то еще в будущем.

(для справки, вот весь метод (включая материал, автоматически добавляемый Netbeans)

    public TunnelbrokerUpdateView(SingleFrameApplication app) {
    super(app);


    initComponents();




    // status bar initialization - message timeout, idle icon and busy animation, etc
    ResourceMap resourceMap = getResourceMap();
    int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
    messageTimer = new Timer(messageTimeout, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            statusMessageLabel.setText("");
        }
    });
    messageTimer.setRepeats(false);
    int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");
    for (int i = 0; i < busyIcons.length; i++) {
        busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
    }
    busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
            statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
        }
    });
    idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
    statusAnimationLabel.setIcon(idleIcon);
    progressBar.setVisible(false);

    // connecting action tasks to status bar via TaskMonitor
    TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
    taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
        public void propertyChange(java.beans.PropertyChangeEvent evt) {
            String propertyName = evt.getPropertyName();
            if ("started".equals(propertyName)) {
                if (!busyIconTimer.isRunning()) {
                    statusAnimationLabel.setIcon(busyIcons[0]);
                    busyIconIndex = 0;
                    busyIconTimer.start();
                }
                progressBar.setVisible(true);
                progressBar.setIndeterminate(true);
            } else if ("done".equals(propertyName)) {
                busyIconTimer.stop();
                statusAnimationLabel.setIcon(idleIcon);
                progressBar.setVisible(false);
                progressBar.setValue(0);
            } else if ("message".equals(propertyName)) {
                String text = (String)(evt.getNewValue());
                statusMessageLabel.setText((text == null) ? "" : text);
                messageTimer.restart();
            } else if ("progress".equals(propertyName)) {
                int value = (Integer)(evt.getNewValue());
                progressBar.setVisible(true);
                progressBar.setIndeterminate(false);
                progressBar.setValue(value);
            }
        }
    });

    // This will take care of Opening and Closing
    WindowListener wl = new WindowListener(){

        public void windowOpened(WindowEvent e)
        {
            try
            {
                     FileReader fr = new FileReader (new File("userinfo.txt"));
                     BufferedReader br = new BufferedReader (fr);
                     jTextField1.setText(br.readLine());
                     jPasswordField1.setText(br.readLine());
                     jTextField2.setText(br.readLine());
                     oldIPAddress = br.readLine();
                     br.close();
             }
             catch (FileNotFoundException ex) {
                    // Pop up a dialog box explaining that this information will be saved
                 // and propogated in the future.. "First time running this?"
                    int result = JOptionPane.showConfirmDialog((Component)
            null, "After you enter your user information, this box will no longer show.", "First Run", JOptionPane.DEFAULT_OPTION);
        }
            catch (java.io.IOException ea)
            {
                Logger.getLogger(TunnelbrokerUpdateView.class.getName()).log(Level.SEVERE, null, ea);
            }
        }

        public void windowClosing(WindowEvent e) {
            updateTimer.cancel();
            BufferedWriter userData;

            //Handle saving the user information to a file "userinfo.txt"
            try
            {
                userData = new BufferedWriter(new FileWriter("userinfo.txt"));
                StringBuffer sb = new StringBuffer();
                sb.append(jTextField1.getText());
                sb.append(System.getProperty("line.separator"));
                sb.append(jPasswordField1.getText());
                sb.append(System.getProperty("line.separator"));
                sb.append(jTextField2.getText());
                sb.append(System.getProperty("line.separator"));
                sb.append(oldIPAddress);
                userData.write(sb.toString());
                userData.close();

            }
            catch (java.io.IOException ex)
            {
                Logger.getLogger(TunnelbrokerUpdateView.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

        public void windowClosed(WindowEvent e) {
            System.exit(0);
        }

        public void windowIconified(WindowEvent e) {}

        public void windowDeiconified(WindowEvent e) {}

        public void windowActivated(WindowEvent e) {}

        public void windowDeactivated(WindowEvent e) {}

    };
    super.getFrame().addWindowListener(wl);
}

Хорошего дня :) Патрик.

...