0

Swing アプリケーションで Enter キーを Tab キーのように動作させたいのですが、このクラスは JTextFields に対して正常に動作しています。JComboBox と Jspinner、またはフレーム上の他のコントロールに対して同じことを行うにはどうすればよいですか?親切に助けてください。

class MyTextField extends JTextField {
    MyTextField(int len) {
    super(len);
    addKeyListener(new KeyAdapter() {
            @Override
      public void keyPressed(KeyEvent evt) {
        int key = evt.getKeyCode();
        if (key == KeyEvent.VK_ENTER)
          transferFocus();
      }
    });
  }
}
4

1 に答える 1

2

Enterは、Swing のほとんどのコンポーネントにとって特別な意味を持ちます。たとえば、 が押されたときに登録されたときにJTextFieldトリガーされます。この動作を変更すると、アプリケーションに予期しない結果が生じる可能性があり、多くのユーザーを混乱させる可能性があります...actionPerformedActionListenersEnter

そうは言っても、フォーカス トラバーサル キーを変更する最善の方法は、Setに ofを提供するKeyStrokeことKeyboardFocusManagerです。これにより、(ほとんどの場合) キーがグローバルになります。

ただし、一部のコンポーネントは独自のフォーカス トラバーサル キーを提供しますJTextAreaJTable

詳細については、フォーカス サブシステムの使用方法をご覧ください。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.KeyboardFocusManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestFocusTraversal {

    public static void main(String[] args) {
        new TestFocusTraversal();
    }

    public TestFocusTraversal() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            for (int index = 0; index < 10; index++) {
                JTextField tf = new JTextField(5);
                tf.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        System.out.println("...");
                    }
                });
                add(tf);
            }

            add(new JScrollPane(new JTextArea(10, 10)));

            KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
            KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
            KeyStroke ctrlTab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, KeyEvent.CTRL_DOWN_MASK);
            Set<KeyStroke> keys = new HashSet<>();
            keys.add(enter);
            keys.add(tab);
            keys.add(ctrlTab);
            KeyboardFocusManager.getCurrentKeyboardFocusManager().setDefaultFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, keys);
        }
    }

}
于 2013-09-19T08:54:07.120 に答える