2012-12-19 21 views
0

我正在嘗試製作一個顯示可操作的Jzy3D圖形的小程序。目前我已經設法讓它顯示圖表,但無論如何我無法影響它;這是有意義的,因爲applet目前不在尋找任何用戶輸入。將Jzy3D嵌入到一個小程序中

我應該如何拿起用戶輸入(鼠標移動,點擊等)?我想我可以嘗試創建一個信使類,它接收applet輸入並將其發送給Jzy3D,然後Jzy3D接受移動並對其執行操作,但看起來非常複雜。 看着Community Discussion Board,建議使用JOGLAppletLaucher。那是爲了繞過這個問題嗎?如果是這樣,它應該怎麼做?

編輯:我相信我現在明白JOGLAppletLauncher(及其succesor 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 

    } 

}

回答

0

明白了!這是我的代碼。我也改變了我的generateScatter現在返回圖表「返回圖表」,而不是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(); 
} 


}