Встраивание Jzy3D в апплет
Я пытаюсь сделать апплет, который отображает график Jzy3D, который можно манипулировать. В настоящее время мне удалось заставить его отображать график, но я никак не могу повлиять на него; это имеет смысл, поскольку апплет в настоящее время не ищет какой-либо пользовательский ввод.
Как я могу подобрать пользовательский ввод (движение мыши, щелчок и т. Д.)? Я полагаю, я мог бы попытаться создать класс мессенджера, который принимает входные данные апплета и отправляет его в Jzy3D, который затем принимает движение и что-то делает с ним, но это кажется очень сложным. Глядя на дискуссионный форум сообщества, было предложено использовать JOGLAppletLaucher. Смысл в том, чтобы обойти эту проблему? Если да, то как это сделать?
РЕДАКТИРОВАТЬ: Я полагаю, что теперь я понимаю смысл JOGLAppletLauncher (и его преемник JNLPAppletLauncher), но вопрос о том, как передать пользовательский ввод все еще стоит. Есть идеи?
мой текущий код:
package daniel.work;
import java.applet.Applet;
import javax.swing.JApplet;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import com.sun.opengl.util.JOGLAppletLauncher;
public class SimpleApplet extends JApplet {
public void start(){
try{
SwingUtilities.invokeAndWait(new Runnable(){
public void run(){
add(ScatterCanvas.generateCanvas());
}
});
}
catch(Exception e){
System.out.println(e);
}
}
}
а также
package daniel.work;
import java.awt.Canvas;
import org.jzy3d.chart.Chart;
import org.jzy3d.colors.Color;
import org.jzy3d.demos.AbstractDemo;
import org.jzy3d.demos.Launcher;
import org.jzy3d.maths.Coord3d;
import org.jzy3d.plot3d.primitives.Scatter;
public class ScatterCanvas extends AbstractDemo{
public static Canvas generateCanvas(){
// Create the dot cloud scene and fill with data
int size = 2000;
float x;
float y;
float z;
float a;
Coord3d[] points = new Coord3d[size];
Color[] colors = new Color[size];
for(int i=0; i<size; i++){
x = (float)Math.random() - 0.5f;
y = (float)Math.random() - 0.5f;
z = (float)Math.random() - 0.5f;
points[i] = new Coord3d(x, y, z);
a = 0.25f + (float)(points[i].distance(Coord3d.ORIGIN)/Math.sqrt(1.3)) / 2;
colors[i] = new Color(x, y, z, a);
}
Scatter scatter = new Scatter(points, colors);
chart = new Chart();
chart.getScene().add(scatter);
return (Canvas) chart.getCanvas();
}
protected static Chart chart;
@Override
public void init() throws Exception {
// TODO Auto-generated method stub
}
}
1 ответ
Понял! Вот мой код Я также изменил свой generateScatter, чтобы он теперь возвращал Chart "return chart" в отличие от ICavnas
package myjogl;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.SwingUtilities;
import org.jzy3d.chart.Chart;
import org.jzy3d.chart.controllers.mouse.ChartMouseController;
import org.jzy3d.chart.controllers.thread.ChartThreadController;
import org.jzy3d.plot3d.rendering.canvas.ICanvas;
@SuppressWarnings("serial")
public class JzyApplet extends JApplet implements ActionListener{
private Chart chart = null;
private ICanvas canvas = null;
public void init(){
try{
SwingUtilities.invokeAndWait(new Runnable(){
public void run(){
chart = ScatterCanvas.generateCanvas(); //this just returns a chart object with a scatter object
canvas = chart.getCanvas();
add((Component) canvas);
}
});
}
catch(Exception e){
System.out.println(e);
}
ChartMouseController mouse = new ChartMouseController();
chart.addController(mouse);
ChartThreadController thread = new ChartThreadController();
mouse.addSlaveThreadController(thread);
chart.addController(thread);
thread.start();
}
@Override
public void actionPerformed(ActionEvent e) {}
public void zoom(){
float value = canvas.getView().getBounds().getXmax()-10;
canvas.getView().getBounds().setXmax(value);
canvas.getView().shoot();
}
}