Есть ли способ переопределить собственные клавиши ускорения?

У меня есть JList, заполненный записями, которые собственный метод копирования не может обработать. У меня есть метод, который эффективно копирует и форматирует выбранные данные именно так, как я хочу, и я хочу, чтобы этот метод вызывался при использовании ctrl + c, но, к сожалению, JList уже перечисляет эти клавиши быстрого доступа, поэтому, когда я устанавливаю их для своей копии функция в моем JMenu не работает, если я не передам фокус JMeny. В любом случае, я могу заставить ctrl + c использовать мой метод копирования вместо собственного, кроме того, что мне нужно нажимать на JMenu каждый раз, когда я хочу что-то скопировать?


person Ben Hay    schedule 15.07.2015    source источник
comment
Добавьте привязку клавиши для нажатия клавиши, которое вы хотите использовать...Как использовать привязки клавиш. Вы также можете добавить Action для привязки copy...   -  person MadProgrammer    schedule 15.07.2015
comment
Ничего себе, из того, что я прочитал в вашей ссылке, кажется, что нет способа преобразовать мой метод копирования в действие, но это становится довольно сложным... У меня уже есть копирование, привязанное к нажатиям клавиш, с помощью 'copy.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_C, InputEvent.CTRL_MASK));' в любом случае, я могу просто заставить JList иметь тот же эффект, когда я нажимаю ctrl + c, не тратя весь день на изучение того, как использовать действия?   -  person Ben Hay    schedule 15.07.2015
comment
there is no way around converting my copy method into an action but that stuff gets pretty complex... - почему ты говоришь, что это сложно? Action — это просто ActionListener. Вы добавляете код в метод actionPerformed() своего пользовательского действия копирования.   -  person camickr    schedule 15.07.2015
comment
Я думаю, что Как использовать привязки клавиш просто не предоставил любые хорошие примеры/мне было трудно понять. Это учебное пособие по связыванию клавиш Java помог мне понять это немного лучше   -  person Ben Hay    schedule 15.07.2015
comment
Кстати -> copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK)); на самом деле не является привязкой клавиш   -  person MadProgrammer    schedule 15.07.2015


Ответы (1)


Начните с изучения Как использовать привязки клавиш и Как использовать действия

Начните с создания Action, который описывает, что и как он делает. В этом случае вам может потребоваться указать JList, из которого вы хотите скопировать (у меня был бы какой-то interface, который предоставил какой-то метод простого «копирования», но это только я)

public class CopyAction extends AbstractAction {

    private JList list;

    public CopyAction(JList list) {
        putValue(NAME, "Copy");
        putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK));
        putValue(MNEMONIC_KEY, KeyEvent.VK_C);
        putValue(SELECTED_KEY, "Copy stuff");
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("All your copies belong to us");
    }

    public JList getList() {
        return list;
    }

}

Теперь добавьте привязку ключа к JList вместе с вашим Action...

public class TestPane extends JPanel {

    private JList listOfStuff;

    public TestPane() {
        setLayout(new BorderLayout());
        listOfStuff = new JList();
        add(new JScrollPane(listOfStuff));

        CopyAction copyAction = new CopyAction(listOfStuff);
        listOfStuff.getActionMap().put("copy", copyAction);
    }

    public JList getListOfStuff() {
        return listOfStuff;
    }

}

Теперь вы также можете использовать Action с кнопками...

TestPane tp = new TestPane();
CopyAction copyAction = new CopyAction(tp.getListOfStuff());

JMenuBar mb = new JMenuBar();
JMenu menu = new JMenu("Edit");
mb.add(menu);
menu.add(copyAction);

JFrame frame = new JFrame("Testing");
frame.setJMenuBar(mb);

И полностью работоспособный пример....

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

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

    public class CopyAction extends AbstractAction {

        private JList list;

        public CopyAction(JList list) {
            putValue(NAME, "Copy");
            putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK));
            putValue(MNEMONIC_KEY, KeyEvent.VK_C);
            putValue(SELECTED_KEY, "Copy stuff");
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("All your copies belong to us");
        }

        public JList getList() {
            return list;
        }

    }

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

                TestPane tp = new TestPane();
                CopyAction copyAction = new CopyAction(tp.getListOfStuff());

                JMenuBar mb = new JMenuBar();
                JMenu menu = new JMenu("Edit");
                mb.add(menu);
                menu.add(copyAction);

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

    public class TestPane extends JPanel {

        private JList listOfStuff;

        public TestPane() {
            setLayout(new BorderLayout());
            listOfStuff = new JList();
            add(new JScrollPane(listOfStuff));

            CopyAction copyAction = new CopyAction(listOfStuff);
            listOfStuff.getActionMap().put("copy", copyAction);
        }

        public JList getListOfStuff() {
            return listOfStuff;
        }

    }

}
person MadProgrammer    schedule 15.07.2015