当前位置: 首页 > 知识库问答 >
问题:

在Java/Swing中更改助记符修饰符键

姚航
2023-03-14

在Swing中设置焦点热键非常简单:

  tfldPlantsNeeded = new JTextField( FIELD_LEN_MED );
  lblPlantsNeeded = new JLabel( "Plants Needed" );
  lblPlantsNeeded.setDisplayedMnemonic( 'p' );
  lblPlantsNeeded.setLabelFor( tfldPlantsNeeded );

当用户按下ALT p时,这将使tfldplantsneedjtext字段成为焦点。它还高亮显示将触发焦点更改的角色。(在这种情况下,当按下ALT时,“Plants”中的“P”带下划线。)

这太棒了。。。嗯,有点。在Mac电脑上,当用户按下ALT(也是Mac键盘上的选项)时,助记符处于高位,但按下p时不会触发焦点变化。但是,如果html" target="_blank">用户按下了控制选项p,则它会按“预期”工作,焦点也会改变。(另一方面,如果用户确实按了选项p,当前关注的文本字段将插入有趣的字符。)

我知道我可以通过getInputMapgetActionMap指定自定义键绑定来实现这一点,但是有没有办法更改应用程序全局助记符修饰符,以便我们可以使用自动键绑定和触发字符高亮显示?(在我的例子中,我想使用CommandMeta作为助记符修改键。)

共有1个答案

宋育
2023-03-14

显然这并不像你想象的那么简单,但有一种方法。

首先,对于菜单(JMenu)有一个由外观控制的属性,称为菜单。快捷键,可以手动设置。这将为特定外观中的菜单设置助记符修饰符。如果你想了解更多信息,请随时询问。

要为所有内容设置助记符修饰符,需要覆盖默认工具箱(toolkit)。首先,运行一个mainhtml" target="_blank">方法,通过以下几行找到它是什么

System.out.println(System.getProperty("java.awt.headless"));
System.out.println(System.getProperty("awt.toolkit"));

如果第一行是falsenull(请参见java.awt.Toolkit getDefaultToolkit()),那么第二行将为您提供用作系统默认工具箱的类名。我使用Windows,第二行给出了输出sun。awt。窗户。WToolkit。现在,在默认工具箱中创建一个覆盖getFocusAcceleratorKeyMask的类。对我来说是这样的

public class MyToolkit extends WToolkit {

    @Override
    public int getFocusAcceleratorKeyMask() {
        return InputEvent.CTRL_DOWN_MASK;
    }
}

最后,我们必须告诉系统使用它。在您的应用程序中,将线

System.setProperty("awt.toolkit", "packagename.MyToolkit");

您需要设置类的正确包路径的地方。确保在开始任何图形用户界面相关代码之前,这一行已经放置好了,最好是在main的第一行。现在应该将CONTROL设置为全局助记修饰符(或者使用META_DOWN_MASK,如果这是您想要的。查看java.awt.event.输入事件的MASK列表。)。

 类似资料:
  • 下面的代码是创建(未显示)的方法的一部分,它有几个选项,如撤消、重做、剪切、复制、粘贴等。。。 类仅用于调试目的,但这是我通常放置类的地方 如您所见,我已经将“重做”动作的助记词设置为Y,将“剪切”动作设置为X。 我使用的是中的内置方法,它会自动将我的修改器设置为control,并在我想要的时候精确剪切文本。(CTRL-X) 这里的问题是:由于我的不使用DefaultEditorKit,它将修饰符

  • 问题内容: 有没有理由可以更改覆盖方法的访问修饰符?例如, 然后将package-private访问修饰符更改为, 我只是出于好奇而问这个问题。 问题答案: Java不允许您对access修饰符进行 更严格的限制 ,因为这会违反以下规则:子类实例应该可以代替超类实例使用。但是当涉及到 减少 访问限制时……好吧,也许超类是由另一个人编写的,他们没有想到您要使用其类的方式。 人们编写的程序以及编程时所

  • 主要内容:final 修饰变量,final修饰方法,final修饰类,final 修饰符使用总结final 在 Java 中的意思是最终,也可以称为完结器,表示对象是最终形态的,不可改变的意思。final 应用于类、方法和变量时意义是不同的,但本质是一样的,都表示不可改变,类似 C# 里的 sealed 关键字。 使用 final 关键字声明类、变量和方法需要注意以下几点: final 用在变量的前面表示变量的值不可以改变,此时该变量可以被称为常量。 final 用在方法的前面表示方法不可以

  • private private修饰符是我们使用的最限制的修饰符。它表示它只能被自己所在的文件可见。所以如果我们给一个类声明为private,我们就不能在定义这个类之外的文件中使用它。 另一方面,如果我们在一个类里面使用了private修饰符,那访问权限就被限制在这个类里面了。甚至是继承这个类的子类也不能使用它。 所以一等公民,类、对象、接口……(也就是包成员)如果被定义为private,那么它们只

  • 问题内容: 在Java中,有一种做法是声明每个变量(局部变量或类),如果参数确实存在,则声明参数final。 尽管这使代码更加冗长,但是这有助于简化代码的读取/抓取,并且由于意图被明确标记,因此还可以防止错误。 您对此有何想法,您会怎么做? 问题答案: 我认为这都与良好的编码风格有关。当然,你可以编写出色而健壮的程序,而无需在任何地方使用很多修饰符,但是当你考虑一下时… 将所有不应该改变的东西加进

  • 根据留档(http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html)的第二个表,没有标识符的成员对子类不可见。 但是,当我运行下面的示例代码时,“1”(b的内容)被打印出来! 如果没有访问修饰符的成员不能从子类访问,那么为什么在本例中打印它 它应该抛出一个错误,就像在私有访问修饰符中一样,不是吗?