0
這是關於JFX表格。 我讀過上面的鏈接,這對我的工作很有幫助。 我的要求是 - 假設我點擊一個表列標題,數據按升序或降序排序。即使在重新啓動我的應用程序之後,我仍然希望將已排序的數據保留在桌面上。有人可以幫我解決這個問題嗎?我如何記住列標題名稱和升序/降序,並在初始化時對它進行排序? Sorting order of jfx table clumn如何堅持jfx表格列的排序順序
這是關於JFX表格。 我讀過上面的鏈接,這對我的工作很有幫助。 我的要求是 - 假設我點擊一個表列標題,數據按升序或降序排序。即使在重新啓動我的應用程序之後,我仍然希望將已排序的數據保留在桌面上。有人可以幫我解決這個問題嗎?我如何記住列標題名稱和升序/降序,並在初始化時對它進行排序? Sorting order of jfx table clumn如何堅持jfx表格列的排序順序
您可以簡單地存儲將用戶目錄中的文件中的排序恢復到所需的位置。以下代碼通過將int
存儲爲要排序的列數,然後爲每列存儲int
和TableColumn.SortType
來完成此操作。 int
表示初始列索引,並且SortType
指定排序是升序還是降序。
例
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
public class SaveAndRestore extends Application {
private static final Path CONFIG_FILE;
static {
CONFIG_FILE = Paths.get(System.getProperty("user.home"), "myapp", "config.ser");
Path dir = CONFIG_FILE.getParent();
if (!Files.exists(dir)) {
try {
Files.createDirectory(dir);
} catch (IOException ex) {
throw new IllegalStateException("Could not create settings directory.", ex);
}
}
}
private static final InputStream getConfigReadStream() throws IOException {
return Files.exists(CONFIG_FILE) ? Files.newInputStream(CONFIG_FILE) : null;
}
private static final OutputStream getConfigWriteStream() throws IOException {
return Files.newOutputStream(CONFIG_FILE);
}
@Override
public void stop() throws Exception {
try (ObjectOutputStream oos = new ObjectOutputStream(getConfigWriteStream())) {
oos.writeInt(tableView.getSortOrder().size());
for (TableColumn tc : tableView.getSortOrder()) {
oos.writeInt((Integer) tc.getUserData());
oos.writeObject(tc.getSortType());
}
}
}
public static class Item {
private final IntegerProperty number = new SimpleIntegerProperty();
private final StringProperty string = new SimpleStringProperty();
public Item(int number, String string) {
this.number.set(number);
this.string.set(string);
}
public final int getNumber() {
return this.number.get();
}
public final void setNumber(int value) {
this.number.set(value);
}
public final IntegerProperty numberProperty() {
return this.number;
}
public final String getString() {
return this.string.get();
}
public final void setString(String value) {
this.string.set(value);
}
public final StringProperty stringProperty() {
return this.string;
}
}
private static <T> TableColumn<Item, T> createColumn(String property) {
TableColumn<Item, T> column = new TableColumn<>(property);
column.setCellValueFactory(new PropertyValueFactory(property));
return column;
}
private TableView<Item> tableView;
@Override
public void start(Stage primaryStage) throws IOException, ClassNotFoundException {
tableView = new TableView<>(FXCollections.observableArrayList(
new Item(10, "Hello World"),
new Item(5, "Zyzz"),
new Item(20, "Aaron")
));
tableView.getColumns().addAll(createColumn("number"));
tableView.getColumns().addAll(createColumn("string"));
for (int i = 0, size = tableView.getColumns().size(); i < size; i++) {
tableView.getColumns().get(i).setUserData(i);
}
// restore state from config
InputStream is = getConfigReadStream();
if (is != null) {
try (ObjectInputStream ois = new ObjectInputStream(is)) {
for (int num = ois.readInt(); num > 0; num--) {
TableColumn<Item, ?> column = tableView.getColumns().get(ois.readInt());
column.setSortType((TableColumn.SortType) ois.readObject());
tableView.getSortOrder().add(column);
}
}
}
Scene scene = new Scene(tableView);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}