У меня есть JList, заполненный записями, которые собственный метод копирования не может обработать. У меня есть метод, который эффективно копирует и форматирует выбранные данные именно так, как я хочу, и я хочу, чтобы этот метод вызывался при использовании ctrl + c, но, к сожалению, JList уже перечисляет эти клавиши быстрого доступа, поэтому, когда я устанавливаю их для своей копии функция в моем JMenu не работает, если я не передам фокус JMeny. В любом случае, я могу заставить ctrl + c использовать мой метод копирования вместо собственного, кроме того, что мне нужно нажимать на JMenu каждый раз, когда я хочу что-то скопировать?
Есть ли способ переопределить собственные клавиши ускорения?
Ответы (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
Action
для привязкиcopy
... - person MadProgrammer   schedule 15.07.2015there 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.2015copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
на самом деле не является привязкой клавиш - person MadProgrammer   schedule 15.07.2015