3

多くの環境におけるネイティブ テキスト フィールドの通常の動作は次のとおりです。

テキスト「abcdefg」を含むテキストフィールド。マウスを使用して、左から右に「efg」を選択します。キャレットは "g" の後ろにあります。カーソル左キーを1回押してキャレットを左に移動すると、選択が解除され、キャレットは「e」の直前になります。JTextField または JTextArea (Mac OS でテスト済み) で同じことを行うと、まったく同じことを行うと、"g" の直前にキャレットが配置されます。

KeyListener を使用して各コンポーネントに登録することで、プログラムでそれを変更する方法を知っていますが、アプリケーション全体でそれを変更する方法を探しています。それは可能ですか?フラグはありますか、見つかりませんか、それとも自分のルック アンド フィールをハックする必要がありますか?

ありがとう

4

2 に答える 2

2

アプリケーション全体でそれを変更する方法を探しています

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class CaretAction extends TextAction
{
    private boolean caretForward;

    public CaretAction(boolean caretForward)
    {
        super(caretForward ? "Caret Forward" : "Caret Backward");
        this.caretForward = caretForward;
    }

    public void actionPerformed(ActionEvent e)
    {
        JTextComponent textComponent = getFocusedComponent();

        int start = textComponent.getSelectionStart();
        int end = textComponent.getSelectionEnd();
        int offset = textComponent.getCaretPosition();

        if (start != end)
        {
            if (caretForward)
                offset = (offset == end) ? offset + 1 : end;
            else
                offset = (offset == start) ? offset -1 : start;
        }
        else
        {
            offset += (caretForward) ? 1 : -1;
        }

        offset = Math.max(offset, 0);
        offset = Math.min(offset, textComponent.getDocument().getLength());
        textComponent.setCaretPosition( offset );
    }

    private static void createAndShowUI()
    {
        JTextField textField1 = new JTextField(10);
        JTextField textField2 = new JTextField(10);

        JPanel panel = new JPanel();
        panel.add( textField1 );
        panel.add( textField2 );

        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( panel );
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );

        ActionMap map = (ActionMap)UIManager.get("TextField.actionMap");
        map.put(DefaultEditorKit.backwardAction, new CaretAction(false));
        map.put(DefaultEditorKit.forwardAction, new CaretAction(true));
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

JTextArea、JFormattedTextField などの ActionMap も変更する必要があります。

于 2013-03-21T20:37:02.810 に答える
1

あなたができることはaddCaretListener次のとおりです。

     anyField.addCaretListener(new CaretListener() {
        public void caretUpdate(CaretEvent evt) {
            anyFieldCaretUpdate(evt);
        }
       });

最後にもう一度キャレットを設定します。

  private void anyFieldCaretUpdate(CaretEvent evt) {

     anyField.setCaretPosition(anyField.getText().length());
        }
于 2013-03-21T18:14:06.557 に答える