首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何存储TableRowSorter SortKeys以供将来使用?

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

Stack Overflow用户
提问于 2015-07-20 09:18:42
回答 1查看 141关注 0票数 2

我正在尝试为JTable存储TableRowSorterSortKey,这样我就可以在下次屏幕加载时调用它们并应用它们。

目前我正在做这件事:

代码语言:javascript
复制
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列表的大小。

有没有更好的方法来解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2015-07-20 10:46:00

您应该将PreferencesList<Sortkey>的行为封装在您自己的自定义对象中。通过使用Decorator,您可以轻松控制此功能的工作方式。首先,使用一个非常基本的实现,它只支持SortKey的运行时存储。

代码语言:javascript
复制
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;
  }
}

然后,添加一个支持保存和加载到首选项的装饰器。

代码语言:javascript
复制
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的构造函数中:

代码语言:javascript
复制
public class YourTable extends JTable {
  private final SortKeyManager manager;

  public YourTable(SortKeyManager) {
    this.manager = manager;
  }
}

此配置将让您完全控制一切的工作方式,并遵守Single Responsibility PrincipleOpen Closed Principle。它也不再将您的实现绑定到首选项的工作方式,因为它是使用装饰器版本的附加效果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31507650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档