Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622

Графика в Java для Windows

09.03.2017, 15:31. Показов 2387. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется небольшое приложение Java для Windows XP (на картинке слева)
К нему необходимо добавить отдельную форму с графикой типа (на картинке справа): (графика выполнена на GLUT + VisualStudio)
Подскажите пожалуйста как можно построить такую графику на Java?
Google советует библиотеку Gl4Java. Но пока не получается добавить ее ни в NetBeans ни к проекту. Кому не сложно подскажите пожалуйста с чего начать, как подключить Gl4Java(или подобную ей) к проекту для построения подобной графики.
Миниатюры
Графика в Java для Windows   Графика в Java для Windows  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.03.2017, 15:31
Ответы с готовыми решениями:

Гаджет для Windows 7 - Java
Помогите пожалуйста, нужно создать гаджет под win7 на языке Java.

План изучения java для Windows и Android?
Учу java, пока только основы. Дальше есть более серьезные темы: (SQL - Servlet, JSP - Hibernate - Spring - Maven - Git - JUnit - HTTP...

Java и OpenGL. Java и 3Д графика
Здравствуйте, уважаемые форумчане!:) Хочу создать небольшую 3Д игрушку на Java. Давно слышал про OpenGL, пытался найти в интернете...

15
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
09.03.2017, 19:00
Цитата Сообщение от VlGuvin Посмотреть сообщение
с чего начать
с maven начни, например
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
09.03.2017, 19:46  [ТС]
Спасибо. Попробую. Но пока остановился на GL4Java. Если у ого есть опыт подключения библиотеки к проекту в Net Beans отклинитесь пожалуйста.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
09.03.2017, 21:46
Идешь в Гугл, пишешь maven, читаешь, что это такое и как этим пользоваться.
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
09.03.2017, 23:29  [ТС]
Может я чего-то не понимаю. Но как графика OpenGL соотносится c maven https://habrahabr.ru/post/78252/?
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
10.03.2017, 00:58
Цитата Сообщение от VlGuvin Посмотреть сообщение
Но как графика OpenGL соотносится c maven
Цитата Сообщение от VlGuvin Посмотреть сообщение
подключения библиотеки к проекту
maven как раз это хорошо умеет.
0
$ su
 Аватар для ntlinuxnt
1605 / 520 / 97
Регистрация: 18.11.2010
Сообщений: 2,807
Записей в блоге: 2
10.03.2017, 02:24
Или Gradle. Приходите еще.
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
10.03.2017, 09:42  [ТС]
Если не сложно киньте пожалуйста ссылки где про это подробней можно почитать (подключение GLUT к java ).
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
10.03.2017, 10:40
Лучший ответ Сообщение было отмечено ntlinuxnt как решение

Решение

1. https://maven.apache.org/ тут
можешь видео на ютубе поискать, там покажут
2. gl4java судя по всему протух несколько лет назад, используй jogl
3. гугление заняло у меня меньше времени, чем написание этого текста
4. https://www.tutorialspoint.com/jogl/
1
92 / 88 / 17
Регистрация: 13.11.2011
Сообщений: 193
10.03.2017, 12:21
Да и не обязательно подключать сторонние библиотеки, эту простую графику можно спокойно на встроенной JFrame забацать
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
11.03.2017, 09:08  [ТС]
2. gl4java судя по всему протух несколько лет назад, используй jogl
Спасибо. Jogl подошла. Почти все сформировалось нормально. Ниже код для расширения JFrame
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package objects;
 
import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.opengl.glu.GLU;
import com.jogamp.opengl.util.awt.Overlay;
import com.jogamp.opengl.util.awt.TextRenderer;
import com.jogamp.opengl.util.gl2.GLUT;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JTextArea;
 
 
public class Graphic extends JFrame{
 
    //колич. меток в канале
     public static final int MT_CNL = 16;
    //количество каналов
     public static final int NB_CNL = 120;
 
    // переменные координат меток
    short [] x = new short [NB_CNL]; 
    short [] [] y = new short [NB_CNL][MT_CNL]; 
    short [] xm = new short [NB_CNL];
    short [] [] ym = new short [NB_CNL][MT_CNL]; 
    short CntMt;
    short AllMt;
 
    GLCanvas glcanvas = new GLCanvas();
    
    // конструктор класса Graphic 
    public Graphic() {
        // инициализация компонентов
        initComponents();
    }
 
    // метод инициализации компонентов формы
    private void initComponents(){
        // положение формы на экране
        this.setBounds(20,20,600,500);
        // размер формы
        this.setSize(600, 500);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        glcanvas.addGLEventListener(new Renderer());
        glcanvas.setSize( 600, 500 );
        add(glcanvas);
        
    }
    
   // Код OpenGL, который отображает кадр 
    public final class Renderer implements GLEventListener
    {
        private GLU glu = new GLU();
        private int WinHeight = 500;
        private int WinWidth = 600;
        
    Overlay overlay;
    TextRenderer tr ;
 
        @Override
        public void init(GLAutoDrawable gLDrawable){
            this.overlay = new Overlay(gLDrawable);
            System.out.println("init() called");
            GL2 gl = gLDrawable.getGL().getGL2();
            gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            gl.glShadeModel(GL2.GL_FLAT);
        }
 
        @Override
        public void dispose(GLAutoDrawable arg0)
        {
            System.out.println("dispose() called");
            this.overlay = null;
        } 
        
        @Override
        public void display(GLAutoDrawable gLDrawable)
        {
            Graphics2D g2d = this.overlay.createGraphics();
            final GL2 gl = gLDrawable.getGL().getGL2();
            
            gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);//очистка-заливка пиксельного буффера цветом очистки экрана
            // Код OpenGL, который отображает кадр 
            gl.glMatrixMode(GL2.GL_PROJECTION);
            gl.glLoadIdentity();
            gl.glOrtho(-WinWidth/2, WinWidth/2, -WinHeight/2, WinHeight/2, -1.0, 1.0);
            // горизонтальные и вертикальные линии сетки
            gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
            gl.glBegin(GL2.GL_LINES);
            gl.glColor3f(1.0f, 1.0f, 1.0f);
 
            // по горизонтали
            for(int i = -WinWidth/2; i <= WinWidth/2; i += 5){
                if(i%100 == 0 || i == 0) {
                    gl.glColor3f(0.0f, 1.0f, 1.0f);
                }
                else {
                    gl.glColor3f(0.5f, 0.5f, 0.5f);
                }
                gl.glVertex2f(i, -WinHeight);
                gl.glVertex2f(i, WinWidth);
            }
            gl.glColor3f(0.5f, 0.5f, 0.5f);
            // по вертикали
             for(int i = -WinWidth/2; i <= WinWidth/2; i += 100) {
                gl.glVertex2f(-WinHeight, i);
                gl.glVertex2f(WinHeight, i);
            }
            gl.glEnd();
 
            // зеленая метка с координатами x, y
            gl.glColor3f( 0.0f, 1.0f, 0.0f );           
            gl.glPolygonMode( GL2.GL_FRONT, GL2.GL_FILL );
 
            // прорисовка меток 
            // проход по каналам
            for (int i = 0; i < NB_CNL; i++) {
                // проход по меткам в канале
                for (int j = 0; j < MT_CNL; j++)  {
                    // прорисовка если дальность меньше 2000   
                    if(y[i][j] < 2000) {
                        gl.glBegin( GL2.GL_POLYGON );  
                        gl.glVertex2i( x[i]+0, y[i][j]+5 );
                        gl.glVertex2i( x[i]+5, y[i][j]+5 );  
                        gl.glVertex2i( x[i]+5, y[i][j]+0 );   
                        gl.glVertex2i( x[i]+0, y[i][j]+0 );  
                        gl.glEnd();
                    }
                }
            }
            
            tr = new TextRenderer(new Font("Verdana", Font.BOLD, 16), true, false, null, false);
            tr.setColor(1f,1f,1f,1f);
            tr.beginRendering(0,0);
            tr.draw( "Hello World! ", 100, 100);
            tr.endRendering();
 
            gl.glFlush();
        }
 
        @Override
        public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height)
        {
            System.out.println("reshape() called: x = "+x+", y = "+y+", width = "+width+", height = "+height);
        }
        
    }    
}
Проблема с выводом текста на графическую панель. Код не работает
Java
1
2
3
4
5
            tr = new TextRenderer(new Font("Verdana", Font.BOLD, 16), true, false, null, false);
            tr.setColor(1f,1f,1f,1f);
            tr.beginRendering(0,0);
            tr.draw( "Hello World! ", 100, 100);
            tr.endRendering();
Подскажите пожалуйста, что в коде не так?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
11.03.2017, 10:02
Пиши развернуто. Что значит не работает.
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
11.03.2017, 10:48  [ТС]
В первом развернутом блоке кода этот код имеется. Второй блок с кодом это именно то, что не работает в методе
Java
1
public void display(GLAutoDrawable gLDrawable)
Добавлено через 18 минут
Это вывод на графическую форму текста "Hello World". Текст не выводится... Не врубаюсь почему. Вся прочая графика в этом методе работает нормально.
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
13.03.2017, 10:58  [ТС]
Графика работает нормально. В том числе и вывод текста на графическую форму типа:
Java
1
2
3
4
5
6
7
8
9
10
11
12
            trGorizont = new TextRenderer(new Font("Times New Roman", Font.PLAIN, 50));
 
            trGorizont.beginRendering(gLDrawable.getSurfaceWidth(), gLDrawable.getSurfaceHeight());
            trGorizont.setColor(1f, 1f, 0f, 1f);
            trGorizont.draw(String.valueOf(1), 320, gLDrawable.getSurfaceHeight() - 220);
            trGorizont.draw("2", 420, gLDrawable.getSurfaceHeight() - 220);
            trGorizont.draw("3", 520, gLDrawable.getSurfaceHeight() - 220);
            trGorizont.draw("3", 520, gLDrawable.getSurfaceHeight() - 220);
            trGorizont.draw("4", 20, gLDrawable.getSurfaceHeight() - 220);
            trGorizont.draw("5", 120, gLDrawable.getSurfaceHeight() - 220);
            trGorizont.draw("6", 220, gLDrawable.getSurfaceHeight() - 220);
            trGorizont.endRendering();
Как обновлять графическую форму?
В С++ вызов функций перерисовки был вставлент в отдельный поток типа
C++
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
//---------------------------------------------------------------------------
// Поток рисования
 
DWORD WINAPI ImageThread(LPVOID lpParam)
{
    if(!win)
    {
        win = 1;
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
        glutInitWindowSize(WinWidth, WinHeight);
        glutCreateWindow("Amulet Image");
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    }
 
    while(!TrRdBegin)
    {
    // Регистрация функции построения изображения
  glutDisplayFunc(Display);
    // Регистрация функции обновления переменных и изображения 
    glutIdleFunc(Idle);
    // Цикл обработки событий   
  glutMainLoop();
    //glutMainLoopEvent();
    Sleep(1);
        //TrIm = 0;
    }
    return 0;
}
Как делается перерисовка изображения в JOGL?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
13.03.2017, 12:37
поищи примеры какие-нибудь
http://jogamp.org/git/?p=jogl.... 4c;hb=HEAD
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
13.03.2017, 14:55  [ТС]
Спасибо разобрался. Для перерисовки картинки (периодический вызов метода display(GLAutoDrawable gLDrawable)) Нужно использовать конструкцию
Java
1
2
3
4
Animator animator = new Animator();
        animator.setUpdateFPSFrames(60, System.err);
        animator.add(glcanvas);   
        animator.start();
Остается вопрос в передаче матрицы bufrd из метода вложенного класса в метод display(GLAutoDrawable gLDrawable) третьего класса. Матрица bufrd формируется по событию приема по COM порту тут:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Form extends JFrame{
 
...
    public static final int  BUFSIZE_RD = 4096;
public byte [] bufrd = new byte [BUFSIZE_RD];
...
    // клас для имплементации события приема данных в com порт
    class PortReader implements SerialPortEventListener {       
...
 @Override
        public void serialEvent(SerialPortEvent event) {
....
     // ЗДЕСЬ формируется матрица bufrd 
bufrd[bufrdCount] = arrReadComByte[i];
...
}
}
}
Передавать ее нужно сюда:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Graphic extends JFrame{
...
    public final class Renderer implements GLEventListener  {
...
        // отрисовка графического окна  
        @Override
        public void display(GLAutoDrawable gLDrawable) {
...
 СЮДА необходимо перенести матрицу bufrd или ссылку на область памяти где она находится.
...
 
}
}
}
Внутри класса Form формирую метод типа
Java
1
2
3
4
    // метод доставки bufrd в другой класс
    public byte [] getBufRd() {
        return bufrd;
    }
Затем в классе
Java
1
2
3
4
5
public class Graphic extends JFrame{
...
    Form form = new Form();
    Form.PortReader pr = form.new PortReader();
...
И пытаюсь доставить матрицу bufrd в метод
Java
1
2
3
4
5
6
7
...
        @Override
        public void display(GLAutoDrawable gLDrawable) {
...
            byte [] Rd = new byte [BUFSIZE_RD];
            [B]Rd = pr.getBufRd();[/B]
...
Такая конструкция не работает.
Правильно-ли я делаю передачу матрицы из метода вложенного класса в метод вложенного класса?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.03.2017, 14:55
Помогаю со студенческими работами здесь

Запуск программы на Java при двойном щелчке по файлу, для Windows
Надо создать возможность доступа к программе написаной на Java. Тоесть делаем двойной щелчёк по файлу который ссылаеться на программу Java...

3D графика в Java
Подскажите какую библиотеку выбрать для программирования 3D графики на Java. Родная Java3D от Oracle, как я слышал, не очень хороша. Какие...

Графика Java
Здравствуйте прошу помочь литературой или возможно есть видео как написать нужный мне код, или же прошу помочь примером кода, так я в...

Графика в Java
Товарищи, нужна ваша помощь. Есть библиотека (на основе AWT) (папка lib). Она подключается к проекту. А там уже мы описываем графические...

Java графика спираль
Приветствую всех, кто не спит) у меня тут задачка,которую нужно срочно решить:Построить спираль вокруг точки (3,5) с n витками и r...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru