Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java GUI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Gibby
152 / 152 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
1

Ожидание действия на форме

28.10.2013, 15:51. Просмотров 1146. Ответов 4
Метки нет (Все метки)

Пытаюсь создать форму с полем "Password" и функцией getPassword, которая при вызове рисует форму, ждет действия пользователя (нажатия [Enter] в поле "Password", либо клика по кнопкам "OK" или "Cancel"), а затем возвращает результат.

И вот с "ждет действия пользователя" у меня небольшая проблема.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;
 
 
public class PasswordFrame extends JFrame {
    private JButton buttonCancel;
    private JButton buttonOK;
    private JTextField userField;
    private JPasswordField passwordField;
    private JTextField databaseField;
    
    final int BIG_OFFSET = 10;
    final int SMALL_OFFSET = 5; 
    
    private String password ="";
    
    public String getPassword() {        
        PasswordFrame frame = new PasswordFrame();
        frame.setVisible(true);
        while(frame.isVisible()) {};
        return frame.password;
    }
    
    public PasswordFrame() {
        super("Database security");
        initialize();
    }
    
    private void initialize() {
        //<editor-fold defaultstate="collapsed" desc="Initialization code">
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
       setSize(250, 150);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);        
        JPanel content = new JPanel(new GridBagLayout());
        JLabel databaseLabel = new JLabel("Database:");
        JLabel userLabel = new JLabel("UID:");
        JLabel passwordLabel = new JLabel("Password");
        
        content.add(new JLabel("Database:"), new GridBagConstraints(
                0, 0, 1, 1, 1, 0, 
                GridBagConstraints.CENTER, GridBagConstraints.BOTH, 
                new Insets(BIG_OFFSET, BIG_OFFSET, 0, 0), 0, 0));
        
        databaseField = new JTextField("Treasury", 20);
        databaseField.setEditable(false);
        databaseField.setFocusable(false);
        content.add(databaseField, new GridBagConstraints(
                1, 0, 2, 1, 1, 0, 
                GridBagConstraints.CENTER, GridBagConstraints.BOTH, 
                new Insets(BIG_OFFSET, SMALL_OFFSET, 0, BIG_OFFSET), 0, 0));
        
        content.add(new JLabel("UserName:"), new GridBagConstraints(
                0, 1, 1, 1, 0, 0, GridBagConstraints.CENTER, 
                GridBagConstraints.BOTH, 
                new Insets(SMALL_OFFSET, BIG_OFFSET, 0, 0), 0, 0));
        
        userField = new JTextField("Test", 20);
        userField.setFocusable(false);
        userField.setEditable(false);
        content.add(userField, new GridBagConstraints(
                1, 1, 2, 1, 0, 0, 
                GridBagConstraints.CENTER, 
                GridBagConstraints.BOTH, 
                new Insets(SMALL_OFFSET, SMALL_OFFSET, 0, BIG_OFFSET), 0, 0));
        
        content.add(new JLabel("Password:"), new GridBagConstraints(
                0, 2, 1, 1, 0, 0, 
                GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, 
                new Insets(SMALL_OFFSET, BIG_OFFSET, 0, 0), 0, 0));
        
        passwordField = new JPasswordField("", 20);
        passwordField.setEditable(true);
        passwordField.addKeyListener(new KeyListener() {
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode() == KeyEvent.VK_ENTER) {
                    buttonOK.doClick();
                }
            }
            @Override public void keyTyped(KeyEvent e) {}
            @Override public void keyReleased(KeyEvent e) {}
        });
        content.add(passwordField, new GridBagConstraints(
                1, 2, 2, 1, 0, 0, 
                GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, 
                new Insets(SMALL_OFFSET, SMALL_OFFSET, 0, BIG_OFFSET), 0, 0));
 
        buttonOK = new JButton("OK");
        buttonOK.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                char[] pass = passwordField.getPassword();
                password = String.copyValueOf(pass);
                setVisible(false);
            }
        });
        content.add(buttonOK, new GridBagConstraints(
                1, 3, 1, 1 ,0 ,0, 
                GridBagConstraints.LINE_END, GridBagConstraints.NONE, 
                new Insets(SMALL_OFFSET, 0, SMALL_OFFSET, SMALL_OFFSET), 0, 0));
        
        buttonCancel = new JButton("Cancel");
        buttonCancel.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                password = "";
                setVisible(false);
            }
        });
        content.add(buttonCancel, new GridBagConstraints(
                2, 3, 1, 1 ,0 ,0, 
                GridBagConstraints.CENTER, GridBagConstraints.NONE, 
                new Insets(SMALL_OFFSET, 0, SMALL_OFFSET, SMALL_OFFSET), 0, 0));
        setContentPane(content);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowOpened( WindowEvent e ){
                passwordField.requestFocus();
            }
        });
