2016-04-12 15 views
4

スイングアプリケーションウィンドウからJpanel内に処理3のスケッチを表示しようとしています。 (私は日食を使用しています)助けてください!処理3をJpanelに追加

私はスイングベースのGUIの複雑さと機能を必要とし、私のアプリケーションでビジュアルコンテンツを作成するための処理の使いやすさも求めています。

私はKevinの非常に役に立つ答えを使用し、より具体的な質問を作成しました。ありがとうKevin!

処理スケッチをMainGUI.javaから呼び出され、JPanelに挿入されるサブクラスにします。私が抱えている問題は、eclipseがpt.initSurface()が見えないということです。

もう一度お手数をおかけします。処理2では

MainGUI.java

import processing.awt.PSurfaceAWT; 
import processing.awt.PSurfaceAWT.SmoothCanvas; 
import processing.core.PApplet; 
import processing.core.PSurface; 
import processing.opengl.*; 
import processing.data.*; 
import processing.event.*; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

import patterns.ProcessingTest; 

import java.awt.BorderLayout; 
import javax.swing.JButton; 

public class MainGUI { 

    private JFrame frame; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        MainGUI window = new MainGUI(); 
        window.frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the application. 
    */ 
    public MainGUI() { 
     initialize(); 
    } 

    /** 
    * Initialize the contents of the frame. 
    */ 
    private void initialize() { 
     frame = new JFrame(); 
     frame.setBounds(100, 100, 450, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(null); 

     JPanel panel = new JPanel(); 
     panel.setBounds(52, 24, 110, 143); 

     //create your sketch 
     ProcessingTest pt = new ProcessingTest(); 

     //get the PSurface from the sketch 
     PSurface ps = pt.initSurface(); 

     //initialize the PSurface 
     ps.setSize(200, 200); 

     //get the SmoothCanvas that holds the PSurface 
     SmoothCanvas smoothCanvas = (SmoothCanvas)ps.getNative(); 

     panel.setSize(200, 200); 

     //SmoothCanvas can be used as a Component 
     panel.add(smoothCanvas); 
     frame.getContentPane().add(panel); 

     //start your sketch 
     ps.startThread(); 

    } 
} 

ProcessingTest.java

package patterns; 

import javax.swing.JFrame; 

import processing.awt.PSurfaceAWT.SmoothCanvas; 
import processing.core.PApplet; 
import processing.core.PSurface; 

public class ProcessingTest extends PApplet{ 

    public void settings(){ 
     size(200, 200); 
    } 

    public void draw(){ 
     background(0); 
     ellipse(mouseX, mouseY, 20, 20); 
    } 

} 
+1

うーん、あなたのために働いていないものを含めると、あなたのために働くものを絞り込むのに役立つかもしれないのだろうか... –

+10

私はこの質問を再び開くよう投票しています。純粋なJavaの質問ではなく、** [タグ:処理] **の質問であることに注意してください。処理2はJFrameに自身を埋め込むことができました。処理3ではその能力が削除され、非常に混乱する可能性があります。これは完全に有効な処理の質問です。人々はあいまいなJavaの質問のように聞こえるので、それを閉じました。そうではありません。それは特定の処理問題です。 –

答えて

7

あなたはJPanelようAWTまたはSwingComponentでそれを埋め込むことができるように、PAppletは、Appletを拡張しました。

処理3では、PAppletは、Appletを拡張しなくなったため、Componentとして埋め込むことはできなくなりました。

オプション1:言われて、あなたは3つのオプションれていること

は、あなたがあなたの処理のスケッチを埋め込む必要が本当によろしいですか?

Processingスケッチを埋め込む必要がある理由を正確に考えてみましょう。その周りに道がありますか? one of these GUI librariesを使用して処理中にGUIコードを記述することができます。

Processingから別のJFrameを作成することもできます。

オプション2: JavaからProcessingスケッチを起動するだけですか?

もしそうなら、単にPApplet.main("YourSketchNameHere")関数を呼び出すことができます。これはスケッチを開始するように処理を指示し、Processingはウィンドウの作成を処理し、setup()を呼び出し、draw()ループを開始します。

import processing.core.PApplet; 

public class ProcessingTest extends PApplet{ 

    public void settings(){ 
     size(200, 200); 
    } 

    public void draw(){ 
     background(0); 
     ellipse(mouseX, mouseY, 20, 20); 
    } 

    public static void main(String... args){ 
     PApplet.main("ProcessingTest"); 
    } 
} 

オプション3:

ここで日食から実行することができることはほとんど例がありますあなたが本当に、本当に、本当にあなたがあなたのPAppletを埋め込む必要がありますか?

最初の2つのオプションが機能しない場合でも、引き続き基本コンポーネントにアクセスできます。処理3はPSurfaceクラスを導入し、このクラスにはコンポーネントが含まれています。スケッチを埋め込むには、PSurfaceを取得しなければなりません。PSurfaceからネイティブコンポーネントを取得する必要があります。これはまさに簡単ではありませんが、それはなんとかです:あなたはネイティブコンポーネントを持って

import javax.swing.JFrame; 

import processing.awt.PSurfaceAWT.SmoothCanvas; 
import processing.core.PApplet; 
import processing.core.PSurface; 

public class ProcessingTest extends PApplet{ 

    public void settings(){ 
     size(200, 200); 
    } 

    public void draw(){ 
     background(0); 
     ellipse(mouseX, mouseY, 20, 20); 
    } 

    public static void main(String... args){ 

     //create your JFrame 
     JFrame frame = new JFrame("JFrame Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //create your sketch 
     ProcessingTest pt = new ProcessingTest(); 

     //get the PSurface from the sketch 
     PSurface ps = pt.initSurface(); 

     //initialize the PSurface 
     ps.setSize(200, 200); 

     //get the SmoothCanvas that holds the PSurface 
     SmoothCanvas smoothCanvas = (SmoothCanvas)ps.getNative(); 

     //SmoothCanvas can be used as a Component 
     frame.add(smoothCanvas); 

     //make your JFrame visible 
     frame.setSize(200, 200); 
     frame.setVisible(true); 

     //start your sketch 
     ps.startThread(); 
    } 
} 

たら、他のSwingコンポーネントあなたが希望のように扱うことができます。

PSurface.getNative()関数から返されるネイティブコンポーネントの種類を事前に知る必要があることに注意してください。これは、使用しているレンダラーによって異なります。デフォルトのレンダラではSmoothCanvasが使用されますが、他のレンダラでは他のネイティブコンポーネントが使用されます。

また、スケッチを初期化して開始する必要があります。

可能であれば、最初の2つのオプションのいずれかを使用する必要がありますが、実際にスケッチを埋め込む必要がある場合は、オプション3を使用できます。

+0

あなたの答えをありがとうKevinは私の問題を理解するのに本当に役立ついくつかの素晴らしい点を持っています。 stackoverflowの質問をするのは初めてのことです。質問をしてウェブサイトをナビゲートする方法をよりよく理解しています。私はあなたの答えに基づいて私の質問を編集しました。より有益で具体的でなければなりません。ありがとう – Luma