如何在Java Swing中添加助记符?

5

我有一个问候程序,有3个JTextfields和3个与其相邻的JLabels。我想要添加助记符,这是在JLabel下划线下面的一个小字母。当用户按下Alt + 下划线字母键时,光标将移到其旁边的JTextField中。这是我的代码,只显示了简单的问候语而没有助记符。

import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class GreetingApp extends JFrame {
    private static final long serialVersionUID = 1L;
    private final JTextField firstNameField,middleNameField,lastNameField;
    private final JButton greetingButton;
    public GreetingApp() {
        super("Greetings");
        this.firstNameField = new JTextField(8);
        this.middleNameField = new JTextField(8);
        this.lastNameField = new JTextField(8);
        this.greetingButton = new JButton("Get Greeting"); 

        greetingButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(final ActionEvent ae){
                showGreeting();
            }
        });
        final Container mainPanel = getContentPane();
        mainPanel.setLayout(new BorderLayout());
        final JPanel inputPanel = new JPanel();
        final JPanel buttonPanel = new JPanel();
        inputPanel.setLayout(new GridLayout(3,3,3,5));
        buttonPanel.setLayout(new FlowLayout());
        JSeparator sep = new JSeparator();
        inputPanel.add(new JLabel("First Name: "),JLabel.LEFT_ALIGNMENT);
        inputPanel.add(firstNameField);
        inputPanel.add(new JLabel("MI: "),JLabel.LEFT_ALIGNMENT);
        inputPanel.add(middleNameField);
        inputPanel.add(new JLabel("Last Name: "),JLabel.LEFT_ALIGNMENT);
        inputPanel.add(lastNameField);
        mainPanel.add(inputPanel,BorderLayout.PAGE_START);
        //buttonPanel.add(sep,BorderLayout.PAGE_START);
        mainPanel.add(sep,BorderLayout.CENTER);
        buttonPanel.add(greetingButton);
        mainPanel.add(buttonPanel,BorderLayout.PAGE_END);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }
    private String getFullName() throws IllegalStateException{
        if(firstNameField.getText().trim().length() == 0){
            throw new IllegalArgumentException("First name cannot be blank");
        }

        if(middleNameField.getText().trim().length() > 1){
            throw new IllegalArgumentException("Middle intial cannot be greater than 1 letter");
        }
        if(lastNameField.getText().trim().length() == 0){
            throw new IllegalArgumentException("Last name cannot be blank");
        }
        if(middleNameField.getText().trim().length() ==0){
            return "Greetings, "+this.firstNameField.getText()+" "+ this.middleNameField.getText() +this.lastNameField.getText()+"!";
        }
        return "Greetings, "+this.firstNameField.getText()+" "+ this.middleNameField.getText()+"."+this.lastNameField.getText()+"!";
    }
    private void showGreeting(){

        try{
            String message = getFullName();
            JOptionPane.showMessageDialog(this, message);
       }catch(final IllegalArgumentException iae){
           JOptionPane.showMessageDialog(this,
                   iae.getMessage(),
                   "Error",
                   JOptionPane.ERROR_MESSAGE);
       }

    }
    public static void main(String[] args) {
        try{
            for(LookAndFeelInfo info:UIManager.getInstalledLookAndFeels()){
                if("Nimbus".equals(info.getName())){
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        }catch(Exception e){
            e.getStackTrace();
        }
    }
}

请勿像您在此处所做的那样编辑掉大量有用的部分。这里的问题和答案是为了帮助未来的读者而设计的。如果您不希望他人从您的帖子中获得信息,请不要在这里发布它们。 - Andrew Barber
1个回答

8
如果您的JLabel叫做label,而文本框JTextField叫做textField:
label.setDisplayedMnemonic(KeyEvent.VK_N); //replace .VK_N with the appropriate key

将助记词放在标签上,如下所示:
label.setLabelFor(textField);

将该标签(及其助记符)与相应的文本字段相关联。

1
你也可以传递一个字符到setDisplayedMnemonic()方法中,以及一个键码。此外,如果您正在使用一个Action与您的按钮,您可以在Action的构造函数中定义助记符、加速键和工具提示。 - Edward Falk
谢谢Drew,我成功让下划线显示了出来。请问我需要在KeyEvent.(???)后面添加什么内容,才能使Alt+F跳转到相关的textField? - user1775500
1
KeyEvent.VK_F:完整的按键代码列表在javadoc上:http://docs.oracle.com/javase/6/docs/api/java/awt/event/KeyEvent.html#VK_F - drew moore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接