【问题标题】:How to shuffle in Jtable如何在 Jtable 中随机播放
【发布时间】:2016-06-21 17:04:25
【问题描述】:

我有一个 JTable,其中包含 TableModel(我的所有数据)。 JTable 有多个行和列。我需要随机洗牌。我知道我可以用

Collections.shuffle(some list from TableModel);

但我不知道如何从现有的具有 TableModel 的 JTable 中获取列表。

根据某人的建议,我尝试了这个

RowSorter<? extends TableModel> sorter = mDocListTable.getRowSorter();
    ArrayList<RowSorter.SortKey> list = new ArrayList<RowSorter.SortKey>();

    list.add(new RowSorter.SortKey(0, SortOrder.DESCENDING));

    Collections.shuffle(list);
    sorter.setSortKeys(list);

但没用。

【问题讨论】:

  • 我相信一种方法是创建一个自定义RowSorterRowSorter 的设计目的是使用列标题作为排序键,因此您不一定需要一些额外的开销,但 convertRowIndexToModel(int index)convertRowIndexToView(int index) 方法应该可以满足您的需求;只需创建整数列表[0, 1, ..., getRowCount()] 到相同整数但被打乱的映射。 convert to view 方法会返回映射的值。
  • 虽然如果你真的想修改模型中的表(不仅仅是视图),你也可以在DefaultTableModel中使用moveRow(int start, int end, int to)
  • 您能否详细说明“只需创建整数列表 [0, 1, ..., getRowCount()] 到相同整数但经过改组的映射”。一个小例子会有所帮助

标签: java jtable tablemodel


【解决方案1】:

这样的方法可行吗?

DefaultTableModel model = (DefaultTableModel) table.getModel();
model.getDataVector().sort((Object o1, Object o2) -> Math.random() > 0.5 ? -1 : 1);
model.fireTableDataChanged();

编辑:

对于 Java-7 并且由于 .sort() 直到 Java-8 才实现,第二个(也许更易读)选项可能是:

DefaultTableModel model = (DefaultTableModel) table.getModel();
Collections.shuffle(model.getDataVector());
model.fireTableDataChanged();

这无法恢复。

【讨论】:

  • 这比我的回答要好。我已删除我的答案,并推荐此答案。
  • 请注意,这需要支持 Lambda 表达式的 Java 版本(IE:Java 8)。
  • 什么是对象 o1,对象 o2
  • @user1631306 这些是 lambda expression 实现的参数 Comparator 被传递到 sort 方法。基本上,任何功能接口(包含 1 个用 @FunctionalInterface 注释的方法的接口)都可以使用 lambda 表达式实现,其形式为 (Args) -&gt; action。它只是让您不必创建新的匿名内部对象(不那么冗长)。
  • 您仍然需要传入对象:.sort((null) -&gt; ... 将不起作用。这里发生的是 sort(T t1, T t2) 方法由 lambda 表达式定义(在这种情况下,T 的类型为 Object)。我建议查看 @FunctionalInterface 注释 Javadoc(Comparator 使用它,因此允许在 sort() 中定义 lambda 表达式)。
猜你喜欢
  • 1970-01-01
  • 2023-01-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
相关资源
最近更新 更多