2016-10-13 5 views
1

Image library on the left side : - のScrollPane -JavaFX - 画像のスリム化により、ヒープスペースのオーバーロードを防ぐことができますか?ため、私は次のような構造で画像ライブラリを実装したJavaFXで画像ビューアをプログラミングする

のHBoxのVBox

これは、基本的な構造であり、ライブラリ・オブジェクトがあります

StackPane - ImageView - ラベル

ScrollPaneにはsetAlignment方法はありませんので、私はそれの他の機能を必要としないにもかかわらず、HBoxに全部を入れました。

これらの方法は、ライブラリの生成と初期化を担当している:

private HBox createScrollableLibrary() 
{ 
    libraryContent = new VBox(); 
    libraryContent.setPadding(new Insets(10)); 
    libraryContent.setAlignment(Pos.CENTER); 
    libraryContent.setStyle("-fx-background-color: transparent"); 
    libraryContent.setSpacing(10); 

    libraryScroll = new ScrollPane(); 
    libraryScroll.setHbarPolicy(ScrollBarPolicy.NEVER); 
    libraryScroll.setStyle("-fx-background: rgb(0, 0, 0, 0.3);" 
        + "-fx-background-color: rgb(0, 0, 0, 0.3);"); 
    libraryScroll.setMinWidth(135); 
    libraryScroll.setMaxWidth(135); 
    libraryScroll.setContent(libraryContent); 

    HBox root = new HBox(); 
    root.setPickOnBounds(false); 
    root.getChildren().add(libraryScroll); 
    return root; 
} 

そして:

public void initLibrary() 
{ 
    Runnable work =() -> 
    { 
     ObservableList<StackPane> previewList = FXCollections.observableArrayList(); 
     ImageView preview; 
     Label label; 
     StackPane previewAndLabel; 

     for(int i = 0; i < picturePaths.size(); i++) 
     { 
      String path = picturePaths.get(i).toURI().toString(); 
      preview = new ImageView(new Image(path)); 
      preview.setPreserveRatio(true); 
      preview.setFitWidth(100); 
      //label = new Label(new File(path).getName()); 
      label = new Label("IMAGE"); 
      StackPane.setAlignment(label, Pos.CENTER_LEFT); 
      previewAndLabel = new StackPane(); 
      previewAndLabel.getChildren().addAll(preview, label); 
      previewList.add(previewAndLabel); 
     } 

     Platform.runLater(() -> GUI.getLibraryContent().getChildren().addAll(previewList)); 
    }; 
    loading = new Thread(work); 
    if(loading.isAlive()) 
     loading.interrupt(); 
    loading.start(); 
} 

情報:picturePathsはどの順番に選択されたすべての画像のパスが含まれObservableListですFileChooserで選択されています。

今、私の質問(複数可):

私はそれがプレビュー画像などの大きなサイズの写真を使用することは非常に非効率的であることを知っています。 ヒープスペースを1GBに増やしたにもかかわらず、画像を追加しているときにはjava.lang.OutOfMemoryError例外がスローされてしまいましたが、サイズの上限は20-25程度です。 1920x1080から1024x720の解像度など、通常の画像を「スリム化」するにはどうすればよいですか?あるいは、私の図書館で小さな「高速な」画像を使用する別の機会がありますか?また、私のイメージビューアをより速くするために、すでに計算されたイメージをバッファリングすることはできますか?

ヒントと助けをお待ちしております。必要に応じて私のコードを批判してください!

+1

Imageコンストラクタでプレビュー画像のサイズ制限を設定しようとしましたか? –

+0

恐ろしい!私は馬鹿ですが、requestedWidthプロパティとrequestedHeightプロパティがこれを担当しているかどうかはわかりませんでした。 これらの方法を答えとして使用して投稿し、私はそれを参考にするつもりです。 ありがとうございました:) – Rouman

+2

@ JoseMartinezさんの提案は、多くのメモリを節約します。もう一つの最適化は、ライブラリの 'ListView '(イメージのファイルシステムパスであるリスト内のアイテム)を使用して、ファイルからイメージを表示するためのカスタムセルファクトリを使用することです。ここに例があります(http://stackoverflow.com/questions/29515396/javafx-listview-with-images-instead-of-strings)。ここでの利点は、ユーザーがスクロールしてイメージが要求に応じてロードされるときにリストセルが再利用されるため、イメージが画面上をスクロールしてガベージコレクションの対象となることです。 (もちろん、両方の提案を組み合わせることもできます) –

答えて

1

Imageコンストラクタ中にプレビューピクチャのサイズ制約を設定できますが、それ以降はできません。

関連する問題