4

フィールドの実際の「テキスト」の周りに接頭辞と接尾辞が表示されている JFormattedTextField (または実際には任意の JTextComponent) を考えてみましょう。

たとえば、double 3.5 は文字列 (書式設定による) "3.50" になり、その周りに接頭辞 "$ " と接尾辞 "" があり、表示テキストは "$ 3.50" になります。

明らかに、これは簡単です。ただし、ユーザーは引き続きプレフィックス/サフィックス内のテキストを選択できるため、プレフィックス/サフィックスの一部またはすべてを削除する可能性があります。接頭辞/接尾辞をまったく選択できないようにユーザーを制限することをお勧めします(まだテキストフィールドの一部であるため、JLabelsはありません)。これは、CaretListener を使用して (または setCaretPosition/moveCaretPosition をオーバーライドすることで) ほぼ達成できます。これにより、Ca がフィールド全体を選択できなくなり、矢印キーを使用してプレフィックス/サフィックスに移動できなくなります。ただし、マウスのドラッグとシフト矢印キーを使用すると、選択範囲をこれらの制限された領域に移動できます。

何か案は?

4

1 に答える 1

7

これには NavigationFilter を使用できます。

開始するための例を次に示します。

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

public class NavigationFilterPrefixWithBackspace extends NavigationFilter
{
    private int prefixLength;
    private Action deletePrevious;

    public NavigationFilterPrefixWithBackspace(int prefixLength, JTextComponent component)
    {
        this.prefixLength = prefixLength;
        deletePrevious = component.getActionMap().get("delete-previous");
        component.getActionMap().put("delete-previous", new BackspaceAction());
        component.setCaretPosition(prefixLength);
    }

    public void setDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias)
    {
        fb.setDot(Math.max(dot, prefixLength), bias);
    }

    public void moveDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias)
    {
        fb.moveDot(Math.max(dot, prefixLength), bias);
    }

    class BackspaceAction extends AbstractAction
    {
        public void actionPerformed(ActionEvent e)
        {
            JTextComponent component = (JTextComponent)e.getSource();

            if (component.getCaretPosition() > prefixLength)
            {
                deletePrevious.actionPerformed( null );
            }
        }
    }

    public static void main(String args[]) throws Exception {

        JTextField textField = new JTextField("Prefix_", 20);
        textField.setNavigationFilter( new NavigationFilterPrefixWithBackspace(7, textField) );

        JFrame frame = new JFrame("Navigation Filter Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(textField);
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }
}

これが JFormattedTextField の仕組みだと思います。したがって、デフォルトの動作を置き換える可能性があるため、書式設定されたテキスト フィールドでこれを使用できるかどうかはわかりません。

于 2011-09-14T18:49:07.037 に答える