отключить звуковой сигнал в JFormattedTextField

Я хочу отключить звуковой сигнал в JFormattedTextField, но у меня есть некоторые ограничения.

  1. У меня есть доступ только к экземпляру JFormattedTextField. Я не могу создать новый подкласс

  2. Я не могу изменить настройки системы. Другой части программы может понадобиться звуковой сигнал


person user2628641    schedule 02.07.2014    source источник
comment
Вы пробовали второй ответ на этот вопрос? stackoverflow.com/questions/13427174/   -  person andriosr    schedule 02.07.2014


Ответы (2)


Я хочу отключить звуковой сигнал в JFormattedTextField,

Не очень конкретно. Для какого действия вы пытаетесь отключить звуковой сигнал? Например, я знаю, что в текстовом поле вы услышите звуковой сигнал, когда нажмете кнопку возврата, и вы уже находитесь в начале текстового поля.

В этом случае текстовый компонент использует привязки клавиш для выполнения действия. Таким образом, клавиша возврата вызывает действие «назад». См. раздел Привязки клавиш, чтобы программа перечислила все привязки клавиш.

Поэтому, если вы хотите отключить звуковой сигнал, вам нужно настроить действие. Ниже я скопировал (из DefaultEditorKit) действие, используемое для удаления символа в текстовом компоненте. Я сделал пару изменений, чтобы отключить звуковой сигнал:

static class MyDeletePrevCharAction extends TextAction {

    /**
     * Creates this object with the appropriate identifier.
     */
    MyDeletePrevCharAction() {
       //super(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);
            System.out.println("beep");
        }
    }
}

Вы можете использовать это действие для определенного текстового компонента, используя:

textField.getActionMap()
    .put(DefaultEditorKit.deletePrevCharAction, new MyDeletePrevCharAction());
person camickr    schedule 02.07.2014
comment
Я хочу отключить звуковой сигнал для неверного ввода (в основном) и любых других действий, которые могут вызвать звуковой сигнал. Если я пойду по вашему пути, нужно ли мне выполнять действие для каждого неверного ввода? будет много кода... - person user2628641; 02.07.2014
comment
@user2628641 user2628641 I want to disable the beep for invalid input(mainly) - Думаю, вам нужно взглянуть на файл DefaultEditorKit.InsertContentAction. Я не знаю, какие другие действия вам могут понадобиться переопределить. - person camickr; 02.07.2014

Вы должны иметь возможность отключить его, используя то же решение, предложенное в этой проблеме: Отключить звуковой сигнал при нажатии клавиши Backspace в пустом поле JTextField

JTextField field = new JTextField();
Action action = field.getActionMap().get(DefaultEditorKit.beepAction);
action.setEnabled(false);

Несмотря на то, что цель события другая, действие beed полностью отключено для целевого объекта.

person andriosr    schedule 02.07.2014