package com.jogl.second;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.HeadlessException;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLCapabilities;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import com.sun.opengl.util.Animator;
import com.sun.opengl.util.FPSAnimator;
publicclassLineGraphAppextendsJFrameimplements ActionListener{
LineGLEventListener listener = newLineGLEventListener(); //初始化我们的GLEventListener
GLCanvas glcanvas=null;
JTextField ajtf = newJTextField("3", 3); //定义一个输入框 ajtf
JTextField bjtf = newJTextField("2", 3); //定义一个输入框 bjtf
JTextField mjtf = newJTextField("-1", 6); //定义一个输入框 mjtf
publicstaticAnimator animator=null;
public LineGraphApp() throws HeadlessException {
super("点斜计算");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel jp = newJPanel(); //定义一个JPANEL
jp.add(newJLabel("x:")); //给JPANEL添加JLabel
jp.add(ajtf); //给JPANEL添加输入框ajtf
jp.add(newJLabel(" y:")); //给JPANEL添加JLabel
jp.add(bjtf); //给JPANEL添加输入框
jp.add(newJLabel(" slope: ")); //给JPANEL添加JLabel
jp.add(mjtf); //给JPANEL添加输入框
JButton jb = newJButton("重画"); //定义一个按钮
jb.addActionListener(this); //给按钮添加事件
jp.add(jb); //给JPANEL添加一个按钮
getContentPane().add("South", jp); //给窗体添加JPANEL,位置为南
GLCapabilities glcaps = newGLCapabilities(); //定义GL渲染
GLCanvas canvas = newGLCanvas(glcaps); //定义GLCanvas
canvas.addGLEventListener(listener); //给GLCanvas添加GLEventListener
getContentPane().add(canvas, BorderLayout.CENTER); //给窗体添加GLCanvas,位置为中
animator=newFPSAnimator(canvas,20,true); //初始化FPSAnimator动画线程,每秒20帧
setSize(500, 300);
centerWindow(this);
}
privatevoid centerWindow(Component frame) { //居中窗体
Dimension screenSize =
Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
if (frameSize.width > screenSize.width )
frameSize.width = screenSize.width;
if (frameSize.height > screenSize.height)
frameSize.height = screenSize.height;
frame.setLocation (
(screenSize.width - frameSize.width ) >> 1,
(screenSize.height - frameSize.height) >> 1
);
}
publicstaticvoid main(String[] args) {
finalLineGraphApp app = newLineGraphApp();
// 显示窗体
SwingUtilities.invokeLater (
new Runnable() {
publicvoid run() {
app.setVisible(true);
}
}
);
//动画线程开始
SwingUtilities.invokeLater (
new Runnable() {
publicvoid run() {
animator.start( );
}
}
);
}
publicvoid actionPerformed(ActionEvent e) { //按钮的动作
listener.a = Double.parseDouble( ajtf.getText() ); //获得ajtf输入框的值,给listener
listener.b = Double.parseDouble( bjtf.getText() ); //获得bjtf输入框的值,给listener
listener.m = Double.parseDouble( mjtf.getText() ); //获得mjtf输入框的值,给listener
}
}
package com.jogl.second;
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;
publicclassLineGLEventListenerimplements GLEventListener {
publicdouble m = -1;
publicdouble a = 3;
publicdouble b = 2;
float red;
float green;
float blue;
publicvoid display(GLAutoDrawable arg0) {
GL gl = arg0.getGL();
drawGraph(gl); //预先画上背景,也就是网格和两轴。
red = 1.0f;
green = 0.2f;
blue = 0.2f;
gl.glColor3f(red, green, blue); //设置画图的颜色,也就是画刷颜色
//
gl.glBegin(GL.GL_POINTS);
double a1 = a * 10;
double b1 = b * 10;
for (int x = -250; x <= 250; x++) {
gl.glVertex2d(x, (m * (x - a1) + b1)); //画点,看起来像一条斜线
}
gl.glEnd();
//
red = 1.0f;
green = 1.0f;
blue = 1.0f;
gl.glColor3f(red, green, blue);
gl.glPointSize(4.0f);
//
gl.glBegin(GL.GL_POINTS);
gl.glVertex2d(a1, b1); //画你输入的端点
gl.glEnd();
//
gl.glPointSize(2.0f); //设置点的大小为2.0f
}
privatevoid drawGraph(GL gl) {
float red;
float green;
float blue;
gl.glClear(GL.GL_COLOR_BUFFER_BIT);
red = 0.3f;
green = 0.3f;
blue = 0.3f;
gl.glColor3f(red, green, blue);
// 画网格
gl.glBegin(GL.GL_LINES);
// 先画水平线
for (int x = -250; x <= 250; x += 10) {
gl.glVertex2d(x, -150);
gl.glVertex2d(x, 150);
}
// 画直线
for (int y = -150; y <= 150; y += 10) {
gl.glVertex2d(-250, y);
gl.glVertex2d(250, y);
}
gl.glEnd();
// 画 x轴 和 y轴
red = 0.0f;
green = 0.3f;
blue = 0.5f;
gl.glColor3f(red, green, blue);
gl.glBegin(GL.GL_LINES);
gl.glVertex2d(0, 140);
gl.glVertex2d(0, -140);
// line for x-axis
gl.glVertex2d(240, 0);
gl.glVertex2d(-240, 0);
gl.glEnd();
// 画X轴和Y轴的箭头
gl.glBegin(GL.GL_TRIANGLES);
gl.glVertex2d(0, 150);
gl.glVertex2d(-5, 140);
gl.glVertex2d(5, 140);
gl.glVertex2d(0, -150);
gl.glVertex2d(-5, -140);
gl.glVertex2d(5, -140);
gl.glVertex2d(250, 0);
gl.glVertex2d(240, -5);
gl.glVertex2d(240, 5);
gl.glVertex2d(-250, 0);
gl.glVertex2d(-240, -5);
gl.glVertex2d(-240, 5);
gl.glEnd();
}
publicvoid displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) {
}
publicvoid init(GLAutoDrawable arg0) {
GL gl = arg0.getGL();
GLU glu = newGLU(); //定义GLU
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //设置背景颜色,0,0,0为黑
gl.glLineWidth(2.0f); //设置线宽
gl.glPointSize(2.0f); //设置点的大小
gl.glViewport(-250, -150, 250, 150); //设置可视区域
gl.glMatrixMode(GL.GL_PROJECTION); //设置场景平滑
gl.glLoadIdentity();
glu.gluOrtho2D(-250.0, 250.0, -150.0, 150.0);
//使坐标系统出现的GL里,从X轴-250到250,从Y轴-150到150
}
publicvoid reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3,
int arg4) {
}
}
运行效果:多点从例子里找到乐趣,只要你喜欢,比如把点的颜色改为全随机颜色,画垂直线等等。