簡體   English   中英

如何檢查Swing中是否選中了文本?

[英]How to check that text was selected in Swing?

我有簡單的JTextField和KeyListener。

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 + LEFT或RIGHT ARROW)選擇文本?

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

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM