Разница в Java в обнаружении ключей между Windows и Mac - PullRequest
2 голосов
/ 02 апреля 2012

У меня есть JList с ключевым слушателем, чтобы пользователь мог легко удалить элемент из списка. На окнах работает нормально. Вы нажимаете клавишу удаления, и элемент удаляется. На mac программа не отвечает на клавишу удаления. Я использую KeyEvent.VK_DELETE, и я подумал, что это нейтральный для платформы способ обнаружения специальных ключей. Есть ли другой способ обнаружения нажатия клавиш на Mac?

    studentJList.setModel(studentListModel);  // a custom model I wrote
    studentJList.addKeyListener(new KeyListener() {
        @Override
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_DELETE) {
                studentListModel.remove(studentJList.getSelectedIndex());
                studentJList.revalidate();
            }
        }

        @Override
        public void keyReleased(KeyEvent e) { }

        @Override
        public void keyTyped(KeyEvent e) { }
    });

Ответы [ 2 ]

7 голосов
/ 02 апреля 2012

Используйте сочетания клавиш вместо ключевых прослушивателей, и поведение будет одинаковым на всех платформах.

См. Также Слушатель KeyAdapter работает в Windows, а не на Mac ,это более или менее та же проблема, и решение также применимо к вашей проблеме.

4 голосов
/ 02 апреля 2012

например

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ListDemo extends JPanel {

    private static final long serialVersionUID = 1L;
    private JFrame frame = new JFrame("ListDemo");
    private JList list;
    private DefaultListModel listModel;

    public ListDemo() {
        super(new BorderLayout());
        listModel = new DefaultListModel();
        listModel.addElement("Jane Doe");
        listModel.addElement("John Smith");
        listModel.addElement("Kathy Green");
        list = new JList(listModel);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.setSelectedIndex(0);
        list.setVisibleRowCount(5);
        JScrollPane listScrollPane = new JScrollPane(list);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(listScrollPane, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
        setKeyBindings();
    }

    private void setKeyBindings() {
        list.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
                .put(KeyStroke.getKeyStroke("DELETE"), "clickDelete");
        list.getActionMap().put("clickDelete", new AbstractAction() {

            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                int index = list.getSelectedIndex();
                if (index > -1) {
                    listModel.remove(index);
                }
            }
        });
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                ListDemo listDemo = new ListDemo();
            }
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...