正在使用JavaFX创建图像库。无法正确显示图像
我正在使用javafx创建图像库。我在网上找到了很多关于这个问题的东西,但是没有得到任何合适的帮助。我必须创建一个像picasa viewer这样的图像库。在我的图像视图中,所有图像都在缩略图视图中,然后在弹出式查看器中选择图像。我为此编写了一些代码,但没有得到正确的输出。文件夹中的所有图像都从相同的坐标重新绘制。 下面是我的代码和输出正在使用JavaFX创建图像库。无法正确显示图像,java,javafx,imageview,gallery,Java,Javafx,Imageview,Gallery,我正在使用javafx创建图像库。我在网上找到了很多关于这个问题的东西,但是没有得到任何合适的帮助。我必须创建一个像picasa viewer这样的图像库。在我的图像视图中,所有图像都在缩略图视图中,然后在弹出式查看器中选择图像。我为此编写了一些代码,但没有得到正确的输出。文件夹中的所有图像都从相同的坐标重新绘制。 下面是我的代码和输出 @Override public void initialize(URL url, ResourceBundle rb) { String path
@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;
}
}
请帮我解决我的问题。我想一个一个地显示图像作为缩略图视图 您需要创建一个TilePane并将ImageView的添加到其中。如果需要,您可以使用滚动窗格。双击创建全屏预览的完整示例如下所示。当然,您可以对创建FXML进行必要的更改:)
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入javafx.application.application;
导入javafx.event.EventHandler;
导入javafx.geometry.Insets;
导入javafx.scene.scene;
导入javafx.scene.control.ScrollPane;
导入javafx.scene.image.image;
导入javafx.scene.image.ImageView;
导入javafx.scene.input.MouseButton;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.TilePane;
导入javafx.scene.paint.Color;
导入javafx.stage.Screen;
导入javafx.stage.stage;
公共类ImageGallery扩展了应用程序{
阶段性;
@凌驾
public void start(Stage primaryStage)引发异常{
阶段=初级阶段;
ScrollPane root=新的ScrollPane();
TilePane瓷砖=新的TilePane();
root.setStyle(“-fx背景色:DAE6F3;”);
瓷砖.镶嵌衬垫(新插图(15,15,15,15));
地砖.地砖(15);
String path=“/home/ubuntu/eclipse with liferay/Desktop/imagetest/”;
文件夹=新文件(路径);
File[]listOfFiles=folder.listFiles();
对于(最终文件:listOfFiles){
图像视图图像视图;
imageView=createImageView(文件);
tile.getChildren().addAll(imageView);
}
root.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);//水平
root.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_所需);//垂直滚动条
root.setFitToWidth(true);
根内容物(瓷砖);
setWidth(Screen.getPrimary().getVisualBounds().getWidth());
primaryStage.setHeight(Screen.getPrimary().getVisualBounds())
.getHeight());
场景=新场景(根);
初级阶段。场景(场景);
primaryStage.show();
}
私有ImageView createImageView(最终文件imageFile){
//默认\u缩略图\u宽度是需要定义的常量
//最后两个参数是:preserveRatio和use smooth(较慢)
//调整大小
ImageView ImageView=null;
试一试{
最终图像=新图像(新文件输入流(图像文件),150,0,真,
正确的);
imageView=新的imageView(图像);
imageView.setFitWidth(150);
setOnMouseClicked(新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent MouseEvent){
if(mouseEvent.getButton().equals(MouseButton.PRIMARY)){
if(mouseEvent.getClickCount()==2){
试一试{
BorderPane BorderPane=新的BorderPane();
ImageView ImageView=新的ImageView();
图像图像=新图像(新文件输入流(图像文件));
设置图像(图像);
imageView.setStyle(“-fx背景色:黑色”);
imageView.setFitHeight(stage.getHeight()-10);
imageView.setPreserveRatio(真);
imageView.setSmooth(真);
setCache(true);
边框窗格。设置中心(图像视图);
borderPane.setStyle(“-fx背景色:黑色”);
Stage newStage=newStage();
setWidth(stage.getWidth());
newStage.setHeight(stage.getHeight());
setTitle(imageFile.getName());
场景=新场景(边框窗格,颜色为黑色);
newStage.setScene(场景);
newStage.show();
}catch(filenotfounde异常){
e、 printStackTrace();
}
}
}
}
});
}捕获(FileNotFoundException ex){
例如printStackTrace();
}
返回图像视图;
}
公共静态void main(字符串[]args){
发射(args);
}
}
输出
如果需要,调整窗口大小,使滚动窗格可见时,这非常有效。什么是
imageContainer
?@James\u D:imageContainer是FXML窗格。@James\u D:对不起,我忘了提到窗格:|窗格
不做任何布局。(见附件)。所以,如果您想要对图像进行布局,则需要使用执行布局的布局窗格。你还没有具体说明你想怎么做,所以很难回答这个问题。也许可以阅读并选择一个布局窗格。@James_D:我也尝试过使用平铺窗格,但无法获得所有图像。。平铺窗格仅用最后一个图像替换图像。用最后一个覆盖所有图像。。最后只显示了最后一张图片。好极了!!非常感谢
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);
}
}