Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/34: Рейтинг темы: голосов - 34, средняя оценка - 4.62
17 / 22 / 6
Регистрация: 16.10.2013
Сообщений: 316

Как правильно создавать JFrame?

03.11.2013, 01:29. Показов 6589. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
научите! подскажиет! посоветуйте где почитать!
как правильно создать Jframe? вот есть код к примеру
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 public static class JFrameWin extends JFrame {
        public JFrameWin() {
            this.setTitle("java-buddy.blogspot.com");
            this.setSize(300, 300);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.add(new MyComponent());
        }
    }
 
    public static void main(String[] args) {
        Runnable doSwingLater = new Runnable() {
 
            @Override
            public void run() {
                jFrameWindow = new JFrameWin();
                jFrameWindow.setVisible(true);
            }
        };
 
        SwingUtilities.invokeLater(doSwingLater);
 
    }


public static class JFrameWin extends JFrame обьясните как и что там происходит
Всегда и везде делал только так
JFrame name = new JFrame(); но как я понял так не правильно или не удобно что ли
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.11.2013, 01:29
Ответы с готовыми решениями:

Как правильно обновить таблицу jtable из другого jframe
Добрый день, проблема такая, у меня есть jframe package Forms; import javax.swing.*; import java.awt.event.ActionEvent; import...

Проходил ли кто-то видео-курс techpro? Как у них получилось JFrame в JFrame добавить
Проходил ли кто-то видео-курс techpro? Как у них получилось JFrame в JFrame добавить? http://teachpro.ru/Course/JavaforBeginners...

Как закрыть один JFrame и открыть новый JFrame?
привет подскажите как реализовать. есть отдельный класс с выпадающим меню(там три пункта). есть отдельный класс который рисует фрейм,...

13
 Аватар для RequiemMass
92 / 92 / 18
Регистрация: 06.01.2012
Сообщений: 394
03.11.2013, 03:11
warrax, ну а чо тут рассказывать.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static class JFrameWin extends JFrame {
        public JFrameWin() {
            this.setTitle("java-buddy.blogspot.com");//титул
            this.setSize(300, 300);//размер
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//что произойдёт, когда окно закроют
            this.add(new MyComponent());//Добавляем туда компонент
        }
    }
 
    public static void main(String[] args) {
        Runnable doSwingLater = new Runnable() {
 
            @Override
            public void run() {
                jFrameWindow = new JFrameWin();//Создали фрейм
                jFrameWindow.setVisible(true);//Сделали видимым
            }
        };
 
        SwingUtilities.invokeLater(doSwingLater);//Вызываем в потоке пользовательского интерфейса, чтобы не тупил интерфейс
 
    }
0
 Аватар для verylazy
