Просмотр кнопок J с помощью клавиш со стрелками - PullRequest
4 голосов
/ 15 августа 2011

Я создал массив JButton, представляющий карты, их 16, 4 на 4. Как я могу просматривать JButton со стрелками на клавиатуре вместо мыши, и как я могу "щелкнуть" по JButton, нажав ENTER вместо щелчка мышью? Может быть, есть другой способ сделать это вместо JButton s?

С наилучшими пожеланиями!

Ответы [ 6 ]

7 голосов
/ 15 августа 2011

Я создал решение, которое позволит вам перемещаться по кнопкам со стрелками, активировать их пробелом и вводить.

Ниже приведен весь код.Комментариев нетrequestFocus() на правильный JButton при вызове клавиши со стрелкой.Я также зарегистрировал дополнительный KeyListener для нажатия клавиши Enter.

2 голосов
/ 15 августа 2011

как я могу "нажать" на JButton, нажав ENTER вместо щелчка мышью?

См. Введите ключ и кнопку .

Как я могу просматривать JButton со стрелками на клавиатуре вместо мыши

Для клавиш со стрелками вправо / влево вы можете добавить эти сочетания клавиш к клавишам обхода фокуса. См. Как использовать подсистему фокуса .

Для клавиш вверх / вниз вам необходимо создать пользовательское действие, а затем связать действие с сочетанием клавиш. См. Как использовать привязки клавиш . В учебнике также есть раздел на How to Use Actions.

2 голосов
/ 15 августа 2011

См. привязки клавиш .

component[0][0].getInputMap().put(KeyStroke.getKeyStrokeForEvent(KeyEvent.VK_RIGHT),
                        "moveRight");
component[0][0].getActionMap().put("moveRight", new Action() {
             @Override public void actionPerformed() {
                  component[0][1].requestFocus();
             }
});

Я не уверен, что код совершенно верен, но вы поняли идею.Вам нужно будет выполнить 36 из них, чтобы получить все направления между всеми кнопками, поэтому, возможно, вы захотите написать несколько циклов для автоматизации процесса.

2 голосов
/ 15 августа 2011

Просто нажмите Введите на клавиатуре ... Убедитесь, что вы используете

button.addActionListener(yourActionListener);

вместо создания прослушивателя мыши.

О, я забыл другоечасть.: D

Для просмотра можно использовать button.requestFocus(), чтобы изменить фокус на определенную кнопку.

Вот пример кода:

final JButton matrix[][] = new JButton[4][4];
for (int x = 0; x < 4; ++x)
{
    for (int y = 0; y < 4; ++y)
    {
        final int xx = x;
        final int yy = y;
        JButton b = new JButton();
        b.addKeyListener(new KeyAdapter()
        {
            @Override
            public void keyPressed(KeyEvent e)
            {
                int c = e.getKeyCode();
                if (c == KeyEvent.VK_UP)
                {
                    // Oops, corrected (xx > 0) to (yy > 0)
                    if (yy > 0) matrix[xx][yy-1].requestFocus();
                } else if (c == KeyEvent.VK_DOWN)
                {
                    if (yy < 3) matrix[xx][yy+1].requestFocus();
                }
                // Add the other directions here
            }
        });

        matrix[x][y] = b;
    }

}
1 голос
/ 15 августа 2011

Использование подсистемы фокусировки.

Это должно помочь вам начать использовать клавиши со стрелками для выбора компонентов. Это не проверено, так что простите за ошибки: D

Если у вас есть массив кнопок в JFrame,

JFrame frame = new JFrame();
//pseudo-method to add your buttons to the frame in the appropraite order.
frame.addButtonsToPanel(buttonArray, frame); 

//gets the default forward traversal keys (tab)
Set forwardKeys = frame.getFocusTraversalKeys(
KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS); 

// your own set of forward traversal keys
Set newForwardKeys = new HashSet(forwardKeys); 

// add the RIGHT ARROW key 
newForwardKeys.add(KeyStroke.getKeyStroke(
    KeyEvent.VK_RIGHT, 0)); 

//apply your  new set of keys
frame.setFocusTraversalKeys(
KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, 
    newForwardKeys); 

//gets the default backward traversal keys (shift-tab)
Set backwardKeys = frame.getFocusTraversalKeys(
KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS); 

// your own set of backward traversal keys
Set newBackwardKeys = new HashSet(backwardKeys); 

// add the LEFT ARROW key 
newBackwardKeys.add(KeyStroke.getKeyStroke(
    KeyEvent.VK_LEFT, 0)); 

//apply your  new set of keys
frame.setFocusTraversalKeys(
KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, 
    newBackwardKeys); 

p.s Подробнее см. Как использовать подсистему фокусировки

0 голосов
/ 24 ноября 2011

Недавно я добавил этот маленький драгоценный камень в свой класс утилит с графическим интерфейсом. Он просто добавляет новые ключи в ту же систему, которая меняет фокус [tab]:

public static void addUpDownToTraversalKeys(Component c)
{   
    addTraversalKeys(c, KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, KeyEvent.VK_DOWN);
    addTraversalKeys(c, KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, KeyEvent.VK_UP);
}

public static void addLeftRightToTraversalKeys(Component c)
{   
    addTraversalKeys(c, KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, KeyEvent.VK_RIGHT);
    addTraversalKeys(c, KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, KeyEvent.VK_LEFT);
}

public static void addTraversalKeys(Component c, int keysetId, int...keyCodes)
{   
    HashSet<AWTKeyStroke> newKeys = 
        new HashSet<AWTKeyStroke>(
                c.getFocusTraversalKeys(keysetId));
    for (int keyCode : keyCodes)
        newKeys.add(AWTKeyStroke.getAWTKeyStroke(keyCode, 0));
    c.setFocusTraversalKeys(keysetId,newKeys);
}

Добавленный в мой класс GuiUtilities, простой вызов GuiUtilities.addUpDownToTraversalKeys(this); внутри конструктора фрейма позволяет использовать клавиши со стрелками вверх и вниз для просмотра всех элементов. Обратите внимание, что addLeftRightToTraversalKeys() не рекомендуется, если вы получили текстовые области;)

...