-2

さて、ユーザーからの入力を必要とする Java プロジェクトに取り組んでいます。フィールドに文字がないときにユーザーがバックスペースを押すと、ウィンドウの警告音が聞こえることに気付きました。どうすればこれを止めることができますか。私のシステムはWindows 10ですが、プラットフォームによって動作が異なる場合があります。ありがとうございました。

4

1 に答える 1

3

異なるプラットフォームでは動作が異なる場合があります。

はい、LAF によって制御されているため、動作が異なる可能性があるため、実際に変更するべきではありません。

しかし、Swing がどのように機能するかを理解するには、Swing がActionによって提供されるを使用しDefaultEditorKitて、テキスト コンポーネントの編集機能を提供することを理解する必要があります。

以下は、現在の「前の文字を削除」アクションのコードです (から取得DefaultEditKit):

/*
 * Deletes the character of content that precedes the
 * current caret position.
 * @see DefaultEditorKit#deletePrevCharAction
 * @see DefaultEditorKit#getActions
 */
static class DeletePrevCharAction extends TextAction {

    /**
     * Creates this object with the appropriate identifier.
     */
    DeletePrevCharAction() {
        super(DefaultEditorKit.deletePrevCharAction);
    }

    /**
     * The operation to perform when this action is triggered.
     *
     * @param e the action event
     */
    public void actionPerformed(ActionEvent e) {
        JTextComponent target = getTextComponent(e);
        boolean beep = true;
        if ((target != null) && (target.isEditable())) {
            try {
                Document doc = target.getDocument();
                Caret caret = target.getCaret();
                int dot = caret.getDot();
                int mark = caret.getMark();
                if (dot != mark) {
                    doc.remove(Math.min(dot, mark), Math.abs(dot - mark));
                    beep = false;
                } else if (dot > 0) {
                    int delChars = 1;

                    if (dot > 1) {
                        String dotChars = doc.getText(dot - 2, 2);
                        char c0 = dotChars.charAt(0);
                        char c1 = dotChars.charAt(1);

                        if (c0 >= '\uD800' && c0 <= '\uDBFF' &&
                            c1 >= '\uDC00' && c1 <= '\uDFFF') {
                            delChars = 2;
                        }
                    }

                    doc.remove(dot - delChars, delChars);
                    beep = false;
                }
            } catch (BadLocationException bl) {
            }
        }
        if (beep) {
            UIManager.getLookAndFeel().provideErrorFeedback(target);
        }
    }
}

ビープ音が気に入らない場合は、独自のカスタム アクションを作成してビープ音を削除する必要があります。(つまり、エラー フィードバックを提供しないでください)。アクションをカスタマイズしたら、次を使用して単一のテキスト フィールドを変更できます。

textField.getActionMap().put(DefaultEditorKit.deletePrevCharAction, new MyDeletePrevCharAction());

または、次を使用してすべてのテキスト フィールドを変更できます。

ActionMap am = (ActionMap)UIManager.get("TextField.actionMap");
am.put(DefaultEditorKit.deletePrevCharAction, new MyDeletePrevCharAction());
于 2016-11-06T14:47:40.610 に答える