我正在尝试为JTable存储TableRowSorter的SortKey,这样我就可以在下次屏幕加载时调用它们并应用它们。
目前我正在做这件事:
static void saveSortKeys(String name, JTable table) {
List<? extends SortKey> sortKeys = table.getRowSorter().getSortKeys();
if(sortKeys.size() > 0) {
Preferences prefs = ...;
prefs.putInt("sortOrder_count", sortKeys.size());
int i = 0;
for(SortKey sortKey : sortKeys) {
prefs.put("sortOrder_name_" + i, sortKey.getSortOrder().toString());
prefs.putInt("sort_column_" + i, sortKey.getColumn());
i++;
}
}
}
static List<SortKey> getSortKeys(String name) {
Preferences prefs = ...;
int count = prefs.getInt("sortOrder_count", 0);
List<SortKey> keys = new LinkedList<>();
for(int i = 0; i < count; i++) {
int column = prefs.getInt("sort_column_" + i, -1);
SortOrder so = SortOrder.valueOf(prefs.get("sortOrder_name_" + i, ""));
SortKey key = new SortKey(column, so);
keys.add(key);
}
return keys;
}我认为最好是使用Preferences应用程序接口,所以我编写了一些方法来实现这一点。然而,我很担心,因为它依赖枚举SortOrder::toString()方法来存储和SortOrder.valueOf方法检索枚举,这对我来说似乎不是一个好主意。此外,您还必须手动存储(并遍历) SortKey列表的大小。
有没有更好的方法来解决这个问题?
发布于 2015-07-20 10:46:00
您应该将Preferences和List<Sortkey>的行为封装在您自己的自定义对象中。通过使用Decorator,您可以轻松控制此功能的工作方式。首先,使用一个非常基本的实现,它只支持SortKey的运行时存储。
interface SortKeyManager {
void saveSortKeys(String name, List<SortKey> sortKeys);
List<SortKey> getSortKeys();
}
public class SimpleSortKeyManager implements SortKeyManager {
private List<SortKey> sortKeys;
void saveSortKeys(String name, List<SortKey> sortkeys) {
this.sortKeys = sortKeys;
}
public List<SortKey> getSortKeys() {
return sortKeys;
}
}然后,添加一个支持保存和加载到首选项的装饰器。
public class PreferencesSortKeyDecorator implements SortKeyManager {
private final SortKeyManager manager;
private final Preferences preferences;
public PreferencesSortKeyDecorator(SortKeyManager manager, Preferences preferences) {
this.manager = manager;
}
public void saveSortKeys(String name, List<SortKey> sortKeys) {
manager.saveSortKeys(name, sortKeys);
saveToPreferences(name, sortKeys);
}
private void saveToPreferences(String name, List<SortKey> sortKeys) {
// your code
}
public List<SortKey> getSortKeys() {
List<SortKey> keys = manager.getSortKeys();
if(keys == null) {
// Your code to load from Preferences
}
}
}最后,将SortKeyManager注入到JTable的构造函数中:
public class YourTable extends JTable {
private final SortKeyManager manager;
public YourTable(SortKeyManager) {
this.manager = manager;
}
}此配置将让您完全控制一切的工作方式,并遵守Single Responsibility Principle和Open Closed Principle。它也不再将您的实现绑定到首选项的工作方式,因为它是使用装饰器版本的附加效果。
https://stackoverflow.com/questions/31507650
复制相似问题