2017-10-27 15 views
0

この質問はたくさん尋ねられますが、私はそれを行う非常に一般的な方法を見ていません。私はJavaFXを使ってJava Eclipse Oxygenのデスクトップアプリケーションを開発しています。いつでも表示したいローダーと、http経由でイメージをロードしています。ユーザーが別の行をクリックすると、イメージがhttp経由で読み込まれる必要があります。だから私はイメージの上に私のローダーを持って、私はちょうど使用します。 productPreviewLoader.setVisible(true)を表示または非表示にします。 fxml内のローダーImageViewは、GridPaneで次のようになります。ImageViewでJavaFXのgifイメージを再生する

<GridPane> 
    <columnConstraints> 
     <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" /> 
    </columnConstraints> 
    <rowConstraints> 
     <RowConstraints minHeight="10.0" valignment="TOP" vgrow="ALWAYS" /> 
     <RowConstraints vgrow="SOMETIMES" /> 
     <RowConstraints vgrow="SOMETIMES" /> 
    </rowConstraints> 
    <children> 
     <ImageView fx:id="productPreview" fitHeight="282.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" /> 
     <!-- This is the loader--> 
     <ImageView fx:id="productPreviewLoader" fitHeight="112.0" fitWidth="136.0" pickOnBounds="true" preserveRatio="true" /> 
     <TextFlow fx:id="productPreviewTextFlow" GridPane.rowIndex="1"> 
     <GridPane.margin> 
      <Insets right="10.0" /> 
     </GridPane.margin> 
     <padding> 
      <Insets bottom="30.0" left="10.0" right="10.0" top="30.0" /> 
     </padding></TextFlow> 

ローダーイメージを設定するコードは次のようになります。

//Set up the product preview image loader 
BufferedImage bufferedImage; 
File file = new File("resources\\images\\loaders\\img-loader-icon.gif"); 
try { 
bufferedImage = ImageIO.read(file); 
    productPreviewLoader.setImage(SwingFXUtils.toFXImage(bufferedImage, null)); 
} catch (IOException e1) { 
// TODO Auto-generated catch block 
e1.printStackTrace(); 
} 
productPreviewLoader.setVisible(false); 

画像がImageViewで再生されません。それができない場合は、私にそれを行う別の方法を教えてください。また、ImageViewをImageViewをGridPane行の中央に配置するのに問題があります。 GridPaneは、ウィンドウのサイズが変更されるたびに、親の高さに合わせてサイズが変更されます。私はこれが2つの質問であることを知っていますが、おそらく2つの質問を作成することになりました。

答えて

0

さてあなたは私があなたに完全な例を与えるので、あなたはImageViewのにGIF画像を読み込むことができる方法の使用例を示すために使用できる完全な例を提供していない:

import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 
import java.net.URLConnection; 

import javafx.application.Application; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.FlowPane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class GifViewerTest extends Application { 

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

    @Override 
    public void start(Stage stage) throws Exception { 

     VBox box = new VBox(); 
     ImageView imageView = new ImageView(); 

     box.getChildren().add(imageView); 

     Button localLoadButton = new Button("Local load"); 
     Button externalLoadButton = new Button("URL Load"); 

     localLoadButton.setOnAction(e -> { 
      imageView.setImage(new Image(this.getClass().getResource("java.gif").toExternalForm())); 
     }); 

     externalLoadButton.setOnAction(e -> { 
      String imageSource = "https://cdn.dribbble.com/users/550761/screenshots/1773241/untitled-5.gif"; 
      try { 
       imageView.setImage(createImage(imageSource)); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 
     }); 

     FlowPane buttonPane = new FlowPane(); 
     buttonPane.setAlignment(Pos.CENTER); 
     buttonPane.getChildren().addAll(localLoadButton, externalLoadButton); 

     box.getChildren().add(buttonPane); 

     stage.setScene(new Scene(box, 500, 400)); 
     stage.show(); 
    } 

    private Image createImage(String url) throws IOException { 
     // You have to set an User-Agent in case you get HTTP Error 403 
     // respond while you trying to get the Image from URL. 
     URLConnection conn = new URL(url).openConnection(); 
     conn.setRequestProperty("User-Agent", "Wget/1.13.4 (linux-gnu)"); 

     try (InputStream stream = conn.getInputStream()) { 
      return new Image(stream); 
     } 
    } 
} 

すべての画像がURL経由でロードされている場合は、ImageViewを使用する代わりにWebViewerを使用してURLをロードするだけですか?このような場合にgifイメージがInputStreamからロードされるまでGUIの遅延を引き起こすgifのサイズが小さくない場合は、バックグラウンドスレッドへのロードプロセスを作成する必要がありますが、WebViewerを使用している場合はすべてを避けることができます。

+0

このコードを見ると、再生するgitアニメーションが設定されている場所はありません。画像をロードするためのボタンが追加されている点を除きます。私は画像をロードするのに問題はない。イメージはImageViewに追加されたときには再生されません。最初のフレームにとどまります。 – LogicDev

+0

「遊び」とまったく同じ意味ですか?上記のコードを使用して "URL Load"ボタンをクリックすると、gif Imageが表示されます。 externalLoadButtonは、gif ImageをURL経由でImageViewにロードします。多分私はあなたの目標をここで理解していない...私が間違っている場合は私を訂正してください。 – JKostikiadis

+0

gifイメージにアニメーションが含まれています。私のコードで、 'productPreviewLoader.setImage(SwingFXUtils.toFXImage(bufferedImage、null));'を使用すると、画像はまだアニメーションなしのままです。 – LogicDev

関連する問題