Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/83: Рейтинг темы: голосов - 83, средняя оценка - 4.54
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
1

Не могу понять, как работать с графикой

22.01.2012, 14:24. Показов 16798. Ответов 53
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть примитивная программа. Создаётся Frame, в нём создаётся Panel, далее в методе paintComponent рисуется линия. Как теперь человеческими способами переписать программу так, чтобы то, что требуется нарисовать, рисовалось, к примеру, в функции main, потому что принятие решений о том, что рисовать, должно делаться НЕ внутри paintComponent. Как идеальный пример хотелось бы увидеть программу, которая нарисует одну линию, а через 5 секунд нарисует вторую линию

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
import java.awt.*;
import javax.swing.*;
 
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()
  {
    this.setBounds (0, 0, 200, 200);
    
    MyPanel panel = new MyPanel();
    this.add (panel);
  }
}
 
class MyPanel extends JPanel
{
  public void paintComponent (Graphics g)
  {
    super.paintComponent (g);   
    g.drawLine (10, 10, 180, 180);  
  }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.01.2012, 14:24
Ответы с готовыми решениями:

Не могу понять как работать с событиями
Здравствуйте. Подскажите пожалуйста такую вещь: У меня при нажатии на кнопку выбора файла ,...

TStyleManager, не могу понять как работать с ним
Ребята! Помогите! Хочу сделать программу покрасивее, но я не могу понять как работать с ним. Класс...

Не могу понять, как должна работать модель
Не могу понять алгоритм работы модели, кто может, подскажите как данная модель должна...

Не могу понять как работать с данным массивом
Добрый день форумчане! Имеется массив ...

53
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
28.01.2012, 12:48  [ТС] 41
Author24 — интернет-сервис помощи студентам
И как в итоге твоим JCanvas пользоваться?

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
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.image.BufferedImage;
 
public class Main {
  public static void main (String[] args)
  {
    JFrame frame = new JFrame ();
    frame.setBounds (0, 0, 200, 200);
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    frame.setVisible (true);
  
//    MyPanel panel = new MyPanel();
//    frame.add (panel);
    
    JPanel panel = new JPanel();
    panel.setBackground(Color.green);
    frame.add (panel);
 
    JCanvas canvas = new JCanvas (200, 200);
    panel.add (canvas, BorderLayout.CENTER);
    Graphics2D g = canvas.createCanvasGraphics();
    g.drawLine (10, 10, 180, 180);
    canvas.repaint();
  }
}
В итоге рисуется окно, залитое зелёным цветом, и на нём маленький серый квадратик посередине сверху. По твоей статье я этого понять не могу, т.к. заткнулся на "Вариант 1 – прямая отрисовка" - оно у меня не работает, а последующие примеры построены по принципу "возьмём предыдущий пример и изменим то-то на то-то"

Добавлено через 4 минуты
Цитата Сообщение от Skipy Посмотреть сообщение
Работы на час, обсуждений на четверо суток...
Да мне не нужны рассуждения. Мне нужен (о чём я уже неоднократно говорил), готовый работающий пример. Потому что имея его на руках дальше уже можно нормально экспериментировать
0
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
30.01.2012, 14:57 42
Цитата Сообщение от Evg Посмотреть сообщение
И как в итоге твоим JCanvas пользоваться?

В итоге рисуется окно, залитое зелёным цветом, и на нём маленький серый квадратик посередине сверху.
Совершенно логично. По умолчанию у панели стоит FlowLayout с выравниванием по центру. Размеры компоненте не задаются, предпочтительные в том числе (200х200 - это исключительно размер буфера), их выбирает контейнер. В итоге он помещает канву сверху по центру.

Как пользоваться... Например, можно установить у панели BorderLayout и поместить канву по центру. Тогда она будет растягиваться по необходимости. Можно и по-другому. Но это - рассуждения. А они Вам не нужны, как Вы сами говорите.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
01.02.2012, 12:53  [ТС] 43
Цитата Сообщение от Skipy Посмотреть сообщение
Как пользоваться... Например, можно установить у панели BorderLayout и поместить канву по центру. Тогда она будет растягиваться по необходимости
Если я правильно тебя понял. Но оно не работает

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Main {
  public static void main (String[] args)
  {
    JFrame frame = new JFrame ();
    frame.setBounds (0, 0, 200, 200);
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    frame.setVisible (true);
  
    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    panel.setBackground(Color.green);
    frame.add (panel);
 
    JCanvas canvas = new JCanvas (200, 200);
    panel.add (canvas, BorderLayout.CENTER);
    Graphics2D g = canvas.createCanvasGraphics();
    g.drawLine (0, 0, 180, 180);
    canvas.repaint();
  }
}
Цитата Сообщение от Skipy Посмотреть сообщение
Но это - рассуждения. А они Вам не нужны, как Вы сами говорите
Да. Я изначально говорил, что мне нужен полный рабочий пример готового кода, с которым дальше я смогу экспериментировать
0
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
01.02.2012, 13:30 44
Цитата Сообщение от Evg Посмотреть сообщение
Если я правильно тебя понял. Но оно не работает

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Main {
  public static void main (String[] args)
  {
    JFrame frame = new JFrame ();
    frame.setBounds (0, 0, 200, 200);
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    frame.setVisible (true);
  
    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    panel.setBackground(Color.green);
    frame.add (panel);
 
    JCanvas canvas = new JCanvas (200, 200);
    panel.add (canvas, BorderLayout.CENTER);
    Graphics2D g = canvas.createCanvasGraphics();
    g.drawLine (0, 0, 180, 180);
    canvas.repaint();
  }
}
http://docs.oracle.com/javase/... .Component, java.lang.Object)

Note: If a component has been added to a container that has been displayed, validate must be called on that container to display the new component.
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
01.02.2012, 14:11  [ТС] 45
Всё равно не работает

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Main {
  public static void main (String[] args)
  {
    JFrame frame = new JFrame ();
    frame.setBounds (0, 0, 200, 200);
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    frame.setVisible (true);
  
    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    panel.setBackground(Color.green);
    frame.add (panel);
    frame.validate();
 
    JCanvas canvas = new JCanvas (200, 200);
    panel.add (canvas, BorderLayout.CENTER);
    panel.validate();
    Graphics2D g = canvas.createCanvasGraphics();
    g.drawLine (0, 0, 180, 180);
    canvas.repaint();
  }
}
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
02.02.2012, 12:13 46
Все работает. Линия рисуется белым цветом, возможно, ты её не видишь. Перед рисованием линии установи какой-нибудь яркий цвет, например, красный.
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.02.2012, 13:22  [ТС] 47
Действительно, рисует. Меня смутило то, что сначала окно залилось зелёным цветом, а потом зелёный цвет пропал и оно стало белым
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.02.2012, 13:48  [ТС] 48
Итак, пример готового кода, реализующего ответ на поставленный вопрос
Вложения
Тип файла: rar src.rar (2.2 Кб, 10 просмотров)
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.02.2012, 18:05  [ТС] 49
Едем дальше. Рисую две линии с интервалом времени между ними. Вторая линия не рисуется. Если закомментировать блок кода по исполнению sleep'а, то нарисуется нормально. Что теперь не правильно?

Файл JCanvas.java берём тут: https://www.cyberforum.ru/java... ost2429283

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
import javax.swing.*;
import java.awt.*;
 
public class Main {
  public static void main (String[] args)
  {
    JFrame frame = new JFrame ();
    frame.setBounds (0, 0, 400, 300);
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    frame.setVisible (true);
  
    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    frame.add (panel);
 
    JCanvas canvas = new JCanvas (320, 200);
    panel.add (canvas, BorderLayout.CENTER);
    panel.validate();
 
    Graphics2D g = canvas.createCanvasGraphics();
    g.setColor (Color.yellow);
    g.fillRect(0, 0, 320, 200);
 
    g.setColor (Color.black);
    g.drawLine (10, 10, 310, 190);
    canvas.repaint();
 
    try
    {
      Thread.sleep (1000);
    } catch (InterruptedException e)
    {
      e.printStackTrace();
    }
    
    g.setColor (Color.black);
    g.drawLine (310, 10, 10, 190);
    canvas.repaint();
  }
}
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
02.02.2012, 19:48 50
Цитата Сообщение от Evg Посмотреть сообщение
Что теперь не правильно?
Блокирование потока.

Перечитай статьи skipy про устройство и синхронизацию gui. Ссылки он приводил.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.02.2012, 20:12  [ТС] 51
sleep я воткнул для нагляжности и стабильной повторяемости. Можно просто 100 линий в цикле рисовать. И при каждом запуске будет разное количество линий, просто на глаз это более сложно определить. Да читал я статью, сколько смог. А потом затырился (о чём уже писал). Мне, как не имеющему опыт программирования на java, сложно уловить сентенцию. Я просто надеялся, что можно как-то сделать по простому: взять чужой класс (да хоть 10 классов), вставить в программу и просто рисовать, не заморачиваясь с тем, как оно устроено внутри (как это делается, к примеру, в VCL).

Типо как сажают ребёнка на детский двухколёсный велосипед с двумя дополнительными колёсиками. Он учится рулить, крутить педали, нажимать на тормоза, не заморачиваясь при этом с такой сложной вещью, как баллансировка. А потом, когда он освоил механику, уже снимают колёса (теперь он готов к сложным вещам). Вот и я создал тему по одной простой причине. Как человек с опытом работы на других языках, я понимаю, что отрисовка через componentPaint - это самое что ни на есть прямое черезж..ие с точки зрения проектирования программы. Думал увидеть конкретный работающий пример без этого черезж...ия. Чтобы на ранних этапах не лезть в дебри того, как устроены эти наносистемы.
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
03.02.2012, 07:18 52
Цитата Сообщение от Evg Посмотреть сообщение
Типо как сажают ребёнка на детский двухколёсный велосипед с двумя дополнительными колёсиками. Он учится рулить, крутить педали, нажимать на тормоза, не заморачиваясь при этом с такой сложной вещью, как баллансировка. А потом, когда он освоил механику, уже снимают колёса (теперь он готов к сложным вещам).
Тогда может быть сначала привыкнуть к философии java на консольных приложениях, или, на крайний случай, поработать с GUI без самостоятельного рисования, используя только то, что уже есть, а уже потом переходить к GUI? Потому как GUI, а уж тем более его ручная отрисовка, совсем не тянет на двухколёсный велосипед с двумя дополнительными колёсиками.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
03.02.2012, 11:17  [ТС] 53
Цитата Сообщение от aleksandy Посмотреть сообщение
Потому как GUI, а уж тем более его ручная отрисовка, совсем не тянет на двухколёсный велосипед с двумя дополнительными колёсиками
Вообще я рисую не GUI и всего лишь динамическую картинку. Но если java устроена так, что для такой элементарной вещи надо много курить мануалы, то это как-то печально... На консольных приложениях смысла привыкать особенно не к чему: ну какой смысл по сто раз писать сортировку массива или нахождения максимума, если этот алгоритм от языка никак не зависит.

Например, разбирательства с борландом проводил таким образом, что поставил для себя цель в написании полезного (для себя) большого приложения и корячился с ним (порядка года). При этом упор делал не на то, чтобы хоть что-то и хоть как-то получилось, а на том, чтобы программа с технической точки зрения была грамотно написана, а с пользовательской - была удобна в использовании. В дополнение ко всему это была ещё и моя первая программа на Си++. По прошествии этого времени я ещё более утвердился во мнении, что такой подход намного более правильный, чем "попробуй для начала что-то простенькое". При этом с борландом почти всегда на конкретный вопрос я получал либо конкретный ответ, либо конкретный пример (благо в инете их навалом).

В случае с java на такой конкретный вопрос я так и не получил конкретного ответа (а точнее, чёрного ящика). Как и ожидалось, для начала я получил несколько ответов, которые НЕ соответствовали моему вопросу (и так же нарыл кучу примеров в инете, построенных по такому же принципу). В конце-концов добрый человек сделал код JCanvas, который вроде бы как "бери и работай", но как оказалось "но при этом кури мануалы".

Я для себя пока не вижу интересной цели в виде консольного приложения, вот придумал только графическое. Собственно, только после того, как придумал себе более-менее серьёзную постановку задачи, я и сел за язык. Тогда прошу ответить хотя бы на такой вопрос. Java и его (её) философия устроены таким образом, что реализовать чёрный ящик, отвечающий моим запросам настолько сложно, что людям попросту неохота тратить своё время на человека, ищущего этот чёрный ящик на халяву? Что borland, что java - это всего лишь расширение кругозора в свободное от работы время. На какие-то профессиональные навыки я не претендую (потому что на это уходит всего лишь небольшое количество свободного времени). Просто из тех соображений, что знания лишними не бывают и могут пригодиться. java в данном случае мне интересна как технология, при помощи которой можно написать переносимое графическое приложение
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
05.02.2012, 10:26 54
Цитата Сообщение от Evg Посмотреть сообщение
JCanvas, который вроде бы как "бери и работай", но как оказалось "но при этом кури мануалы".
А как без мануалов? С тем, что от него требуется упомянутый класс справляется отлично. Проблемы возникли из-за непонимания принципа layout-ов. С коими можно ознакомиться опять же на сайте .
0
05.02.2012, 10:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.02.2012, 10:26
Помогаю со студенческими работами здесь

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

Не могу понять как в Visual Studio (C#) работать с "ресурсами"
Начал программировать на C#, установил Visual Studio и встретил там такую графу как "ресурсы".И у...

Перестал работать код. Не могу понять в чём причина!
Получил сайт в распоряжение, а на сайте ошибка в РНР. При чём изначально работало всё, но в один...

Програма не хочет работать. не могу понять что не так (
В панели интерфейса предусмотреть возможность выбора одной из трех функций sin(x), x^2, exp(x) ...


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

Или воспользуйтесь поиском по форуму:
54
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru