我正在尝试为SortKey
存储TableRowSorter
的{{1}}以便我可以在下次加载并应用它们时调用它们。
目前我正在这样做:
JTable
我认为最好使用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;
}
api,所以我写了一些方法来做到这一点。但是,我很担心,因为它依赖于枚举Preferences
方法来存储和SortOrder::toString()
方法检索枚举,这对我来说似乎是一个坏主意。此外,您必须手动存储SortOrder.valueOf
列表的大小(并迭代)。
有更好的方法吗?
答案 0 :(得分:0)
您应该将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。它也不再将您的实现绑定到Preferences的工作方式,因为它是使用装饰器版本的附加效果。