- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找不到关于所有这些之间关系的简明答案,所以我可以选择最佳实践并继续前进。 JTextComponent
有:
旧的 addKeyListener(..)
。我们编写一个 KeyListener
,其中包含在 keyPressed(..)
、keyTyped(..)
等事件上调用的方法,我们可以查询:event.getKeyCode()
。
addKeymap(..)
和 setKeymap(..)
。 Keymap
有 addActionForKeyStroke(..)
,它需要一个 KeyStroke
(我们可以通过调用 KeyStroke
' s 指定字符或键代码的静态方法)和一个 Action
,它是一个带有铃声和口哨声的 ActionListener
。
getInputMap(..)
和 getActionMap(..)
。 InputMap
将 KeyStroke
(如上)映射到 String
,ActionMap
将字符串映射到 Action
(如上)。 Java 教程 How to use key bindings谈论那个。
这是实现相同功能的三种冗余方式。除了比较优势/劣势之外,这还自然地提出了这三种机制如何共存的问题?哪些优先于其他?
最佳答案
InputMap
+ ActionMap
系统在 1.3 中引入并替换了旧的 Keymap
(使用 InputMap 重新实现)
+ ActionMap
引擎盖下的系统,用于向后兼容)。新系统具有 Keymap
功能的超集。 (来自 Loy 和 Eckstein 的 O'Reilly 书 Java Swing,在 page 755 上。)
因此,我们无需担心新代码的Keymap
。
How to use key bindings 中的 Java 教程甚至没有提到 Keymap
,但它确实解决了 KeyListener
与键 bindings(即 InputMap
+ ActionMap
设施):
KeyListener
的方法需要更多的工作,因为焦点和组件包含层次结构(它不知道)的问题。比如我们有一个table组件,里面包含一个table-cell组件,它有焦点,按↑键会向table cell组件发送事件,由我们来决定将它们转发到表格(因为我们想要更改表格当前选定的单元格)。
相比之下,键绑定(bind)让我们可以直接在父组件上指定绑定(bind):每个 JComponent
都有三个 InputMap
和一个 ActionMap
。输入映射属于以下类型:JComponent.WHEN_FOCUSED
、WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
和 WHEN_IN_FOCUSED_WINDOW
。与监听器不同,在监听器中,焦点组件上的所有 KeyListener
仅 按顺序处理,使用键绑定(bind)事件将向上传播层次结构(好吧,我的树想想,因为每个组件只有一个父级)直到它找到一个 Action (还没有被禁用),这就是它停止的时候。在此搜索过程中,第二种类型的 InputMap
优先于第三种类型。
KeyListener
优先于键绑定(bind)机制。当一个组件的 KeyListener
正在处理时,其中一个可能 e.consume()
,然后事件将不会进一步到达 KeyListener
s,也不是键绑定(bind)层次结构。最后添加的关键监听器首先被处理。
因此,虽然键绑定(bind)方法从头开始设置起来有点麻烦(您必须为 Action
命名,并调用两个方法将其绑定(bind)到KeyStroke
通过 InputMap
和 AbstractAction
通过 ActionMap
),似乎它应该是分配要响应按键而调用的函数的第一个调用点。 KeyListener
使您能够做更多事情(例如奇特的组合键——超出 KeyStroke
所能处理的范围;并允许更早地访问按键事件,并能够 e .consume()
它),但键绑定(bind)更方便,因为它们可以预测基本用例。
相关点(由 related question 建议)是另一种处理文本组件的冗余机制,尤其是:DocumentListener
s和 DocumentFilter
s .当重新映射键的原因是控制文本组件中的文本发生什么时,这些更加方便和防错。
另请参阅:关于键绑定(bind)系统从引入之日起如何工作的详细信息的报告,archived version .
关于java - Keymap、InputMap、ActionMap、KeyListener — 选择重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36647483/
假设我有一个类,我在其中重载了运算符 == : Class A { ... public: bool operator== (const A &rhs) const; ... };
我知道你不应该使用 std::find(some_map.begin(), some_map.end()) 或 std::lower_bound,因为它会采用线性时间而不是 some_map.lowe
我正在尝试在 Haskell 中定义 Vector3 数据类型,并允许在其上使用 (+) 运算符。我尝试了以下方法: data Vector3 = Vector3 Double Double Doub
我已经为我的类图将运算符重载为“-”。它的用途并不完全直观(糟糕的编码 - 我知道)但是如果我做 graph3 = graph2-graph1 那么图 3 是应该只接收图 2 和图 1 中的那些顶点。
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Operator overloading 我想重载 以按字母顺序排列字符串,但我不确定该怎么做。 如何再次
下面的代码给我一个编译错误。谁能告诉我为什么? class mytype { public: int value; mytype(int a) { value = a;
这有什么问题吗? class Vec2 attr_accessor :x, :y # ... def += (v) @x += v.x @y += v.y retu
是否可以重载 [] 运算符两次?允许这样的事情:function[3][3](就像在二维数组中一样)。 如果可能的话,我想看看一些示例代码。 最佳答案 您可以重载 operator[] 以返回一个对象
我的团队目前正在与 Lua 合作,创建一个 android 游戏。我们遇到的一件事是表面上无法创建重载构造函数。 我习惯于使用默认值设置一个对象,然后在需要时使其过载。 前任: apples() {
我有一个网页,在某个时候显示一个导航栏,它只不过是一个 a 元素的列表 (ul)。所述 a 元素的大多数样式规则都是通用的。唯一应该改变的部分是要显示的图像,可以从列表中每个 li 元素的 id 标签
我对使用/重载“范围步长”运算符(.. ..)很感兴趣,但我终其一生都无法了解如何使用它。 在文档中它说 // Usage: start .. step .. finish 但是在 F# shell
Java 11(可能无关紧要): public static String toString(Object obj) { return ReflectionToStringBuilder.to
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我无法理解以下代码(针对行号进行注释) class Base { void m1(Object o) { } void m2(String o) { } } publi
我有以下代码片段: #include using namespace std; struct Integer{ int x; Integer(const int val) : x(v
class myclass{ //definitions here }; myclass e; int myarray[10]; /* Do something... */ e = myarray;
为什么不能将下标运算符(operator [])作为 friend 函数重载? 最佳答案 正如Bjarne Stroustrup在D&E book中所说: However, even in the o
我有以下代码片段: #include using namespace std; struct Integer{ int x; Integer(const int val) : x(v
因此,我有一个问题是我最近尝试重载 namespace Eng { /** * A structure to represent pixels */ typedef
如何重载onResume()以正确的方式工作?我想从 activity 返回到 MainActivity ,我希望在其中具有与应用程序启动后相同的状态。我想使用 recreate() 但它循环了或者类
我是一名优秀的程序员,十分优秀!