2016-09-28 3 views
1

URLまたはファイルチョーザを使用して画像を表示する際に問題が発生しています。私はURLからファイルを引っ張る方法や、その画像を表示する方法がわからないPCからメソッドを実装しました。私はURLから引っ張る方法を呼び出すのはここURLまたはファイルチョイスから画像を表示するのに手助けが必要

は次のとおりです。

@FXML 
private void button0Action (ActionEvent event) throws IOException { 

     catdog c = new catdog(); 
     String cat = c.cat();   
     System.out.println(cat); 

出力ダイアログがURLを返します。 http://24.media.tumblr.com/tumblr_llmbvhAcsF1qg20muo1_500.gif

ここでは私のDisplayクラスです:

package screensaver; 

import javafx.application.Application; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.layout.GridPane; 
import javafx.stage.Stage; 

public class Display extends Application { 
    @Override // Override the start method in the Application class 
    public void start(Stage primaryStage) { 
     GridPane pane = new GridPane(); 
     pane.setAlignment(Pos.CENTER); 
     pane.setHgap(0); 
     pane.setVgap(0); 

     Scene scene = new Scene(pane); 
     primaryStage.setTitle("imageViewer"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 
} 

DisplayおよびImageViewの新しいインスタンスを作成:

@FXML 
private void button0Action (ActionEvent event) throws IOException { 

     catdog c = new catdog(); 
     String cat = c.cat();   
     System.out.println(cat); 

     Display catDisplay = new Display(); 
     ImageView catImage = new ImageView(cat); 

} 

画像をペインに追加して、開始方法を呼び出してシーンを表示するにはどうすればよいですか? DisplayクラスにImageViewのインスタンスを作成してから、button0Actionメソッドからurlを含む変数catをプルできないのに、画像をペインに追加できることはわかっています。現時点では立ち往生し、ここからどこに行くのか分からない。過去数日間、幸運のないさまざまな方法を試していました。何か案は?

Displayクラス:

package screensaver; 

import java.io.IOException; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.GridPane; 
import javafx.stage.Stage; 

public class Display { 
public void showImage0 (String url) throws IOException { 

    Stage stage = new Stage(); 
    GridPane pane = new GridPane(); 
    pane.setAlignment(Pos.CENTER); 
    pane.setHgap(0); 
    pane.setVgap(0); 

    Catdog c = new Catdog(); 
    pane.getChildren().add(new ImageView(c.cat())); 

    Scene scene = new Scene(pane); 
    stage.setTitle("imageViewer"); 
    stage.setScene(scene); 
    stage.show(); 
} 

public void showImage1 (String url) throws IOException { 

    Stage stage = new Stage(); 
    GridPane pane = new GridPane(); 
    pane.setAlignment(Pos.CENTER); 
    pane.setHgap(0); 
    pane.setVgap(0); 

    Catdog d = new Catdog(); 
    pane.getChildren().add(new ImageView(d.dog())); 

    Scene scene = new Scene(pane); 
    stage.setTitle("imageViewer"); 
    stage.setScene(scene); 
    stage.show(); 
} 

public void showImage2 (String url) throws IOException { 

    Stage stage = new Stage(); 
    GridPane pane = new GridPane(); 
    pane.setAlignment(Pos.CENTER); 
    pane.setHgap(0); 
    pane.setVgap(0); 

    LandscapeImage lI = new LandscapeImage(); 
    pane.getChildren().add(new ImageView(lI.imageSource)); 

    Scene scene = new Scene(pane); 
    stage.setTitle("imageViewer"); 
    stage.setScene(scene); 
    stage.show(); 
} 

public void showImage3 (String file) throws IOException { 

    Stage stage = new Stage(); 
    GridPane pane = new GridPane(); 
    pane.setAlignment(Pos.CENTER); 
    pane.setHgap(0); 
    pane.setVgap(0); 

    FileChooser fc3 = new FileChooser(); 

    pane.getChildren().add(new ImageView(fc3.fileChoice())); 

    Scene scene = new Scene(pane); 
    stage.setTitle("imageViewer"); 
    stage.setScene(scene); 
    stage.show(); 
    } 
} 

エラーここに発生します。ここでは、ここで

pane.getChildren().add(new ImageView(fc3.fileChoice())); 

を許可されていない '無効' タイプは、ファイルチューザクラスです:

ここ

は、これまでのところは私の変化であります

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package screensaver; 

import java.io.File; 
import java.io.IOException; 
import javafx.scene.control.Alert; 
import javafx.scene.control.ButtonType; 

/** 
* 
* @author Jacob 
*/ 
public class FileChooser { 
void fileChoice() throws IOException{ 
    javafx.stage.FileChooser fc3 = new javafx.stage.FileChooser(); 
    File selectedFile = fc3.showOpenDialog(null); 

    fc3.getExtensionFilters().addAll(
     new javafx.stage.FileChooser.ExtensionFilter("Image Files", "*.png", "*.jpg", "*.gif")); 


    if (selectedFile != null) { 

     String location = (selectedFile.getAbsoluteFile().toURI().toString()); 
     System.out.println(location); 

     Display ownDisplay = new Display(); 
     ownDisplay.showImage3(location); 
    } else { 

     Alert alert = new Alert(Alert.AlertType.CONFIRMATION,"No file was selected"); 

     alert.showAndWait() 
     .filter(response -> response == ButtonType.OK) 
     .ifPresent((ButtonType response) -> { 
      System.out.println("OK"); 
     }); 
    } 
} 
} 

最新コード:

表示方法:

public void showImage3 (String file) throws IOException, Exception { 

    Stage stage = new Stage(); 
    GridPane pane = new GridPane(); 
    pane.setAlignment(Pos.CENTER); 
    pane.setHgap(0); 
    pane.setVgap(0); 

    pane.getChildren().add(new ImageView(file)); 

    Scene scene = new Scene(pane); 
    stage.setTitle("imageViewer"); 
    stage.setScene(scene); 
    stage.show(); 
    } 

button3Action方法:

@FXML 
private void button3Action(ActionEvent event) throws IOException, Exception { 

     FileChooser fc3 = new FileChooser(); 
     File selectedFile = fc3.showOpenDialog(null); 

     fc3.getExtensionFilters().addAll(
     new ExtensionFilter("Image Files", "*.png", "*.jpg", "*.gif")); 


    if (selectedFile != null) { 

     String location = (selectedFile.getAbsoluteFile().toURI().toString()); 
     System.out.println(location); 
     Display fileChoice = new Display(); 
     fileChoice.showImage3(location); 

    } else { 

     Alert alert = new Alert(AlertType.CONFIRMATION,"No file was selected"); 

     alert.showAndWait() 
     .filter(response -> response == ButtonType.OK) 
     .ifPresent((ButtonType response) -> { 
      System.out.println("OK"); 
     }); 

    } 
    } 
+0

あなたは(グリッド - )** 'pane'に**あなたの**' catImage'を追加する必要があります**。 ** 'pane.getChildren()。add(...)' **、レイアウトを尊重します。それに、大文字で始まる変数と小文字のクラス(Javaの場合) – Ben

+0

URLを使って動作するようになっていますが、現在はファイルの選択に問題があります。 – user3440443

+0

私はあなたの質問を本当に理解していません。たぶんcatオブジェクト/変数を取るDisplay-Classに** Constructor **を追加できますか? (しかし、あなたのDisplay-Classはアプリケーションを拡張しますか?)ただダイアログが必要ですか? – Ben

答えて

1

編集2:
私は本当にもうあなたに従うことができなかった原因、 はこのことを理解しよう例(それは完全に機能しています)。
これはあなたの問題を解決するために役立つはずです。

public class TestClass extends javafx.application.Application 
{ 
    @Override 
    public void start(javafx.stage.Stage primaryStage) 
    { 
     javafx.scene.control.Button button = new javafx.scene.control.Button("click me"); 
     button.setOnAction((javafx.event.ActionEvent event) -> { chooseImageAndDisplay(); }); 

     javafx.scene.layout.BorderPane pane = new javafx.scene.layout.BorderPane(); 
     pane.setCenter(button); 
     pane.setPrefSize(300, 200); 
     javafx.scene.Scene scene = new javafx.scene.Scene(pane); 
     primaryStage.setTitle("imageViewer"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private void chooseImageAndDisplay() 
    { 
     javafx.stage.FileChooser fc = new javafx.stage.FileChooser(); 
     fc.getExtensionFilters().addAll(new javafx.stage.FileChooser.ExtensionFilter("Image Files", "*.png", "*.jpg", "*.gif")); 

     java.io.File selectedFile = fc.showOpenDialog(null); 

     if (selectedFile != null) 
     { 
     String location = (selectedFile.getAbsoluteFile().toURI().toString()); 

     javafx.scene.layout.BorderPane pane = new javafx.scene.layout.BorderPane(); 
     pane.setPrefSize(300, 200); 
     javafx.scene.image.ImageView iw = new javafx.scene.image.ImageView(location); 
     pane.setCenter(iw); 

     javafx.scene.Scene scene = new javafx.scene.Scene(pane); 
     javafx.stage.Stage stage = new javafx.stage.Stage(); 
     stage.setTitle("imageViewer"); 
     stage.setScene(scene); 
     stage.show(); 
     } 
    } 

    public static void main(String[] args) 
    { 
     launch(args); 
    } 
} 
+0

私はfilechooserのコードを変更する必要はありませんでした。私はちょうど私の表示メソッドと私のbutton3ActionEventに若干の変更を加えました。質問に新しいコードを追加しました。 – user3440443

+0

あなたの新しい状況/コードに従って質問全体を適切に更新してください。私はもうあなたに従うことができません。 現在の問題は何ですか?画像は表示されていませんか?新しいステージが表示されますか?例外はありますか? 画像を間違って追加したため、画像が表示されないことがあります。 GridLayoutの使い方を確認してください。あなたは** BorderPane **でそれを置き換えることができ、** add(...)の代わりに** setCenter(...)**を呼び出すことができます** – Ben

+0

プログラムはそれがどのように動作するか動作します。私が投稿したコードに問題はありません。私はそれが働くために以前にどのようにしていたかを反映するために自分の方法を変更する必要はなかったと言っていました。私はshowImage3で変数ファイルを渡して、ファイルチューザのために別のクラスを作成するのではなく、オリジナルのボタンアクションメソッドから呼び出すことができました。 – user3440443

関連する問題