2014-11-28 29 views
9

Tworzę galerię obrazów za pomocą javafx. W Internecie znalazłem wiele informacji na ten temat, ale nie mogłem uzyskać odpowiedniej pomocy w tym zakresie. Muszę stworzyć jedną galerię obrazów, taką jak przeglądarka Picasa. wszystkie obrazy są w widoku miniatur w moim widoku obrazu, a następnie po wybraniu obrazu w wyskakującej przeglądarce. Zrobiłem to za jakiś kod, ale nie uzyskałem poprawnego wyniku. Wszystkie obrazy z folderu przerysowuje się z tych samych współrzędnych. Poniżej znajduje się mój kod i wynik.Praca nad tworzeniem galerii obrazów w JavaFX. nie mogę poprawnie wyświetlić obrazu

@Override 
public void initialize(URL url, ResourceBundle rb) { 

    String path = "/home/ubuntu/eclipse with liferay/Desktop/imagetest/"; 

    File folder = new File(path); 
    File[] listOfFiles = folder.listFiles(); 

    for (final File file : listOfFiles) { 

      ImageView imageView; 
      imageView = createImageView(file); 
      imagecontainer.getChildren().addAll(imageView); 

    } 

} 
private ImageView createImageView(final File imageFile) throws FileNotFoundException, FileNotFoundException, FileNotFoundException, FileNotFoundException { 
    // DEFAULT_THUMBNAIL_WIDTH is a constant you need to define 
    // The last two arguments are: preserveRatio, and use smooth (slower) resizing 

    ImageView imageView = null; 
    try { 

     final Image image; 

     image = new Image(new FileInputStream(imageFile), DEFAULT_THUMBNAIL_WIDTH, 0, true, true); 
     imageView = new ImageView(image); 

    } catch (FileNotFoundException ex) { 
     Logger.getLogger(GalleryController.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return imageView; 

} 

} 

output

uprzejmie mi pomóc rozwiązać mój problem. Chcę wyświetlać obrazy pojedynczo jako widok miniatur.

+0

Co to jest "imageContainer"? –

+0

@James_D: kontener obrazu to okienko FXML. –

+0

@James_D: przykro mi, zapomnę wspomnieć o okienku: | –

Odpowiedz

22

Musisz utworzyć taflowy i dodać do niego ImageView. W razie potrzeby możesz mieć ScrollPane. Pełny przykład z podwójnym kliknięciem, aby utworzyć podgląd pełnoekranowy, pokazano poniżej. Można oczywiście zrobić niezbędne zmiany dotyczące tworzenia FXML :)

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 

import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.ScrollPane; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.input.MouseButton; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.TilePane; 
import javafx.scene.paint.Color; 
import javafx.stage.Screen; 
import javafx.stage.Stage; 

public class ImageGallery extends Application { 

    Stage stage; 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     stage = primaryStage; 
     ScrollPane root = new ScrollPane(); 
     TilePane tile = new TilePane(); 
     root.setStyle("-fx-background-color: DAE6F3;"); 
     tile.setPadding(new Insets(15, 15, 15, 15)); 
     tile.setHgap(15); 

     String path = "/home/ubuntu/eclipse with liferay/Desktop/imagetest/"; 

     File folder = new File(path); 
     File[] listOfFiles = folder.listFiles(); 

     for (final File file : listOfFiles) { 
       ImageView imageView; 
       imageView = createImageView(file); 
       tile.getChildren().addAll(imageView); 
     } 


     root.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); // Horizontal 
     root.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED); // Vertical scroll bar 
     root.setFitToWidth(true); 
     root.setContent(tile); 

     primaryStage.setWidth(Screen.getPrimary().getVisualBounds().getWidth()); 
     primaryStage.setHeight(Screen.getPrimary().getVisualBounds() 
       .getHeight()); 
     Scene scene = new Scene(root); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

    } 

    private ImageView createImageView(final File imageFile) { 
     // DEFAULT_THUMBNAIL_WIDTH is a constant you need to define 
     // The last two arguments are: preserveRatio, and use smooth (slower) 
     // resizing 

     ImageView imageView = null; 
     try { 
      final Image image = new Image(new FileInputStream(imageFile), 150, 0, true, 
        true); 
      imageView = new ImageView(image); 
      imageView.setFitWidth(150); 
      imageView.setOnMouseClicked(new EventHandler<MouseEvent>() { 

       @Override 
       public void handle(MouseEvent mouseEvent) { 

        if(mouseEvent.getButton().equals(MouseButton.PRIMARY)){ 

         if(mouseEvent.getClickCount() == 2){ 
          try { 
           BorderPane borderPane = new BorderPane(); 
           ImageView imageView = new ImageView(); 
           Image image = new Image(new FileInputStream(imageFile)); 
           imageView.setImage(image); 
           imageView.setStyle("-fx-background-color: BLACK"); 
           imageView.setFitHeight(stage.getHeight() - 10); 
           imageView.setPreserveRatio(true); 
           imageView.setSmooth(true); 
           imageView.setCache(true); 
           borderPane.setCenter(imageView); 
           borderPane.setStyle("-fx-background-color: BLACK"); 
           Stage newStage = new Stage(); 
           newStage.setWidth(stage.getWidth()); 
           newStage.setHeight(stage.getHeight()); 
           newStage.setTitle(imageFile.getName()); 
           Scene scene = new Scene(borderPane,Color.BLACK); 
           newStage.setScene(scene); 
           newStage.show(); 
          } catch (FileNotFoundException e) { 
           e.printStackTrace(); 
          } 

         } 
        } 
       } 
      }); 
     } catch (FileNotFoundException ex) { 
      ex.printStackTrace(); 
     } 
     return imageView; 
    } 

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

} 

wyjścia

enter image description here

Działa to doskonale podczas zmiany rozmiaru okna, dzięki czemu ScrollPane widoczny, jeśli jest to wymagane.

+0

wspaniały człowiek !! Bardzo dziękuję za Twoją pomoc. Dokładnie to, czego potrzebuję !! mile widziane !! –

+0

cześć .. tutaj w galerii .. tylko pliki png wyświetlają .. jpg nie działa ..? –

+0

Wszystkie obrazy użyte na powyższym zrzucie ekranu mają format 'jpg'. Jeśli jest coś, co nie działa, utwórz nowe pytanie za pomocą [MCVE] (http://stackoverflow.com/help/mcve) i połącz to pytanie/odpowiedź. – ItachiUchiha