Java
1
2
3
4
5
6
7
8
        //</editor-fold>   
    }
        
    public static void main(String[] args) {
        PasswordFrame passFrame = new PasswordFrame();
        System.out.println("pass=" + passFrame.getPassword());
    }
}
Код кое-как работает, но мне в нем не нравятся две вещи, которые я не знаю как исправить:
1) цикл "while(frame.isVisible()) {};" Возможно, я ошибаюсь, но мне кажется, это как-то очень криво и должен быть другой путь.
2) после завершения всех действий программа продолжает выполняться (я так понимаю, это потому, что форма все еще открыта, хотя и невидима). Если я пытаюсь закрыть форму
Java
1
passFrame .dispatchEvent(new WindowEvent(passFrame, WindowEvent.WINDOW_CLOSING));
, то программа вообще останавливается (я так понимаю, это потому, что при закрытии формы закрывается ее поток, а это мой основной поток.

Как переделать, чтобы все было нормально - не пойму
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2013, 15:51
Ответы с готовыми решениями:

Как сделать , что бы этот код был в форме и открывался и выдавал данные в форме?
Первый Case 1 , что бы можно было направить в кнопку , при нажатие на кнопку ,...

Как сделать что бы этот код был в форме и выдавал данные в этой же форме
Первый Case 1 , что бы можно было направить в кнопку , при нажатие на кнопку ,...

Ожидание от пользователей действия в потоке
В потоке на форму вывожу капчу, нужно ждать от пользователя ввод этой капчи в...

Ожидание действия пользователя. Многопоточность
Здравствуйте, такая проблема: Есть ЧекБокс, при нажатии на него появляется...

Длительный запрос с клиента (ожидание действия на сайте)
Ребят помогите сделать, мне нужно чтобы мой клиент на C# посылал запрос на сайт...

4
Skipy
1996 / 1419 / 91
Регистрация: 25.11.2010
Сообщений: 3,611
28.10.2013, 16:33 2
Вообще-то по уму это делается через модальный диалог.
0
Gibby
152 / 152 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
28.10.2013, 18:22  [ТС] 3
Да, но если мне надо будет ввести значения и в те поля, которые сейчас неактивны? Я так понял, модальный диалог предполагает ввод только в одно текстовое поле, а здесь у меня три.
К тому же, разве диалог может сделать мне JPasswordField?

Добавлено через 13 минут
UPD: нашел как это делается, разбираюсь.

Добавлено через 8 минут
UPD2: Разобрался, спасибо.
0
Skipy
1996 / 1419 / 91
Регистрация: 25.11.2010
Сообщений: 3,611
28.10.2013, 19:23 4
Цитата Сообщение от Gibby Посмотреть сообщение
Да, но если мне надо будет ввести значения и в те поля, которые сейчас неактивны? Я так понял, модальный диалог предполагает ввод только в одно текстовое поле, а здесь у меня три.
К тому же, разве диалог может сделать мне JPasswordField?
JDialog позволяет сделать модальное диалоговое окно любой сложности. Всё, что можно запихнуть в JFrame, можно запихнуть в JDialog, у них внутренняя архитектура идентичная.
0
Gibby
152 / 152 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
31.10.2013, 15:53  [ТС] 5
Если кому-то пригодится, вот решение моей задачи:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.*;
 
public class SecurityManager {
    public static String getPassword() throws BadAuthorizationException {
        JTextField loginField = new JTextField(10);
        loginField.setEditable(false);
        loginField.setText("Test");
        loginField.setFocusable(false);
 
        JPasswordField passwordField = new JPasswordField(10);
 
        JPanel myPanel = new JPanel(new GridBagLayout());
        myPanel.add(new JLabel("Login:"), new GridBagConstraints(
                0, 0, 1, 1, 0, 0, 
                GridBagConstraints.CENTER, GridBagConstraints.BOTH, 
                new Insets(5, 5, 5, 0), 0, 0));
        
        myPanel.add(loginField, new GridBagConstraints(
                1, 0, 1, 1, 0, 0, 
                GridBagConstraints.CENTER, GridBagConstraints.BOTH, 
                new Insets(5, 5, 5, 5), 0, 0));
        
        myPanel.add(new JLabel("Password:"), new GridBagConstraints(
                0, 1, 1, 1, 0, 0, 
                GridBagConstraints.CENTER, GridBagConstraints.BOTH, 
                new Insets(0, 5, 5, 0), 0, 0));
        
        myPanel.add(passwordField, new GridBagConstraints(
                1, 1, 1, 1, 0, 0, 
                GridBagConstraints.CENTER, GridBagConstraints.BOTH, 
                new Insets(0, 5, 5, 5), 0, 0));
        
        int result = JOptionPane.showConfirmDialog(null, myPanel, 
                "Database security", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null);
        String password = String.copyValueOf(passwordField.getPassword());
        if (result == JOptionPane.OK_OPTION && ! "".equals(password)) {
            return password;
        } 
        throw new BadAuthorizationException("No password entered.");
    }
}
0
31.10.2013, 15:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2013, 15:53

Ожидание нажатия пользователем по форме
Как сделать так чтобы ожидалось нажатие пользователем мышкой по форме два...

Ожидание нажатия на второй форме
Есть главная форма при нажатии на кнопку показывается вторая форма где стоят...

Ожидание события на другой форме
Подскажите как реализовать следующую вещь. Пусть есть 2 открытые формы. На...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru