Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/104: Рейтинг темы: голосов - 104, средняя оценка - 4.65
2 / 2 / 1
Регистрация: 13.12.2015
Сообщений: 72

Java Swing открыть новое окно и при нажатии на кнопку вернуться к предыдущему

23.10.2016, 15:54. Показов 20363. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте. Использую IDE Eclipse Neon. Скачал дополнительно для него Swing Designer. Есть главное окно, которое добавил как Application Window. После этого добавил кнопку перехода. Создал вторую форму, на которую нужно переходить при помощи добавления JFrame. И при помощи стандартного кода в actionPerformed(ActionEvent e) для кнопки:
Java
1
2
3
    Second_frame open_second = new Second_frame();
    open_second.setVisible(true);
    frame.dispose(); // Объект JFrame, который был проинициализирован автоматически в initialize()
открыл новое окно.

Всё хорошо и замечательно, только вот при желании вернуться в предыдущее окно такая же точно операция не срабатывает. Да, я новичок и где смотреть не знаю, т.к. все возможные варианты на русском и английском в Google уже попробовал. Помогите, пожалуйста (буду очень признателен, если заодно подскажете что ещё почитать/посмотреть, чтобы в Swing и Java чувствовать себя более уверено).
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.10.2016, 15:54
Ответы с готовыми решениями:

[WPF] Открыть новое окно при нажатии на кнопку
Как сделать чтобы при нажатии на кнопку открывалось новое окно, и не посредственно в какую строку добавлять этот код. P.s я новичек.

Новое окно при нажатии на кнопку
Есть QWidget с неким контентом и кнопкой. При нажатии на эту кнопку должен открываться другой QWidget. Как это просто реализовать? Сам...

При нажатии на кнопку отображать новое окно
Помогите! Как сделать чтоб при нажатии на кнопку выскакивало новое окно

8
 Аватар для Alradalion
132 / 126 / 85
Регистрация: 13.09.2013
Сообщений: 485
27.10.2016, 10:39
Пишет что-нибудь? Ошибку там или еще что?
Если вы хотите вернуться именно на то же самое окно, с которого ушли, то в новое окно вам надо передавать ссылку на старое и скрывать старое, а не вызывать метод dispose.
0
2 / 2 / 1
Регистрация: 13.12.2015
Сообщений: 72
27.10.2016, 16:14  [ТС]
Благодарю за отклик.

Нет нет. Никакой ошибки, т.к. во втором JFrame (который, как я понял вроде бы и отдельный файл, но не "основной" что ли), я не могу обратиться к первому окну. Т.е. объект с классом первого окна создаётся, только почему-то что-то типа setVisible(true) для этого объекта вызвать нельзя. Кстати говоря, через this я не в состоянии обратиться. Только к объекту класса JFrame, который создаётся в initialize().

Ещё прочитал, что использовать несколько JFrame это не очень хорошо, может вообще как-то по-другому можно сделать?
0
 Аватар для Alradalion
132 / 126 / 85
Регистрация: 13.09.2013
Сообщений: 485
27.10.2016, 16:30
Код сможете показать?
0
2 / 2 / 1
Регистрация: 13.12.2015
Сообщений: 72
27.10.2016, 16:46  [ТС]
Вот, конечно, но думаю, он Вам не очень понравится.

Главное окно (т.е. которое открывается сразу при запуске. Названия уже используемые в проекте):
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
public class Second_test_launch_menu {
 
    private JFrame frame;
    private JTextField textField_device_name;
    private JButton btn_testing_start;
 
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Second_test_launch_menu window = new Second_test_launch_menu();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
 
    /**
     * Create the application.
     */
    public Second_test_launch_menu() {
        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);
        frame.setLocationRelativeTo(null);
        
        textField_device_name = new JTextField();
        textField_device_name.setFont(new Font("Tahoma", Font.PLAIN, 24));
        textField_device_name.setBounds(12, 74, 408, 40);
        frame.getContentPane().add(textField_device_name);
        textField_device_name.setColumns(10);
        
        JLabel lbl_enter_device_name = new JLabel("Введите название устройства");
        lbl_enter_device_name.setFont(new Font("Times New Roman", Font.BOLD, 22));
        lbl_enter_device_name.setBounds(12, 28, 356, 33);
        frame.getContentPane().add(lbl_enter_device_name);
        
        btn_testing_start = new JButton("Start");
 
        btn_testing_start.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Second_test_launch_run main_window = new Second_test_launch_run(textField_device_name.getText());
                main_window.setLocationRelativeTo(null); // Set location of frame in the center of screen
                main_window.setVisible(true);
                frame.setVisible(false);
                
            }
        });
 
        btn_testing_start.setBounds(323, 215, 97, 25);
        frame.getContentPane().add(btn_testing_start);
        
    }
 
}
Второе окно, которое должно открываться, и откуда я хочу возвращаться (обратите внимание на комментарий в main(), может быть я не прав в его написании):

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
92
93
94
95
96
public class Second_test_launch_run extends JFrame implements MqttCallback {
 
    private JPanel contentPane;
 
public static void main(String[] args) {
        
        
        /*
         * Code below is not necessary, because this frame launched from another (starting frame)
         */
        
        
        /*
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        Second_test_launch_run frame = new Second_test_launch_run("");
                        frame.setVisible(true);
                        frame.setLocationRelativeTo(null); // Set location of frame in the center of screen
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        */
        
        
    }
 
public Second_test_launch_run(String device_name) {
        
        File create_demo = new File("demo.txt");
        try {
            create_demo.createNewFile();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        
        
        create_demo.deleteOnExit();
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 429);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        JLabel lbl_listening_device = new JLabel(device_name);
        lbl_listening_device.setFont(new Font("Tahoma", Font.BOLD, 22));
        lbl_listening_device.setBounds(12, 28, 408, 36);
        contentPane.add(lbl_listening_device);
        
        textField_device_data = new JTextField();
        textField_device_data.setFont(new Font("Tahoma", Font.BOLD, 40));
        textField_device_data.setHorizontalAlignment(SwingConstants.CENTER);
        textField_device_data.setBounds(12, 102, 408, 185);
        contentPane.add(textField_device_data);
        textField_device_data.setColumns(10);
        
        JButton btn_back_to_menu = new JButton("Back");
        btn_back_to_menu.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                
                setVisible(false);
                
            }
        });
        btn_back_to_menu.setBounds(12, 344, 97, 25);
        contentPane.add(btn_back_to_menu);
        
        
        int reading_delay = 1000;
        
        ActionListener update_info = new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                String data = "";
                BufferedReader reader = null;
                try {
                    reader = new BufferedReader(new FileReader("demo.txt"));
                    data = reader.readLine();
                    textField_device_data.setText(data);
                    reader.close(); // It is needed for correct work
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
        new Timer(reading_delay, update_info).start();
 
// Ещё некоторый код, который не имеет отношение к задаче
 
    }
 
}
Но тут уже убраны безуспешные попытки сделать так же, как при открытии второго JFrame из основного.
0
 Аватар для Alradalion
132 / 126 / 85
Регистрация: 13.09.2013
Сообщений: 485
27.10.2016, 17:02
Лучший ответ Сообщение было отмечено Bro_2 как решение

Решение

В btn_testing_start.addActionListener(new ActionListener() добавьте:
Second_test_launch_run main_window = new Second_test_launch_run(textField_device_ name.getText(), frame);

В классе Second_test_launch_run добавьте поле JFrame parent;
В конструкторе класса:
Java
1
2
 public Second_test_launch_run(String device_name, JFrame parent) {
        this.parent=parent;
В слушателе кнопки:
Java
1
2
3
4
5
6
7
btn_back_to_menu.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                parent.setVisible(true);
                setVisible(false);
                
            }
        });
Но так вы вернетесь именно к предыдущему окну

PS в Java используют другой стиль написания имен. deviceName, SecondTestLauchRun и т.д.
1
2 / 2 / 1
Регистрация: 13.12.2015
Сообщений: 72
27.10.2016, 17:20  [ТС]
Про имена спасибо. Учту.

В строке
Java
1
this.parent = parent;
Выдаёт ошибку, что this.parent не видно.
Без этой строки работает.
0
 Аватар для Alradalion
132 / 126 / 85
Регистрация: 13.09.2013
Сообщений: 485
28.10.2016, 00:29
Цитата Сообщение от Bro_2 Посмотреть сообщение
Выдаёт ошибку, что this.parent не видно.
Вероятно, вы не создали поле в классе, поэтому и выдается ошибка
1
2 / 2 / 1
Регистрация: 13.12.2015
Сообщений: 72
30.10.2016, 13:30  [ТС]
Да, я уже понял. В общем-то, это и не нужно. Ещё раз спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.10.2016, 13:30
Помогаю со студенческими работами здесь

Открыть новое окно при нажатии кнопки
Вот есть у меня начальное окно. На котором у меня есть кнопка, у которой есть слушатель public class Labaa2 extends JFrame { ...

Как открыть новое окно при нажатии кнопки?
U menja na forme Button. Podskazite, kak otkrit novoe okno pri nazatie na knopku? Spasibo Inessa

При нажатии на кнопку открывается новое окно, а предыдущее закрывается
Добрый день! Не могли помочь, как сделать так чтобы при нажатии на кнопку открывалось новое окно, а предыдущее в это время закрылось....

Как при нажатии Submit открыть новое окно определенных размеров?
Как при нажатии SUBMIT'a открыть новое окно опред. размеров, без меню и т.д.???

Выскакивает новое окно в браузере с рекламой при нажатии на кнопку или ссылку
Здравствуйте,пытаюсь бороться с этим вирусом уже несколько дней,я уверенный пользователь ПК,поэтому уже пробывала как-то бороться с...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru