С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
VlGuvin
0 / 0 / 4
Регистрация: 04.08.2015
Сообщений: 225
1

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

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

Имеется небольшое приложение Java для Windows XP (на картинке слева)
К нему необходимо добавить отдельную форму с графикой типа (на картинке справа): (графика выполнена на GLUT + VisualStudio)
Подскажите пожалуйста как можно построить такую графику на Java?
Google советует библиотеку Gl4Java. Но пока не получается добавить ее ни в NetBeans ни к проекту. Кому не сложно подскажите пожалуйста с чего начать, как подключить Gl4Java(или подобную ей) к проекту для построения подобной графики.
0
Миниатюры
Графика в Java для Windows   Графика в Java для Windows  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2017, 15:31
Ответы с готовыми решениями:

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

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

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

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

3D графика в Java
Подскажите какую библиотеку выбрать для программирования 3D графики на Java....

15
xoraxax
1432 / 1355 / 403
Регистрация: 05.07.2013
Сообщений: 6,564
Завершенные тесты: 2
09.03.2017, 19:00 2
Цитата Сообщение от VlGuvin Посмотреть сообщение
с чего начать
с maven начни, например
0
VlGuvin
0 / 0 / 4
Регистрация: 04.08.2015
Сообщений: 225
09.03.2017, 19:46  [ТС] 3
Спасибо. Попробую. Но пока остановился на GL4Java. Если у ого есть опыт подключения библиотеки к проекту в Net Beans отклинитесь пожалуйста.
0
xoraxax
1432 / 1355 / 403
Регистрация: 05.07.2013
Сообщений: 6,564
Завершенные тесты: 2
09.03.2017, 21:46 4
Идешь в Гугл, пишешь maven, читаешь, что это такое и как этим пользоваться.
0
VlGuvin
0 / 0 / 4
Регистрация: 04.08.2015
Сообщений: 225
09.03.2017, 23:29  [ТС] 5
Может я чего-то не понимаю. Но как графика OpenGL соотносится c maven https://habrahabr.ru/post/78252/?
0
KEKCoGEN
Эксперт Java
2082 / 1948 / 508
Регистрация: 28.12.2010
Сообщений: 7,818
10.03.2017, 00:58 6
Цитата Сообщение от VlGuvin Посмотреть сообщение
Но как графика OpenGL соотносится c maven
Цитата Сообщение от VlGuvin Посмотреть сообщение
подключения библиотеки к проекту
maven как раз это хорошо умеет.
0
ntlinuxnt
$ su
1598 / 513 / 97
Регистрация: 18.11.2010
Сообщений: 2,805
Записей в блоге: 2
Завершенные тесты: 5
10.03.2017, 02:24 7
Или Gradle. Приходите еще.
0
VlGuvin
0 / 0 / 4
Регистрация: 04.08.2015
Сообщений: 225
10.03.2017, 09:42  [ТС] 8
Если не сложно киньте пожалуйста ссылки где про это подробней можно почитать (подключение GLUT к java ).
0
xoraxax
1432 / 1355 / 403
Регистрация: 05.07.2013
Сообщений: 6,564
Завершенные тесты: 2
10.03.2017, 10:40 9
Лучший ответ Сообщение было отмечено ntlinuxnt как решение

Решение

1. https://maven.apache.org/ тут
можешь видео на ютубе поискать, там покажут
2. gl4java судя по всему протух несколько лет назад, используй jogl
3. гугление заняло у меня меньше времени, чем написание этого текста
4. https://www.tutorialspoint.com/jogl/
1
rinat_w
89 / 85 / 17
Регистрация: 13.11.2011
Сообщений: 192
Завершенные тесты: 1
10.03.2017, 12:21 10
Да и не обязательно подключать сторонние библиотеки, эту простую графику можно спокойно на встроенной JFrame забацать
0
VlGuvin
0 / 0 / 4
Регистрация: 04.08.2015
Сообщений: 225
11.03.2017, 09:08  [ТС] 11
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
xoraxax
1432 / 1355 / 403
Регистрация: 05.07.2013
Сообщений: 6,564
Завершенные тесты: 2
11.03.2017, 10:02 12
Пиши развернуто. Что значит не работает.
0
VlGuvin
0 / 0 / 4
Регистрация: 04.08.2015
Сообщений: 225
11.03.2017, 10:48  [ТС] 13
В первом развернутом блоке кода этот код имеется. Второй блок с кодом это именно то, что не работает в методе
Java
1
public void display(GLAutoDrawable gLDrawable)
Добавлено через 18 минут
Это вывод на графическую форму текста "Hello World". Текст не выводится... Не врубаюсь почему. Вся прочая графика в этом методе работает нормально.
0
VlGuvin
0 / 0 / 4
Регистрация: 04.08.2015
Сообщений: 225
13.03.2017, 10:58  [ТС] 14
Графика работает нормально. В том числе и вывод текста на графическую форму типа:
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
xoraxax
1432 / 1355 / 403
Регистрация: 05.07.2013
Сообщений: 6,564
Завершенные тесты: 2
13.03.2017, 12:37 15
поищи примеры какие-нибудь
http://jogamp.org/git/?p=jogl.git;a=...463c4c;hb=HEAD
0
VlGuvin
0 / 0 / 4
Регистрация: 04.08.2015
Сообщений: 225
13.03.2017, 14:55  [ТС] 16
Спасибо разобрался. Для перерисовки картинки (периодический вызов метода 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
13.03.2017, 14:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2017, 14:55

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

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

2d графика и изометрия в java
Доброго времени суток. Какие есть средства в java, для создания изометрической...


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

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

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