列表更改后的JavaFX更新流窗格 因此,在我第一次与JavaFX交涉之后,我被分配了一个项目,考虑到我的第二次使用JavaFX。我必须创建一个具有基本功能的相册:添加图像、删除图像、按标题/描述/位置排序、编辑标题、拍摄日期、描述和位置。好消息:除了一件以外,我已经完成了所有这些事情
事实证明,从imageData阵列中删除照片,或者更确切地说,将其从屏幕上删除是非常复杂的。我很确定这是因为我组织的方式。我试着为专辑制作我自己的changedProperty,并从源头上观察它,但显然我把它搞砸了,或者它没有像我想象的那样工作列表更改后的JavaFX更新流窗格 因此,在我第一次与JavaFX交涉之后,我被分配了一个项目,考虑到我的第二次使用JavaFX。我必须创建一个具有基本功能的相册:添加图像、删除图像、按标题/描述/位置排序、编辑标题、拍摄日期、描述和位置。好消息:除了一件以外,我已经完成了所有这些事情,java,user-interface,javafx,observablelist,property-binding,Java,User Interface,Javafx,Observablelist,Property Binding,事实证明,从imageData阵列中删除照片,或者更确切地说,将其从屏幕上删除是非常复杂的。我很确定这是因为我组织的方式。我试着为专辑制作我自己的changedProperty,并从源头上观察它,但显然我把它搞砸了,或者它没有像我想象的那样工作 private BooleanProperty changed = new SimpleBooleanProperty(); public final boolean getChanged(){return changed.get();} public
private BooleanProperty changed = new SimpleBooleanProperty();
public final boolean getChanged(){return changed.get();}
public final void setChanged(boolean value){changed.set(value);}
public BooleanProperty changedProperty(){return changed;}
所以这是个失败。我还尝试了ObservableList,但因为它是在源代码中创建的,所以我无法从我的Album类中obsList.remove。再说一次,我可能只是错误地实现了它
因此,重申一下-我可以从ArrayList imageData中删除图像,但它们保留在gallery FlowPane中
Source.java
import javafx.application.Application;
import javafx.collections.ListChangeListener;
import javafx.geometry.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import java.io.File;
public class Source extends Application {
protected Stage mainWin;
protected FlowPane gallery;
private static boolean delete;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
Album album = new Album();
Scene mainScene;
for (int i = 1; i < 10; i++) {
String s = "D:\\prabhu\\w\\1";
album.getImageData().add(
new ImageData((s + " (" + i + ").jpg"), "cardtitle" + i,
"carddesc", "cardloc"));
}
album.getImageData().addListener(new ListChangeListener() {
@Override
public void onChanged(ListChangeListener.Change change) {
refreshGallery();
}
});
// FILE MENU
Menu fileMenu = new Menu("_File");
MenuItem addImg = new MenuItem("_Add Photo...");
addImg.setOnAction(e -> {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Open Resource File");
File file = fileChooser.showOpenDialog(mainWin);
String absPath = "file:" + file.getAbsolutePath();
absPath = absPath.replace('\\', '/');
album.addImage(absPath, "", "", "");
refreshGallery();
});
MenuItem exit = new MenuItem("_Exit");
exit.setOnAction(e -> mainWin.close());
fileMenu.getItems().addAll(addImg, new SeparatorMenuItem(), exit);
// SORT MENU
Menu sortMenu = new Menu("_Sort");
MenuItem sortTitle = new MenuItem("_Title");
sortTitle.setOnAction(e -> {
album.sortAlbumTitle(album);
refreshGallery();
});
MenuItem sortDate = new MenuItem("_Date Taken");
sortDate.setOnAction(e -> {
album.sortAlbumDate(album);
refreshGallery();
});
MenuItem sortLoc = new MenuItem("_Location");
sortLoc.setOnAction(e -> {
album.sortAlbumLoc(album);
refreshGallery();
});
sortMenu.getItems().addAll(sortTitle, sortDate, sortLoc);
// HELP MENU
Menu helpMenu = new Menu("_Help");
MenuItem helpAbout = new MenuItem("_About");
helpAbout.setOnAction(e -> Help.displayAbout());
MenuItem helpHelp = new MenuItem("_Help");
helpHelp.setOnAction(e -> Help.displayHelp());
helpMenu.getItems().addAll(helpAbout, helpHelp);
// MENU BAR
MenuBar menuBar = new MenuBar();
menuBar.getMenus().addAll(fileMenu, sortMenu, helpMenu);
menuBar.setStyle("-fx-background-color: #383838;");
mainWin = primaryStage;
mainWin.setTitle("Photo Album");
ScrollPane center = new ScrollPane();
// center.setMinWidth(800);
center.setFitToWidth(true);
gallery = new FlowPane();
gallery.setPadding(new Insets(5, 5, 5, 5));
gallery.setAlignment(Pos.CENTER);
gallery.setColumnHalignment(HPos.CENTER);
gallery.setRowValignment(VPos.CENTER);
gallery.setHgap(10);
gallery.setVgap(10);
gallery.setPrefWrapLength(785);
for (int i = 0; i < album.getImageData().size(); i++) {
gallery.getChildren()
.add(album.getImageData().get(i).getImageBtn());
}
center.setContent(gallery);
BorderPane borderPane = new BorderPane();
borderPane.setCenter(center);
borderPane.setTop(menuBar);
mainScene = new Scene(borderPane, 800, 600);
mainScene.getStylesheets().add("styles.css");
mainWin.setScene(mainScene);
mainWin.setResizable(false);
mainWin.show();
}
private void refreshGallery() {
gallery.getChildren().clear();
for (int i = 0; i < Album.getImageData().size(); i++) {
gallery.getChildren()
.add(Album.getImageData().get(i).getImageBtn());
}
}
}
Album.java
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.image.ImageView;
import java.util.*;
public class Album extends Observable{
private static ObservableList<ImageData> imageData = FXCollections.observableArrayList();
private BooleanProperty changed = new SimpleBooleanProperty();
public final boolean getChanged(){return changed.get();}
public final void setChanged(boolean value){changed.set(value);}
public BooleanProperty changedProperty(){return changed;}
public Album(){}
public static ObservableList<ImageData> getImageData(){ return imageData; }
public void addImage(String image, String title, String desc, String loc) {
imageData.add(0, new ImageData(image, title, desc, loc));
}
public void removeImage(ImageView img){
List<ImageData> toRemove = new ArrayList<>();
for(ImageData a: imageData){
if(a.getImageView() == img){
toRemove.add(a);
//observableList.remove(a);
break;
}
}
imageData.removeAll(toRemove);
if (this.getChanged() == true)
this.setChanged(false);
else
this.setChanged(true);
}
public void sortAlbumTitle(Album album) {
System.out.println("Sort by Title");
Collections.sort(album.getImageData(), new Comparator<ImageData>() {
public int compare(ImageData img1, ImageData img2) {
return img1.getTitle().compareToIgnoreCase(img2.getTitle());
}
});
}
public void sortAlbumDate(Album album) {
System.out.println("Sort by Date");
Collections.sort(album.getImageData(), new Comparator<ImageData>() {
public int compare(ImageData img1, ImageData img2) {
return img1.getDate().compareTo(img2.getDate());
}
});
}
public void sortAlbumLoc(Album album) {
System.out.println("Sort by description");
Collections.sort(album.getImageData(), new Comparator<ImageData>() {
public int compare(ImageData img1, ImageData img2) {
return img1.getLocation().compareToIgnoreCase(img2.getLocation());
}
});
}
}
ImageData.java
DisplayEditDetail.java
当您删除图像。从列表中删除时,您必须删除表单ObservableList,然后它才会调用ChangeListner。这是我的工作代码 更改此类它将适用于您的任何评论 Album.java
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.image.ImageView;
import java.util.*;
public class Album extends Observable{
private static ObservableList<ImageData> imageData = FXCollections.observableArrayList();
private BooleanProperty changed = new SimpleBooleanProperty();
public final boolean getChanged(){return changed.get();}
public final void setChanged(boolean value){changed.set(value);}
public BooleanProperty changedProperty(){return changed;}
public Album(){}
public static ObservableList<ImageData> getImageData(){ return imageData; }
public void addImage(String image, String title, String desc, String loc) {
imageData.add(0, new ImageData(image, title, desc, loc));
}
public void removeImage(ImageView img){
List<ImageData> toRemove = new ArrayList<>();
for(ImageData a: imageData){
if(a.getImageView() == img){
toRemove.add(a);
//observableList.remove(a);
break;
}
}
imageData.removeAll(toRemove);
if (this.getChanged() == true)
this.setChanged(false);
else
this.setChanged(true);
}
public void sortAlbumTitle(Album album) {
System.out.println("Sort by Title");
Collections.sort(album.getImageData(), new Comparator<ImageData>() {
public int compare(ImageData img1, ImageData img2) {
return img1.getTitle().compareToIgnoreCase(img2.getTitle());
}
});
}
public void sortAlbumDate(Album album) {
System.out.println("Sort by Date");
Collections.sort(album.getImageData(), new Comparator<ImageData>() {
public int compare(ImageData img1, ImageData img2) {
return img1.getDate().compareTo(img2.getDate());
}
});
}
public void sortAlbumLoc(Album album) {
System.out.println("Sort by description");
Collections.sort(album.getImageData(), new Comparator<ImageData>() {
public int compare(ImageData img1, ImageData img2) {
return img1.getLocation().compareToIgnoreCase(img2.getLocation());
}
});
}
}
Source.java
import javafx.application.Application;
import javafx.collections.ListChangeListener;
import javafx.geometry.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import java.io.File;
public class Source extends Application {
protected Stage mainWin;
protected FlowPane gallery;
private static boolean delete;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
Album album = new Album();
Scene mainScene;
for (int i = 1; i < 10; i++) {
String s = "D:\\prabhu\\w\\1";
album.getImageData().add(
new ImageData((s + " (" + i + ").jpg"), "cardtitle" + i,
"carddesc", "cardloc"));
}
album.getImageData().addListener(new ListChangeListener() {
@Override
public void onChanged(ListChangeListener.Change change) {
refreshGallery();
}
});
// FILE MENU
Menu fileMenu = new Menu("_File");
MenuItem addImg = new MenuItem("_Add Photo...");
addImg.setOnAction(e -> {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Open Resource File");
File file = fileChooser.showOpenDialog(mainWin);
String absPath = "file:" + file.getAbsolutePath();
absPath = absPath.replace('\\', '/');
album.addImage(absPath, "", "", "");
refreshGallery();
});
MenuItem exit = new MenuItem("_Exit");
exit.setOnAction(e -> mainWin.close());
fileMenu.getItems().addAll(addImg, new SeparatorMenuItem(), exit);
// SORT MENU
Menu sortMenu = new Menu("_Sort");
MenuItem sortTitle = new MenuItem("_Title");
sortTitle.setOnAction(e -> {
album.sortAlbumTitle(album);
refreshGallery();
});
MenuItem sortDate = new MenuItem("_Date Taken");
sortDate.setOnAction(e -> {
album.sortAlbumDate(album);
refreshGallery();
});
MenuItem sortLoc = new MenuItem("_Location");
sortLoc.setOnAction(e -> {
album.sortAlbumLoc(album);
refreshGallery();
});
sortMenu.getItems().addAll(sortTitle, sortDate, sortLoc);
// HELP MENU
Menu helpMenu = new Menu("_Help");
MenuItem helpAbout = new MenuItem("_About");
helpAbout.setOnAction(e -> Help.displayAbout());
MenuItem helpHelp = new MenuItem("_Help");
helpHelp.setOnAction(e -> Help.displayHelp());
helpMenu.getItems().addAll(helpAbout, helpHelp);
// MENU BAR
MenuBar menuBar = new MenuBar();
menuBar.getMenus().addAll(fileMenu, sortMenu, helpMenu);
menuBar.setStyle("-fx-background-color: #383838;");
mainWin = primaryStage;
mainWin.setTitle("Photo Album");
ScrollPane center = new ScrollPane();
// center.setMinWidth(800);
center.setFitToWidth(true);
gallery = new FlowPane();
gallery.setPadding(new Insets(5, 5, 5, 5));
gallery.setAlignment(Pos.CENTER);
gallery.setColumnHalignment(HPos.CENTER);
gallery.setRowValignment(VPos.CENTER);
gallery.setHgap(10);
gallery.setVgap(10);
gallery.setPrefWrapLength(785);
for (int i = 0; i < album.getImageData().size(); i++) {
gallery.getChildren()
.add(album.getImageData().get(i).getImageBtn());
}
center.setContent(gallery);
BorderPane borderPane = new BorderPane();
borderPane.setCenter(center);
borderPane.setTop(menuBar);
mainScene = new Scene(borderPane, 800, 600);
mainScene.getStylesheets().add("styles.css");
mainWin.setScene(mainScene);
mainWin.setResizable(false);
mainWin.show();
}
private void refreshGallery() {
gallery.getChildren().clear();
for (int i = 0; i < Album.getImageData().size(); i++) {
gallery.getChildren()
.add(Album.getImageData().get(i).getImageBtn());
}
}
}
我只更改了3行代码。我希望这能帮助你。任何人都可以发表评论您应该将相册中的imageData与getter方法一起定义为ObservableList一个将内容作为列表返回,另一个将ObservableList本身返回。然后,您可以在该属性的源代码中添加ChangeListener来更新视图。@hotzst我不确定我是否完全理解如何做。有没有一个例子可以告诉我?对于ChangeListener,我能找到的最接近的东西是:。对于ObservableList的定义,我建议您搜索ObservableList示例或教程。当我为ObservableList创建getter时,它不会返回内容吗?@hotzst我添加了ObservableList ObservableList=FXCollections.observableListimageData;和public observeList getObsList{return observeList;}到Album.java文件。我添加了album.getObsList.addListenernew ListChangeListener{Override public void onChangedListChangeListener.Change Change Change{refreshGallery;}};到我的Source.java文件,但这不起作用。是的,我在ovverride之前加入了[at]符号。。该评论不允许我在标记你的符号之外再添加一个[at]符号。
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.image.ImageView;
import java.util.*;
public class Album extends Observable{
private static ObservableList<ImageData> imageData = FXCollections.observableArrayList();
private BooleanProperty changed = new SimpleBooleanProperty();
public final boolean getChanged(){return changed.get();}
public final void setChanged(boolean value){changed.set(value);}
public BooleanProperty changedProperty(){return changed;}
public Album(){}
public static ObservableList<ImageData> getImageData(){ return imageData; }
public void addImage(String image, String title, String desc, String loc) {
imageData.add(0, new ImageData(image, title, desc, loc));
}
public void removeImage(ImageView img){
List<ImageData> toRemove = new ArrayList<>();
for(ImageData a: imageData){
if(a.getImageView() == img){
toRemove.add(a);
//observableList.remove(a);
break;
}
}
imageData.removeAll(toRemove);
if (this.getChanged() == true)
this.setChanged(false);
else
this.setChanged(true);
}
public void sortAlbumTitle(Album album) {
System.out.println("Sort by Title");
Collections.sort(album.getImageData(), new Comparator<ImageData>() {
public int compare(ImageData img1, ImageData img2) {
return img1.getTitle().compareToIgnoreCase(img2.getTitle());
}
});
}
public void sortAlbumDate(Album album) {
System.out.println("Sort by Date");
Collections.sort(album.getImageData(), new Comparator<ImageData>() {
public int compare(ImageData img1, ImageData img2) {
return img1.getDate().compareTo(img2.getDate());
}
});
}
public void sortAlbumLoc(Album album) {
System.out.println("Sort by description");
Collections.sort(album.getImageData(), new Comparator<ImageData>() {
public int compare(ImageData img1, ImageData img2) {
return img1.getLocation().compareToIgnoreCase(img2.getLocation());
}
});
}
}
import javafx.application.Application;
import javafx.collections.ListChangeListener;
import javafx.geometry.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import java.io.File;
public class Source extends Application {
protected Stage mainWin;
protected FlowPane gallery;
private static boolean delete;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
Album album = new Album();
Scene mainScene;
for (int i = 1; i < 10; i++) {
String s = "D:\\prabhu\\w\\1";
album.getImageData().add(
new ImageData((s + " (" + i + ").jpg"), "cardtitle" + i,
"carddesc", "cardloc"));
}
album.getImageData().addListener(new ListChangeListener() {
@Override
public void onChanged(ListChangeListener.Change change) {
refreshGallery();
}
});
// FILE MENU
Menu fileMenu = new Menu("_File");
MenuItem addImg = new MenuItem("_Add Photo...");
addImg.setOnAction(e -> {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Open Resource File");
File file = fileChooser.showOpenDialog(mainWin);
String absPath = "file:" + file.getAbsolutePath();
absPath = absPath.replace('\\', '/');
album.addImage(absPath, "", "", "");
refreshGallery();
});
MenuItem exit = new MenuItem("_Exit");
exit.setOnAction(e -> mainWin.close());
fileMenu.getItems().addAll(addImg, new SeparatorMenuItem(), exit);
// SORT MENU
Menu sortMenu = new Menu("_Sort");
MenuItem sortTitle = new MenuItem("_Title");
sortTitle.setOnAction(e -> {
album.sortAlbumTitle(album);
refreshGallery();
});
MenuItem sortDate = new MenuItem("_Date Taken");
sortDate.setOnAction(e -> {
album.sortAlbumDate(album);
refreshGallery();
});
MenuItem sortLoc = new MenuItem("_Location");
sortLoc.setOnAction(e -> {
album.sortAlbumLoc(album);
refreshGallery();
});
sortMenu.getItems().addAll(sortTitle, sortDate, sortLoc);
// HELP MENU
Menu helpMenu = new Menu("_Help");
MenuItem helpAbout = new MenuItem("_About");
helpAbout.setOnAction(e -> Help.displayAbout());
MenuItem helpHelp = new MenuItem("_Help");
helpHelp.setOnAction(e -> Help.displayHelp());
helpMenu.getItems().addAll(helpAbout, helpHelp);
// MENU BAR
MenuBar menuBar = new MenuBar();
menuBar.getMenus().addAll(fileMenu, sortMenu, helpMenu);
menuBar.setStyle("-fx-background-color: #383838;");
mainWin = primaryStage;
mainWin.setTitle("Photo Album");
ScrollPane center = new ScrollPane();
// center.setMinWidth(800);
center.setFitToWidth(true);
gallery = new FlowPane();
gallery.setPadding(new Insets(5, 5, 5, 5));
gallery.setAlignment(Pos.CENTER);
gallery.setColumnHalignment(HPos.CENTER);
gallery.setRowValignment(VPos.CENTER);
gallery.setHgap(10);
gallery.setVgap(10);
gallery.setPrefWrapLength(785);
for (int i = 0; i < album.getImageData().size(); i++) {
gallery.getChildren()
.add(album.getImageData().get(i).getImageBtn());
}
center.setContent(gallery);
BorderPane borderPane = new BorderPane();
borderPane.setCenter(center);
borderPane.setTop(menuBar);
mainScene = new Scene(borderPane, 800, 600);
mainScene.getStylesheets().add("styles.css");
mainWin.setScene(mainScene);
mainWin.setResizable(false);
mainWin.show();
}
private void refreshGallery() {
gallery.getChildren().clear();
for (int i = 0; i < Album.getImageData().size(); i++) {
gallery.getChildren()
.add(Album.getImageData().get(i).getImageBtn());
}
}
}