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

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

27.11.2018, 15:53. Показов 1279. Ответов 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,307
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,307
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,307
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,307
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,307
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
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru