2014-11-28 12 views
9

Sto creando una galleria di immagini usando javafx. Ho trovato molte cose su internet per quanto riguarda questo, ma non in grado di ottenere alcun aiuto adeguato per questo problema. Devo creare una galleria di immagini come Picasa Viewer. tutte le immagini sono nella visualizzazione miniature nella mia vista immagine e dopo di ciò quando seleziono l'immagine che si trova nel visualizzatore popup. Ho fatto un po 'di codice per questo, ma non ho ottenuto l'output corretto. Tutte le immagini della cartella vengono ridisegnate dalle stesse coordinate. Di seguito è riportato il mio codice e l'output.Lavorare alla creazione di una galleria di immagini in JavaFX. Non è possibile visualizzare correttamente l'immagine

@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

gentilmente aiutarmi a risolvere il mio problema. Voglio visualizzare le immagini una per una come anteprima.

+0

Che cos'è 'imageContainer'? –

+0

@James_D: contenitore immagine è il pannello FXML. –

+0

@James_D: sorry man dimentico di parlare di riquadro: | –

risposta

22

È necessario creare un TilePane e aggiungervi i ImageView. Puoi avere un ScrollPane se necessario. Di seguito è riportato un esempio completo con doppio clic per creare un'anteprima a schermo intero. Ovviamente si può fare le modifiche necessarie per la creazione di un 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); 
    } 

} 

uscita

enter image description here

Questo funziona grande quando si ridimensiona la finestra, rendendo lo ScrollPane visibile, se necessario.

+0

uomo superbo !! Grazie mille per il vostro aiuto. È esattamente quello di cui ho bisogno !! molto apprezzato !! –

+0

ciao .. qui in galleria .. vengono visualizzati solo i file png .. jpg non funziona ..? –

+0

Tutte le immagini utilizzate nello screenshot qui sopra hanno il formato 'jpg'. Se c'è qualcosa che non funziona, si prega di creare una nuova domanda con un [MCVE] (http://stackoverflow.com/help/mcve) e collegare questa domanda/risposta in esso. – ItachiUchiha

Problemi correlati