【问题标题】:Deactivate selection by letter in JList在 JList 中禁用按字母选择
【发布时间】:2015-12-13 13:46:33
【问题描述】:

我有一个 JList 列表和以下代码行:

list.getInputMap().put(KeyStroke.getKeyStroke('d'), "action");

因此,当我的列表处于焦点位置并且我按下键盘上的 d 键时,应该执行一个操作。该操作考虑了当前选择了我的 JList 的哪个项目。问题是,每当我的列表中有第一个字母为“d”的项目时,我的选择将首先跳转到该条目,然后执行操作(应用于错误的项目)。

所以我的问题是:如何禁用 JLists 中由输入字母引起的选择跳转?

【问题讨论】:

  • 一个愚蠢的想法 - 你有没有试过在你的项目名称前面放一个不可见的空格?
  • @pvg 我刚刚尝试过,它可以工作;)。但这不是我想要解决问题的方式。现在我在为空格键分配动作时遇到了问题;)。或者你所说的无形空间是什么意思?我只是拿了一个普通的。
  • 不,尝试一个不可见的 unicode 空间,而不是一个实际的空间。我认为这实际上是一个相当不错的解决方案,不会过多地挖掘 JList 的默认和相当具体的实现细节。
  • @principal-ideal-domain 你必须覆盖,通过返回禁用JList#getNextMatch - return -1;

标签: java swing key-bindings


【解决方案1】:

您可以从 JList 中删除 KeyListeners
我试过了,但无法弄清楚这在标准功能方面有什么问题。

KeyListener[] lsnrs = list.getKeyListeners();
for (int i = 0; i < lsnrs.length; i++) {
    list.removeKeyListener(lsnrs[i]);
}

【讨论】:

  • getClass 太多了,即使修正了那个错字,它也不起作用。
  • @principal-ideal-domain - 为我工作:)
  • 我正在使用自写的表格模型。这有什么改变吗?
  • @principal-ideal-domain - TableModel 无关紧要。但是 Listener 方法确实只适用于 Java8。尝试 NoSelectionModel 方法。
  • @principal-ideal-domain 这是一个很好的问题,但答案却很糟糕。选项 2 已损坏,选项 1 非常脆弱,它只适用于一个特定的 JDK。它完全依赖于 JList 的实现细节——它最终可能无法在 JDK 8+N 中工作。 invis 角色的东西是一个 hack,但至少它是健壮的。一个更好的选择是根本不使用 JList。使用 JTable 并将其样式设置为相同。
猜你喜欢
  • 2015-10-18
  • 2014-03-05
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 2017-07-01
相关资源
最近更新 更多