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

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

03.11.2013, 01:29. Показов 6516. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru