2016-10-01 4 views
0

私はjavafxに全く新しいです。
以下のコードが機能していない理由を知るには、おそらく参考になるでしょう。 (行31:pwを解決することはできません)
また、私が間違っているか非効率的に何をしているかも知っていれば分かります。
最終目標は、ある時点で画面上にピクセル単位で画像を描画させることです。
しかし、その画像は、それほど確かではありません。複数の異なるクラスからその画像にピクセルを追加したいと考えています。
さらに従来のUIを上に追加する可能性もありますが、それは優先事項ではありません。startメソッドの外側からステージ内の何かを使用するには?

import javafx.application.Application; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.Group; 
import javafx.scene.image.PixelWriter; 
import javafx.scene.canvas.*; 

public class Render extends Application { 

    public static void render(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) { 
     stage.setTitle("Placeholder Title"); 
     Canvas canvas = new Canvas(1280, 720); 
     Group root = new Group(canvas); 
     Scene scene = new Scene(root, 1280, 720); 
     stage.setScene(scene); 
     PixelWriter pw = canvas.getGraphicsContext2D().getPixelWriter(); 
     stage.show(); 
    } 

    private static void testRender() { 
     int c = -1; 
     for (int x = 0; x < 1280; x++) { 
      for (int y = 0; y < 720; y++, c--) { 
       pw.setArgb(x, y, c); 
      } 
     } 
    } 

} 
+0

「働いていない」と具体的に説明してください - 起こっていること(起こってはならない)、何が起こると予想したのですか、何か誤りがありましたか?行為エラーメッセージと行)... – UnholySheep

+0

"start'の外で' Stage'を使う方法については、別のクラスメンバ変数に格納するか、明示的にそれを使用する必要がある関数に渡すことができますそれ。 – UnholySheep

+0

@UnholySheep、プログラムは実行されますが、「解決できない」PixelWriterを使用しようとしているため、どこでもtestRenderメソッドを使用することはできません。何も解決できません。私は、startメソッドの中で宣言したものは使用できません。 – Torn

答えて

0

コメントで私の説明は、私は(テストしていない、私はそれが含まれている可能性のあるエラーを支援しようとするでしょう)コードを修正して説明しよう不明確であるように見えると。

オプション1:クラスのメンバーとしてアクセス変数を保存する:

import javafx.application.Application; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.Group; 
import javafx.scene.image.PixelWriter; 
import javafx.scene.canvas.*; 

public class Render extends Application { 

    private PixelWriter pw; 

    public static void render(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) { 
     stage.setTitle("Placeholder Title"); 
     Canvas canvas = new Canvas(1280, 720); 
     Group root = new Group(canvas); 
     Scene scene = new Scene(root, 1280, 720); 
     stage.setScene(scene); 
     pw = canvas.getGraphicsContext2D().getPixelWriter(); 
     testRender(); // we can't call this before everything has been initialized anyway 
     stage.show(); 
    } 
    // this doesn't need to be static 
    private void testRender() { 
     int c = -1; 
     for (int x = 0; x < 1280; x++) { 
      for (int y = 0; y < 720; y++, c--) { 
       pw.setArgb(x, y, c); 
      } 
     } 
    } 
} 

オプション2:パラメータとしてアクセスのインスタンスを渡す:

@Override 
public void start(Stage stage) { 
    stage.setTitle("Placeholder Title"); 
    Canvas canvas = new Canvas(1280, 720); 
    Group root = new Group(canvas); 
    Scene scene = new Scene(root, 1280, 720); 
    stage.setScene(scene); 
    PixelWriter pw = canvas.getGraphicsContext2D().getPixelWriter(); 
    testRender(pw); 
    stage.show(); 
} 

private static void testRender(PixelWriter pw) { 
    int c = -1; 
    for (int x = 0; x < 1280; x++) { 
     for (int y = 0; y < 720; y++, c--) { 
      pw.setArgb(x, y, c); 
     } 
    } 
} 

私は、これはあなたが可能な解決策

を理解するのに役立ちます願っています
+0

そうですね、これらの例はうまくいきますが、他のクラスからpwを使いたい場合、オプション2は実際には動作しません.pwをpublicに設定しても、静的な参照はできません。 – Torn

+0

他のクラスからこれらの変数にアクセスしたい場合は、適切なアーキテクチャを考える必要があります(例えば、必要なすべての変数/インスタンスを格納して管理するシングルトンを持っていて、別のクラスにアクセスできるようにしてください) – UnholySheep

+0

'start () 'メソッドは、アプリケーションへのエントリポイントです(つまり、本質的に最初に呼び出されるメソッド)。したがって、あなたが書く他のクラスが(例えば 'pw'のような)これらの値に依存する場合、それらのクラスから作成したオブジェクトにそれらの値を渡すことができます。これらのインスタンスは、最終的には 'start()'メソッドや 'start()'などから呼び出されるメソッドで作成する必要があります。 –

1

このリンクから、JavaFXを使い始めることができます。

https://docs.oracle.com/javase/8/javafx/get-started-tutorial/

+0

私はそれらを見ましたが、私がしようとしていることに関連するものではありません。私が知る限り、彼らはスタートメソッドの中ですべてを行います。 – Torn

+0

@Override表記の​​前にPixelWriterオブジェクトを宣言するだけで済みます。 – CTN

+0

あなたの他の答えはまったく普通ではありません。そのようにインスタンス化することはできません。 – Torn

関連する問題