如何存储TableRowSorter SortKeys以备将来使用?

时间:2015-07-20 01:18:42

标签: java swing jtable tablerowsorter

我正在尝试为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列表的大小(并迭代)。

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您应该将PreferencesList<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 PrincipleOpen Closed Principle。它也不再将您的实现绑定到Preferences的工作方式,因为它是使用装饰器版本的附加效果。