Swing активно использует Key Bindings API, чтобы упростить работу с существующей функциональностью. Мы уже знаем, что JTextField
полностью способен выполнять выбор, нам просто нужно подключить его.
JTextField
использует selection-backward
и selection-forward
для выполнения требуемой функциональности, когда активируются зависящие от системы нажатия клавиш, нам просто нужно ввести в нее наш код.
Для этого я написал простое действие ReplaceAction
, которое принимает старый Action
, который нас интересует, и вызывает два метода: один до и один после вызова старого Action
. Это позволяет вводить ваши необходимые функции в любую точка требуется для достижения любой функциональности вы пытаетесь реализовать ...
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class MonitorSelection {
public static void main(String[] args) {
new MonitorSelection();
}
public MonitorSelection() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridBagLayout());
JTextField field = new JTextField(10);
add(field);
InputMap im = field.getInputMap(WHEN_FOCUSED);
ActionMap am = field.getActionMap();
Action oldAction = am.get("selection-backward");
am.put("selection-backward", new ReplacedAction(oldAction){
@Override
protected void doAfterReplacedAction() {
System.out.println("Before selection-backward");
}
@Override
protected void doBeforeReplacedAction() {
System.out.println("After selection-backward");
}
});
oldAction = am.get("selection-forward");
am.put("selection-forward", new ReplacedAction(oldAction){
@Override
protected void doAfterReplacedAction() {
System.out.println("Before selection-forward");
}
@Override
protected void doBeforeReplacedAction() {
System.out.println("After selection-forward");
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
public class ReplacedAction extends AbstractAction {
private Action replaced;
public ReplacedAction(Action replaced) {
this.replaced = replaced;
}
@Override
public void actionPerformed(ActionEvent e) {
doBeforeReplacedAction();
replaced.actionPerformed(e);
doAfterReplacedAction();
}
protected void doBeforeReplacedAction() {
}
protected void doAfterReplacedAction() {
}
}
}
В зависимости от того, что вы хотите сделать, вы можете настроить ключевые привязки или простое использование ' JTextField # getSelectedText' или 'JTextField # getSelectionStart' и' JTextField # getSelectionEnd'. О, и 'KeyListener' - действительно ужасная идея, но особенно с текстовыми компонентами. – MadProgrammer
Можно ли проверить, является ли KeyEvent комбинацией клавишного сдвига и стрелки? –
@ThirdMartian Что вы не принимаете во внимание, не все системы используют одни и те же комбинации клавиш. FKY, привязки клавиш, которые вы, вероятно, хотите, это 'selection-backward' и' selection-forward' – MadProgrammer