2016-01-14 2 views
1

У меня есть простой JTextField и KeyListener.Как проверить, что текст был выбран в Swing?

JTextField textField = new JTextField(); 
textField.addKeyListener(new KeyListener() { 

@Override 
    public void keyTyped(KeyEvent e) 
    { 
    } 

    @Override 
    public void keyPressed(KeyEvent e) 
    { 
    } 

    @Override 
    public void keyReleased(KeyEvent e) 
    { 
     validateThatTextWasSelectedWithShiftAndArrow(); 
    } 
}); 

Как проверить, что кто-то выбрать текст комбинации клавиш (Shift + стрелки вправо или влево)?

+0

В зависимости от того, что вы хотите сделать, вы можете настроить ключевые привязки или простое использование ' JTextField # getSelectedText' или 'JTextField # getSelectionStart' и' JTextField # getSelectionEnd'. О, и 'KeyListener' - действительно ужасная идея, но особенно с текстовыми компонентами. – MadProgrammer

+0

Можно ли проверить, является ли KeyEvent комбинацией клавишного сдвига и стрелки? –

+0

@ThirdMartian Что вы не принимаете во внимание, не все системы используют одни и те же комбинации клавиш. FKY, привязки клавиш, которые вы, вероятно, хотите, это 'selection-backward' и' selection-forward' – MadProgrammer

ответ

2

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() { 
     } 

    } 

} 
+0

Я не уверен, может ли это помочь, возможно, потому, что я не объяснил правильно. То, что я делаю, вызывает метод, когда KeyReleased. И я хочу предотвратить вызов этого метода, когда эти ключи являются клавишами выбора, потому что мой метод перестает выбирать. –

+0

Ну, тогда вы не должны использовать «KeyListener» с текстовым компонентом в первую очередь, это неправильный способ взаимодействия с текстовыми компонентами. Что это за «метод», который сбрасывает выбор? – MadProgrammer

+0

Проблема заключается в том, что я должен использовать KeyListener. Этот метод обновляет мои данные, и после этого установка каретки заканчивается текстом, поэтому он останавливает выбор текста. –

Смежные вопросы