【问题标题】:reassign a new "character" to a key, so that it gets printed instead of the default letter for the key将新的“字符”重新分配给键,以便打印它而不是键的默认字母
【发布时间】:2011-01-18 23:22:24
【问题描述】:

我正在开发一个具有“宏系统”的文本编辑器,用户可以在其中为键盘上的键重新分配值——这样当他们按下字母 a 时,它可能会打印出该字母“z”代替。 (真的,它将用于数学符号,而不是其他字母)。

谁能让我开始使用 Java 代码为 JTextPane 中的键重新分配值?

如果您需要更多详细信息,请告诉我。

谢谢!


到目前为止,这就是我所拥有的:

public void keyPressed(KeyEvent evt) {
//Called when a key is pressed.

//Intercept the key before the default value is printed.
//1. Suppress the original character. Do this in the KeyEvent object
//by setting the doit property to false in your listener if the key
//matches a macro.

    jTextPane1.addKeyListener(new KeyAdapter() {
public void keyPressed(keyEvent event) {
if (event.getKeyCode() == KeyEvent.VK_A) {
//Perform an action when A is pressed and there is a macro.
if(macroA == true)
{
    keyPressed.doit() = false;
}
}
}
else if (event.getKeyCode() == KeyEvent.VK_B) {
//Perform an action when B is pressed if there is a macro.
if(macroB == true)
{
    keyPressed.doit() = false;
}
}
}
});

我正在研究如何通过“创建”宏来实现它,检查是否存在宏。

如果您有更多建议,我将不胜感激。

谢谢。

【问题讨论】:

  • KeyListeners 用于旧的 AWT 应用程序。 Swing 对此有更好的支持,你不应该使用 KeyListeners

标签: java swing jtextpane keymapping


【解决方案1】:

我已经有一段时间没有进行任何 Swing 开发了,但我认为您正在寻找 KeyListener。 这里有一个例子:http://download.oracle.com/javase/tutorial/uiswing/events/keylistener.html

您的后端需要将按键输入与您的宏进行映射,拦截按键输入并插入宏。

【讨论】:

  • 您还需要隐藏原始字符。如果键与宏匹配,您可以通过在侦听器中将 doit 属性设置为 false 来在 KeyEvent 对象中执行此操作。
  • 谁能给我一个映射键输入的代码示例?到目前为止,这似乎是我被困的地方。
  • 上面链接的教程有示例代码,您可以通过 JNLP 试用。它显示按键,包括修饰符(CTRL 等)。你有什么更具体的要求吗?
  • 我会检查一下,我会回帖。我可能想知道如何使一个 GUI 类(弹出窗口)的结果(重新分配)出现在另一个(实际 JFrame 所在的文本编辑器的主窗口)中。
  • @Konstantin,我同意压制。我的答案很糟糕。
【解决方案2】:

如果您想更改文本窗格中显示的字符,那么您有两个选择(我能想到)

a) 重写在文本窗格中显示文本的代码 b) 在 Document 中插入一个不同的字符,以便绘制字符

选项二是更简单的方法。

对于简单的一对一键映射,您只需使用 DocumentFilter。

对于更复杂的键映射,例如使用 Ctrl+1,要输入特殊字符,您可以使用 KeyBindings。

Swing tutorial 包含这两种方法的部分。请参阅“文本组件功能”和“使用键绑定”。

【讨论】:

  • +1。在最复杂的情​​况下,我也会覆盖 Document 的方法,如 insertString()/remove(),而不是使用 DocumentFilter,但通常 camickr 的建议就足够了。
  • @StanislavL,为什么要创建自定义文档?。然后代码将仅适用于您定位的文本组件。我的理解是,对 Document 的所有更新都会通过 DocumentFilter(如果存在)。我使用 DocumentFilter 的原因是可以在 JTextField、JTextArea 或 JTextField 上使用相同的类。虽然这不是问题的要求,但这使解决方案更具可重用性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多