С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java GUI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
warrax
17 / 22 / 6
Регистрация: 16.10.2013
Сообщений: 316
1

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

03.11.2013, 01:29. Просмотров 1985. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2013, 01:29
Ответы с готовыми решениями:

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

Проходил ли кто-то видео-курс techpro? Как у них получилось JFrame в JFrame добавить
Проходил ли кто-то видео-курс techpro? Как у них получилось JFrame в JFrame...

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

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

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

13
RequiemMass
91 / 91 / 18
Регистрация: 06.01.2012
Сообщений: 394
03.11.2013, 03:11 2
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
Заблокирован
03.11.2013, 10:29 3
я смотрю, многие пишут
Java
1
2
@Override
            public void run() {
или какой-то invoke later
в чем смысл этой магии? мне реально интересно
0
Doctor_
236 / 235 / 142
Регистрация: 03.02.2011
Сообщений: 1,436
03.11.2013, 12:06 4
Почему нельзя просто делать так?
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
91 / 91 / 18
Регистрация: 06.01.2012
Сообщений: 394
03.11.2013, 12:13 5
Doctor_, я и сам не силён, лень было разбираться. Но общий смысл таков, что есть отдельный поток в котором следует вызывать методы, показывающие пользовательский интерфейс. Он вызывается методом invokeLater(). Это гарантирует отзывчивость пользовательского интерфейса. Например если пользователь хочет тыкать кнопочки, а программа занята решением других задач. В общем это решение каким либо образом лучше, чем просто показ интерфейса в отдельном потоке. Через new Thread() start. Так как он имеет более высокий приоритет по сравнению с другими потоками.
Doctor_, можно, зависит от ситуации.
1
the27mart
6 / 6 / 1
Регистрация: 01.08.2012
Сообщений: 45
03.11.2013, 14:14 6
Цитата Сообщение от RequiemMass Посмотреть сообщение
Но общий смысл таков, что есть отдельный поток в котором следует вызывать методы, показывающие пользовательский интерфейс.
А разве не логичнее и проще будет в главном потоке отрисовывать интерфейс, а все остальные действия выполнять в отдельных потоках? Ведь этот вариант тоже даёт нормальный отклик.

Цитата Сообщение от RequiemMass Посмотреть сообщение
Так как он имеет более высокий приоритет по сравнению с другими потоками
Но приоритет потоков настраивается же (метод setPriority у объекта Thread)
0
warrax
17 / 22 / 6
Регистрация: 16.10.2013
Сообщений: 316
03.11.2013, 15:43  [ТС] 7
Цитата Сообщение от 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 8
Цитата Сообщение от 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
91 / 91 / 18
Регистрация: 06.01.2012
Сообщений: 394
04.11.2013, 01:06 9
Цитата Сообщение от the27mart Посмотреть сообщение
А разве не логичнее и проще будет в главном потоке отрисовывать интерфейс, а все остальные действия выполнять в отдельных потоках? Ведь этот вариант тоже даёт нормальный отклик.
Насчёт проще - да. Насчёт - логичнее - кто знает. Если придумали специальное средство для отрисовки интерфейса - видимо не с проста.

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

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

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

Цитата Сообщение от RequiemMass Посмотреть сообщение
Если придумали специальное средство для отрисовки интерфейса - видимо не с проста
Не средство, а отдельный поток(вроде бы "управляющий поток"), предназначеный для отрисовки. Да, мысль верная,
но по мне, вариант с отдельными потоками проще и код получается читабельнее.
0
RequiemMass
91 / 91 / 18
Регистрация: 06.01.2012
Сообщений: 394
04.11.2013, 23:43 11
Цитата Сообщение от 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 12
Цитата Сообщение от warrax Посмотреть сообщение
научите! подскажиет! посоветуйте где почитать!
как правильно создать Jframe? вот есть код к примеру
Почитай книгу Хорстмана(https://www.google.ru/search?q=хорстманн+java), там вроде в первом томе всё подробно разъясняется (найди нужную главу по содержанию).

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

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

Цитата Сообщение от RequiemMass Посмотреть сообщение
P.S По моему мы довольно четко определили с вами ситуацию в которой нужно использовать invokeLater(). Зачем вы так упорно не хотите им пользоваться - тайна
В этом то и дело) Не определили. Я просто хочу сказать, что не обязательно всё делать так, как написано на каком-нибудь сайте. Всё всегда можно сделать по-своему. Такая логика, я думаю, должна быть полезна при изучении какого-либо языка, фреймворка и т. д.
0
easybudda
Модератор
Эксперт CЭксперт С++
10158 / 6062 / 1526
Регистрация: 25.07.2009
Сообщений: 11,498
05.11.2013, 14:55 13
Цитата Сообщение от the27mart Посмотреть сообщение
не обязательно всё делать так, как написано на каком-нибудь сайте. Всё всегда можно сделать по-своему. Такая логика, я думаю, должна быть полезна при изучении какого-либо языка, фреймворка и т. д.
Ещё немного информации с какого-то сайта
Не, почуди'ть с целью эксперемента конечно можно и даже полезно, но на практике лучше всё-таки так, как в руководстве написано, делать...
1
warrax
17 / 22 / 6
Регистрация: 16.10.2013
Сообщений: 316
05.11.2013, 15:57  [ТС] 14
Цитата Сообщение от easybudda Посмотреть сообщение
Ещё немного информации с какого-то сайта
Не, почуди'ть с целью эксперемента конечно можно и даже полезно, но на практике лучше всё-таки так, как в руководстве написано, делать...
еще бы на русском
0
05.11.2013, 15:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2013, 15:57

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

Как сменить иконку в JFrame?
Вот собственно и весь вопрос.

Как сделать тень JFrame?
Вот в чём вопрос: если к примеру создать так frame: ... JFrame...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru