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

Создание объекта класса во внутреннем классе

27.11.2018, 15:53. Показов 1276. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
public class FileSystemModel implements Model {
    Man returnMan;
    @Override
    public Man manLoader() {//Загрузить человека
 
        File directory = new File(System.getProperty("user.dir") + "/Man");
        if (!directory.exists()) {
            JOptionPane.showMessageDialog(null,
                    "Отсутствует папка Man", "Ошибка", JOptionPane.ERROR_MESSAGE);
            return null;
        } else {
            List<String> files = Arrays.stream(directory.list()).filter(f -> f.endsWith(".man")).collect(Collectors.toList());
 
            if (files.size() == 0) {
                JOptionPane.showMessageDialog(null,
                        "В папке Man нет данных", "Ошибка", JOptionPane.ERROR_MESSAGE);
                return null;
            }
 
            TreeMap<String, String> filesCard = new TreeMap<>();
            for (String file : files) {
 
                try (ObjectInputStream objectInputStream = new ObjectInputStream(
                        new FileInputStream(System.getProperty("user.dir") + "/Man/" + file))) {
                    Man loadman = (Man) objectInputStream.readObject();
                    filesCard.put(
                            loadman.getManMap().get("Фамилия") + " " +
                                    loadman.getManMap().get("Имя") + " " +
                                    loadman.getManMap().get("Отчество") + " " +
                                    loadman.getManMap().get("Личный номер"),
                            loadman.getManMap().get("Личный номер"));
                } catch (FileNotFoundException e1) {
                    e1.printStackTrace();
                } catch (IOException e1) {
                    e1.printStackTrace();
                } catch (ClassNotFoundException e1) {
                    e1.printStackTrace();
                }
            }
            Set<String> treeSet = filesCard.keySet();
            String[] array = treeSet.toArray(new String[0]);
            DefaultListModel dfm = new DefaultListModel();
            final JList list = new JList(dfm);
            for (String line : array) dfm.addElement(line);
            final JScrollPane pane = new JScrollPane(list);
            final JFrame frame = new JFrame("Выбор человека");
            final JButton btnGet = new JButton("Выбрать");
            frame.setLayout(new BorderLayout());
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.getContentPane().add(pane, BorderLayout.CENTER);
            frame.getContentPane().add(btnGet, BorderLayout.SOUTH);
            frame.setSize(600, 400);
            frame.setResizable(false);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
            btnGet.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (list.getSelectedValue() == null) {
                        JOptionPane.showMessageDialog(null,
                                "Не выбран загружаемый персонаж", "Ошибка", JOptionPane.ERROR_MESSAGE);
                    } else {
                        try (ObjectInputStream objectInputStream = new ObjectInputStream(
                                new FileInputStream(System.getProperty("user.dir") + "/Man/" + filesCard.get(list.getSelectedValue()) + ".man"))) {
                            returnMan=(Man) objectInputStream.readObject();
                            System.out.println(returnMan.getManMap().get("Фамилия"));
                        } catch (FileNotFoundException e1) {
                            e1.printStackTrace();
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        } catch (ClassNotFoundException e1) {
                            e1.printStackTrace();
                        }
                    }
                    frame.dispose();
                }
            });
 
        }
        System.out.println(returnMan.getManMap().get("Фамилия"));
        return returnMan;
    }
 }
Подскажите пожалуйста. В классе слушателя клавиши мыши считывается из файла объект returnMan. Вопрос состоит в следующем, почему я не могу этот объект вернуть с помощью return? А именно
Java
1
System.out.println(returnMan.getManMap().get("Фамилия"));
перед return выдает ошибку. Второй вопрос состоит в том, что необходимо сделать что бы Man returnMan находился в методе public Man manLoader?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.11.2018, 15:53
Ответы с готовыми решениями:

Создание объекта дочернего класса в родительском классе
Подскажите, может кто знает, как в предке сосдать экземпляр потомка? или как сделать копию this? так чтобы при добавлении в...

Как в классе А у объекта класса B вызвать метод класса B ?
Есть Класс A и класс B . В классе B лежит объект типа ArrayList , назовём его arrayList, в этом же классе есть метод push() . Возможно ли...

Создание объекта класса и вызов его метода
Добрый день, форумчане. На Яве программирую не больше недели. Столкнулся со следующей проблемой. Есть 2 класса Class1 и Class2 с методом...

13
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
27.11.2018, 17:54
Цитата Сообщение от Sashagor82 Посмотреть сообщение
выдает ошибку
ошибку выдают для того, чтобы ты их читал
0
-1 / 2 / 0
Регистрация: 25.08.2018
Сообщений: 199
27.11.2018, 19:22  [ТС]
Так вот и не понятно почему в одном месте есть ошибку в другом нет.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
27.11.2018, 19:34
Абсолютно с тобой согласен, совершенно непонятно.
0
-1 / 2 / 0
Регистрация: 25.08.2018
Сообщений: 199
29.11.2018, 19:45  [ТС]
Подскажите, как можно остановить выполнение программы до нажатия кнопки.
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,306
30.11.2018, 23:16
Цитата Сообщение от Sashagor82 Посмотреть сообщение
выдает ошибку
Какую конкретно?

Цитата Сообщение от Sashagor82 Посмотреть сообщение
остановить выполнение программы до нажатия кнопки.
Какой кнопки? Какова цель либо причина остановки?
Излагайте чётко, что и для чего Вам нужно. А так же давайте максимально детальную информацию.
Говорить вообще, а тем более в Java, "выдаёт ошибку", это то же самое что не сказать абсолютно ничего.
0
-1 / 2 / 0
Регистрация: 25.08.2018
Сообщений: 199
30.11.2018, 23:26  [ТС]
Дело в том что для завершения работы метода необходимо получить данные из 65 строки, но программа не ждёт нажатия кнопки и в 80 строке возникает ошибка, так как объект ещё не создан.

Добавлено через 1 минуту
Возможно вообще иду не тем путем, возможно ли создать jdialog с jlist?
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,306
30.11.2018, 23:41
Цитата Сообщение от Sashagor82 Посмотреть сообщение
программа не ждёт нажатия кнопки
Программа и не должна ждать. Про код слушателя во время исполнения данного кода Вы можете забыть.
Это как просто передать ссылку в функцию, которая нужна другому процессу. В данном коде ВЫ только говорите обработчику событий, какой код он должен запустить (но сам этот кода не запускается, т.е.как бы "передаёте ссылку на функцию"), а сами продолжаете исполнять свой код.
0
-1 / 2 / 0
Регистрация: 25.08.2018
Сообщений: 199
01.12.2018, 08:08  [ТС]
Я понимаю, но как обойтись без return? Метод loadMan должен вернуть объект Man который в свою очередь получается через нажатие кнопки (он выбирается из списка).
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,306
01.12.2018, 21:03
Sashagor82, Метод loadMan НЕ должен вернуть объект Man! Его должен вернуть метод "Нажатие кнопки".
0
-1 / 2 / 0
Регистрация: 25.08.2018
Сообщений: 199
01.12.2018, 21:44  [ТС]
И как это сделать?
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,306
01.12.2018, 22:12
Sashagor82, метод "Нажатие кнопки" это и есть:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
                public void actionPerformed(ActionEvent e) {
                    if (list.getSelectedValue() == null) {
                        JOptionPane.showMessageDialog(null,
                                "Не выбран загружаемый персонаж", "Ошибка", JOptionPane.ERROR_MESSAGE);
                    } else {
                        try (ObjectInputStream objectInputStream = new ObjectInputStream(
                                new FileInputStream(System.getProperty("user.dir") + "/Man/" + filesCard.get(list.getSelectedValue()) + ".man"))) {
                            returnMan=(Man) objectInputStream.readObject();
                            System.out.println(returnMan.getManMap().get("Фамилия"));
                        } catch (FileNotFoundException e1) {
                            e1.printStackTrace();
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        } catch (ClassNotFoundException e1) {
                            e1.printStackTrace();
                        }
                    }
                    frame.dispose();
                }
returnMan=(Man) objectInputStream.readObject(); и так делает то, что Вы ждёте от return returnMan; в конце метода (manLoader()).

Ничего не надо делать, кроме как убрать return returnMan;.
Запустите метод manLoader() при создании окна, что бы он "зарядил винтовку", то есть запустил обработчик событий в целях запуска кода содержимого в actionPerformed(ActionEvent e). В последствии, при каждом нажатии кнопки, атрибут returnMan (Man returnMan будет содержать результат кода

Java
1
returnMan=(Man) objectInputStream.readObject();
0
-1 / 2 / 0
Регистрация: 25.08.2018
Сообщений: 199
01.12.2018, 22:55  [ТС]
Да, только returnMan надо передать с класс вызвавший manLoader. Я впринципе решил с использованием JOptionPane через диалоговое окно, но хотелось бы разобраться в вызвавшем классе написано
Java
1
Man man=FileSystemModel.manLoader()
Если сделать как вы говорите, то вообще ошибка будет, так как метод manLoader должен вернуть объект Ман.
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,306
01.12.2018, 23:04
Лучший ответ Сообщение было отмечено Sashagor82 как решение

Решение

Sashagor82, какая-то каша немного... Разрабатывая GUI приложения, надо немного почитать про саму GUI философию. Обработчик событий, в данном случае кнопки, это отдельный "персонаж" живущий так сказать своей жизнью.
Вы должны чётко это понимать, иначе будут проблемы, и ужасный код.
Я не знаю как там у Вас всё устроено, но модус операнди должен быть следующим:
1. Либо Вы вызываете метод откуда хотите, который возвращает то, что Вам нужно в любое время.
2. Либо Вы запускаете обработчик, тем самым говоря, что это он решает, когда возвращать то, что Вам нужно. А точнее нажатие на кнопку.

Теперь в зависимости от того, что в конкретном случае Вас устаревает и надо выстраивать код.

Если нажатие кнопки должно возвращать объект, и тот-же объект должен возвращать какой-то метод потому, что оно Вам так надо - то в обработчике событий просто запишите вызов данного метода. А саму логику вложите в данный метод.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.12.2018, 23:04
Помогаю со студенческими работами здесь

Создание объекта класса, если его имя находится в строковой перменной.
Как создать объект класса, если его имя находится в строковой перменной, скажем, было считано из файла?

Создание объекта класса в другом классе!!!
//----------------------------------Address.h---------------------------------------------------- class Address { public: const...

Создание объекта в другом классе с последующем использованием в методах другого класса
Здравствуйте! Заранее спасибо! Помогите пожалуйста разобраться в следующей ситуации. Имеется у меня плата Orange Pi One Plus, взял по...

Как в классе А у объекта класса B вызвать метод класса B ?
Есть Класс A и класс B . В классе B лежит объект типа ArrayList , назовём его arrayList, в этом же классе есть метод push() . Возможно ли в...

Объявление в классе объекта другого класса
какая-то фигня получается, допустим есть 2 класса - class1 и class2, в хедерах class1.h подключён class2.h, а в class2.h подключён...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru