Java: второе окно пустое - PullRequest
       42

Java: второе окно пустое

4 голосов
/ 04 февраля 2012

У меня странная проблема ... Я относительно новый "энтузиаст" Java-программист (я зарабатывал себе на жизнь хакерством Perl в предыдущей карьере), работаю над своим первым полуреальным приложением.«Main-Class» - это класс MyApp, который создает экземпляр UserInputDialog.

UserInputDialog - это класс, который я написал, extend s JFrame, реализующий ActionListener и KeyListener, использует FlowLayout и предоставляет пользователю JLabel, JTextField и Cancel / OK JButton s.Когда JTextField генерирует KeyEvent, где keyReleased() == KeyEvent.VK_ENTER, или когда "OK" JButton генерирует ActionEvent, UserInputDialog выполняет некоторую проверку ввода, вызывает setVisible(false), а затем вызывает MyApp.doSomething( JTextFieldInstance.getText() ).

Всё работает отлично.Но теперь я пытаюсь добавить окно прогресса к MyApp, так как doSomething() может иногда занимать достаточно много времени для завершения.

Я создал класс ProgressWindow, который расширяет JFrame, использует BorderLayout и отбрасывает JProgressBar in. NORTH и JScrollPane (упаковка JTextArea) in. CENTER.ProgressWindow отлично работает при создании экземпляра из ProgressWindowTester и подачи тестовых данных.Это также работает нормально, если я копирую и вставляю тест для циклов из ProgressWindowTester в MyApp и не имею MyApp экземпляр UserInputDialog (т. Е. Нет ничего присущего в MyApp это вызывает такое поведение; кажется, что это некое взаимодействие, которое я не понимаю, между UserInputDialog и ProgressWindow).

Но когда я пытаюсь использовать ProgressWindow в MyApp какнамеревался, т.е. ProgressWindow setVisible (true), я получаю пустое окно Swing (правильного размера и с правильно заданной строкой заголовка).Компоненты JProgressBar и JScrollPane / JTextArea не отображаются.Методы ProgressWindow вызываются MyApp должным образом (сообщения System.err.println() показывают правильное взаимодействие), все выглядит нормально, просто компоненты, которые должны быть видны в ProgressWindow ... не работают.

Я могу опубликовать фрагменты кода, но это немного запутанно, и я, вероятно, просто упускаю что-то очевидное ...

Я знаком с концепцией разделения пользовательского интерфейса и бизнес-логики в целом (Например, я использовал HTML::Template и Class::DBI и CGI::Application при сборке приложений Perl), но я не уверен, что "делаю все правильно" в Java ...

Заранее спасибо!

О, у меня одинаковое поведение в двух средах, в которых я пробовал код: javac 1.6.0_29 в Mac OS X 10.6.8 («Snow Leopard»);и javac 1.7.0_02 [1] в дистрибутиве Fedora 15 Linux, ядро ​​2.6.31.10-3, среда рабочего стола LXDE.

[1] Скачано непосредственно с oracle.com;Я не использую OpenJDK (я знаю, что JDK 7 основан на OpenJDK) или gcj или что-то в этом роде

1 Ответ

5 голосов
/ 04 февраля 2012

У вас есть проблема с параллелизмом в Swing, когда вы пытаетесь выполнить длительный процесс в потоке событий Swing или EDT.Поскольку этот поток отвечает за отрисовку всех компонентов и за обработку пользовательского ввода, если он связан вашим длительным процессом, ваш графический интерфейс будет эффективно заморожен до завершения процесса.Ключ заключается в том, чтобы использовать фоновый поток, такой как предоставляемый SwingWorker, для длительных процессов, чтобы поток событий не блокировался.Проверьте Параллелизм в Swing для получения дополнительной информации об этом.Также ознакомьтесь с JProgressBar Tutorial , чтобы узнать, как использовать индикаторы выполнения с фоновыми потоками.

Кроме того, вы не захотите использовать JFrame в диалоговом окне, например JDialogГораздо более уместно.Кроме того, вы хотите избежать использования KeyListeners с Swing.Гораздо лучше было бы просто добавить ActionListener в ваш JTextField, поскольку его поведение по умолчанию - реагировать на нажатия клавиши.

О, и добро пожаловать на StackOverflow.com!

...