462 / 462 / 71
Регистрация: 26.02.2013
Сообщений: 1,263
03.11.2013, 10:29
я смотрю, многие пишут
Java
1
2
@Override
            public void run() {
или какой-то invoke later
в чем смысл этой магии? мне реально интересно
0
 Аватар для Doctor_
238 / 237 / 142
Регистрация: 03.02.2011
Сообщений: 1,437
03.11.2013, 12:06
Почему нельзя просто делать так?
Java
1
2
3
4
5
6
7
8
9
10
11
12
public class FrameDemo extends JFrame {
  FrameDemo() {
    super("Frame");
    setSize(200, 200);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
  }
 
   public static void main(String[] args) {
     new FrameDemo();
   }
}
0
 Аватар для RequiemMass
92 / 92 / 18
Регистрация: 06.01.2012
Сообщений: 394
03.11.2013, 12:13
Doctor_, я и сам не силён, лень было разбираться. Но общий смысл таков, что есть отдельный поток в котором следует вызывать методы, показывающие пользовательский интерфейс. Он вызывается методом invokeLater(). Это гарантирует отзывчивость пользовательского интерфейса. Например если пользователь хочет тыкать кнопочки, а программа занята решением других задач. В общем это решение каким либо образом лучше, чем просто показ интерфейса в отдельном потоке. Через new Thread() start. Так как он имеет более высокий приоритет по сравнению с другими потоками.
Doctor_, можно, зависит от ситуации.
1
 Аватар для the27mart
6 / 6 / 1
Регистрация: 01.08.2012
Сообщений: 45
03.11.2013, 14:14
Цитата Сообщение от RequiemMass Посмотреть сообщение
Но общий смысл таков, что есть отдельный поток в котором следует вызывать методы, показывающие пользовательский интерфейс.
А разве не логичнее и проще будет в главном потоке отрисовывать интерфейс, а все остальные действия выполнять в отдельных потоках? Ведь этот вариант тоже даёт нормальный отклик.

Цитата Сообщение от RequiemMass Посмотреть сообщение
Так как он имеет более высокий приоритет по сравнению с другими потоками
Но приоритет потоков настраивается же (метод setPriority у объекта Thread)
0
17 / 22 / 6
Регистрация: 16.10.2013
Сообщений: 316
03.11.2013, 15:43  [ТС]
Цитата Сообщение от RequiemMass Посмотреть сообщение
Doctor_, я и сам не силён, лень было разбираться. Но общий смысл таков, что есть отдельный поток в котором следует вызывать методы, показывающие пользовательский интерфейс. Он вызывается методом invokeLater(). Это гарантирует отзывчивость пользовательского интерфейса. Например если пользователь хочет тыкать кнопочки, а программа занята решением других задач. В общем это решение каким либо образом лучше, чем просто показ интерфейса в отдельном потоке. Через new Thread() start. Так как он имеет более высокий приоритет по сравнению с другими потоками.
Doctor_, можно, зависит от ситуации.
на счет потока я понял, что гуи в отдельном прорисовывает
Но вопрос по JFrame
Правильнее через extend или создавать Jframe f = new JFrame(); ???
0
 Аватар для the27mart
6 / 6 / 1
Регистрация: 01.08.2012
Сообщений: 45
03.11.2013, 16:54
Цитата Сообщение от warrax Посмотреть сообщение
Правильнее через extend или создавать Jframe f = new JFrame(); ???
Варианта "правильнее" нету. Каждый создает так, как ему удобно. Я например делаю так:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main {
    public static void main(String args[]) {
        MyFrame frame = new MyFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}
 
class MyFrame extends JFrame {
    public MyFrame() {
    setSize(400, 400);
    setResizable(false)
    //И так далее
    }
}
А если надо выполнить какое-то действие, которое может блокировать поток, то я запускаю его в отдельный Thread.
2
 Аватар для RequiemMass
92 / 92 / 18
Регистрация: 06.01.2012
Сообщений: 394
04.11.2013, 01:06
Цитата Сообщение от the27mart Посмотреть сообщение
А разве не логичнее и проще будет в главном потоке отрисовывать интерфейс, а все остальные действия выполнять в отдельных потоках? Ведь этот вариант тоже даёт нормальный отклик.
Насчёт проще - да. Насчёт - логичнее - кто знает. Если придумали специальное средство для отрисовки интерфейса - видимо не с проста.

Цитата Сообщение от the27mart Посмотреть сообщение
Но приоритет потоков настраивается же (метод setPriority у объекта Thread)
Я честно вам скажу я не знаю где это указано в описании метода. Но у Хортсмана написано, что установленный приоритет может быть изменён Java машиной при выполнении программы. Речь шла как раз о методе setPriority().

Добавлено через 27 минут
Более точная информация. Цитата:
...Учтите, что нельзя вызывать компоненты Swing из потока.
Например, если нужно обновить строку состояния или надпись, то ее новое значение
нельзя установить непосредственно из потока.
Для решения этой проблемы воспользуйтесь следующими двумя удобными методами,
которые можно применять в любом потоке для включения определенных действий в очередь событий. (invokeLater и invokeAndWait)"
Вот собственно и всё.
1
 Аватар для the27mart
6 / 6 / 1
Регистрация: 01.08.2012
Сообщений: 45
04.11.2013, 11:07
Цитата Сообщение от RequiemMass Посмотреть сообщение
Но у Хортсмана написано, что установленный приоритет может быть изменён Java машиной при выполнении программы.
Может быть имелась ввиду зависимость настроек приоритета от конкретной платформы?

Цитата Сообщение от RequiemMass Посмотреть сообщение
...Учтите, что нельзя вызывать компоненты Swing из потока.
Например, если нужно обновить строку состояния или надпись, то ее новое значение
нельзя установить непосредственно из потока.
Для решения этой проблемы воспользуйтесь следующими двумя удобными методами,
которые можно применять в любом потоке для включения определенных действий в очередь событий. (invokeLater и invokeAndWait)"
Тут, скорее всего, имелось ввиду, что если вы отрисовали интерфейс в определенном потоке, а потом в нем же выполняете какие-то действия, то перерисовывать интерфейс в этом же потоке нельзя, и нужно вызвать метод invokeLater() который сделает это в отдельном Thread'е. Мы же делаем по другому. Отрисовываем и управляем интерфейсом в главном потоке, а все действия выполняем в параллельных. Также могут возникнуть проблемы с одновременным доступом к компоненту, но мне, почему-то, кажется, что синхронизация предусмотрена разработчиками.(ведь такие методы, как println(), синхронизированы). Даже если это не так, то решить проблему довольно просто.

Цитата Сообщение от RequiemMass Посмотреть сообщение
Если придумали специальное средство для отрисовки интерфейса - видимо не с проста
Не средство, а отдельный поток(вроде бы "управляющий поток"), предназначеный для отрисовки. Да, мысль верная,
но по мне, вариант с отдельными потоками проще и код получается читабельнее.
0
 Аватар для RequiemMass
92 / 92 / 18
Регистрация: 06.01.2012
Сообщений: 394
04.11.2013, 23:43
Цитата Сообщение от the27mart Посмотреть сообщение
Может быть имелась ввиду зависимость настроек приоритета от конкретной платформы
Не уверен. На мой взгляд имелось ввиду, что Java машина имеет свой алгоритм определения какому процессу отдать предпочтение и иногда он может не совпадать c установленными приоритетами. А может быть вы и правы. Кто его разберёт
Цитата Сообщение от the27mart Посмотреть сообщение
Тут, скорее всего, имелось ввиду, что если вы отрисовали интерфейс в определенном потоке, а потом в нем же выполняете какие-то действия, то перерисовывать интерфейс в этом же потоке нельзя, и нужно вызвать метод invokeLater() который сделает это в отдельном Thread'е
да, он сделает это не просто в отдельном Theade. Он добавит это событие в поток управления событиями, где оно встанет в очередь вместе с другими себе подобными. Поток управления событиями создаётся методом main в главном потоке.
Цитата Сообщение от the27mart Посмотреть сообщение
Отрисовываем и управляем интерфейсом в главном потоке, а все действия выполняем в параллельных.
так тоже можно. должно соблюдаться так называемое правило единственного потока.
Цитата Сообщение от the27mart Посмотреть сообщение
синхронизация предусмотрена разработчиками
некоторые да, но не все
Цитата Сообщение от the27mart Посмотреть сообщение
возникнуть проблемы с одновременным доступом к компоненту
они несомненно возникнут, если он не синхронизирован
Цитата Сообщение от the27mart Посмотреть сообщение
Даже если это не так, то решить проблему довольно просто
можно поподробнее, интересно если честно каким образом вы будете выполнять синхронизацию конкурентного доступа потоков к компоненту. (если нужно-могу предложить пример- задачу для решения)
P.S По моему мы довольно четко определили с вами ситуацию в которой нужно использовать invokeLater(). Зачем вы так упорно не хотите им пользоваться - тайна
0
 Аватар для the27mart
6 / 6 / 1
Регистрация: 01.08.2012
Сообщений: 45
05.11.2013, 08:23
Цитата Сообщение от warrax Посмотреть сообщение
научите! подскажиет! посоветуйте где почитать!
как правильно создать Jframe? вот есть код к примеру
Почитай книгу Хорстмана(https://www.google.ru/search?q=хорстманн+java), там вроде в первом томе всё подробно разъясняется (найди нужную главу по содержанию).

Цитата Сообщение от RequiemMass Посмотреть сообщение
Он добавит это событие в поток управления событиями, где оно встанет в очередь вместе с другими себе подобными.
Но смысл остается в том, что он просто перерисует интерфейс в отдельном потоке, а не в главном.

Цитата Сообщение от RequiemMass Посмотреть сообщение
можно поподробнее, интересно если честно каким образом вы будете выполнять синхронизацию конкурентного доступа потоков к компоненту.
Создать отдельный вспомогательный метод в пару строк и поставить на него Lock. Таким образом, если какой-то поток начал выполнять метод доступа, то другой поток уже не сможет этого сделать, пока Lock не откроется действующим потоком, то есть пока он не закончит выполнение метода.

Цитата Сообщение от RequiemMass Посмотреть сообщение
P.S По моему мы довольно четко определили с вами ситуацию в которой нужно использовать invokeLater(). Зачем вы так упорно не хотите им пользоваться - тайна
В этом то и дело) Не определили. Я просто хочу сказать, что не обязательно всё делать так, как написано на каком-нибудь сайте. Всё всегда можно сделать по-своему. Такая логика, я думаю, должна быть полезна при изучении какого-либо языка, фреймворка и т. д.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
05.11.2013, 14:55
Цитата Сообщение от the27mart Посмотреть сообщение
не обязательно всё делать так, как написано на каком-нибудь сайте. Всё всегда можно сделать по-своему. Такая логика, я думаю, должна быть полезна при изучении какого-либо языка, фреймворка и т. д.
Ещё немного информации с какого-то сайта
Не, почуди'ть с целью эксперемента конечно можно и даже полезно, но на практике лучше всё-таки так, как в руководстве написано, делать...
1
17 / 22 / 6
Регистрация: 16.10.2013
Сообщений: 316
05.11.2013, 15:57  [ТС]
Цитата Сообщение от easybudda Посмотреть сообщение
Ещё немного информации с какого-то сайта
Не, почуди'ть с целью эксперемента конечно можно и даже полезно, но на практике лучше всё-таки так, как в руководстве написано, делать...
еще бы на русском
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.11.2013, 15:57
Помогаю со студенческими работами здесь

Как сделать Jframe внутри другого JFrame
Доброго времени суток джентльмены и леди. Как сделать так, что бы внутри главного JFrame запустить несколько других...

Как правильно задать размер JPanel чтобы JFrame при pack() сжимался до размеров JPanel
Подскажите как правильно задать размер JPanel чтобы JFrame при pack() сжимался до размеров JPanel, задание размеров при помощи setSize...

JFrame - программа вычисления факториала, не правильно работает
Вот такой код, для вычисления факториала успешно справляется, вывод через консоль public class Factorial_test { public static void...

Как правильно создавать View?
Есть проект на веб формах, который нужно переписать под MVC проект. Главная проблема - как создать контроллер и модель к нему. Как я...

как правильно Ls создавать реплику?
Собственно если мы создаём реплику руками на локальную машину то потом по Ctrl+O спокойно её видим и она полностью синициализирована ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru