Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1

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

28.10.2013, 15:51. Показов 3337. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.10.2013, 15:51
Ответы с готовыми решениями:

Ожидание действия пользователя
Всем привет! Помогите новичку, пожалуйста Пишу программу, которая тебя приветствует в richtextbox, потом принимает твое имя в...

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

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

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

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

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.10.2013, 15:53
Помогаю со студенческими работами здесь

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

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

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

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

Ожидание нажатия кнопки на форме в цикле
Нужно сделать так что бы цикл не продолжал работу пока не будет нажата кнопка (имеется в виду кнопка на форме, например button1, а не на...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru