Не редактируемое jTextField издает ошибку при нажатии клавиши удаления, как это исправить? - PullRequest
2 голосов
/ 06 июля 2019

Я делаю калькулятор в java, чтобы сделать легко, и не помещаю фильтр документа в поле jtext. Я решил сделать jtextfield недоступным для редактирования и добавить ключевой слушатель, но когда вы нажимаете кнопку de delete, звучит ошибка.

Я пошел, чтобы изменить звуки системы в конфигурации, я изменил звуки системы, и я обнаружил, что звук, который он делает "с предопределенным звуком", и делает звук "Windows Background". Я могу изменить свой выбор и не слушать звук, но я хочу, чтобы эта игра загружалась в Интернете.

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

public Example() {
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setBounds(0, 0,250,200);
        setLayout(null);
        javax.swing.JTextField jTextField1 = new javax.swing.JTextField();
        jTextField1.setEditable(false);
        jTextField1.setBounds(30,50,180,60);
        add(jTextField1);
    }
    public static void main(String args[]) {
        Example a = new Example();
        a.setVisible(true);
    }
}

В этом коде текстовое поле не было редактируемым, в следующем коде текстовое поле не будет издавать звук:

    public Example() {
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setBounds(0, 0,250,200);
        setLayout(null);
        javax.swing.JTextField jTextField1 = new javax.swing.JTextField();
        jTextField1.setEditable(true);
        jTextField1.setBounds(30,50,180,60);
        add(jTextField1);
    }
    public static void main(String args[]) {
        Example a = new Example();
        a.setVisible(true);
    }
}

Это потому, что текстовое поле доступно для редактирования.

Буду признателен, если вы поможете мне, подскажете, как это исправить или как изменить системный звук в коде, или что вы думаете, может помочь мне.

1 Ответ

0 голосов
/ 06 июля 2019

Звук, который вы получаете от нажатия клавиши del, будет звучать, даже если JTextField является редактируемым и зависит от ОС в ответ на нажатие клавиши.Обходным путем является предотвращение регистрации клавиши del, что она была нажата, и способ сделать это состоит в том, чтобы использовать привязки клавиш, чтобы клавиша del не вызывала ответа в графическом пользовательском интерфейсе - в ответ делалось действие без действий.нажатие клавиши del, когда текстовое поле имеет фокус.Например:

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class Example extends JFrame {
    public Example() {
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        // setBounds(0, 0,250,200);
        // setLayout(null);

        JPanel panel = new JPanel();
        int gap = 40;
        panel.setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));

        JTextField jTextField1 = new JTextField(20);
        jTextField1.setEditable(false);
        panel.add(jTextField1);

        // get input and action maps to do key binding
        InputMap inputMap = jTextField1.getInputMap(JComponent.WHEN_FOCUSED);
        ActionMap actionMap = jTextField1.getActionMap();

        // the key stroke that we want to change bindings on: delete key
        KeyStroke delKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0);

        // tell the input map to map the key stroke to a String of our choosing
        inputMap.put(delKeyStroke, delKeyStroke.toString());

        // map this same key String to an action that does **nothing**
        actionMap.put(delKeyStroke.toString(), new AbstractAction() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // do nothing
            }
        });

        add(panel);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(() -> {
            Example example = new Example();
            example.pack();
            example.setLocationRelativeTo(null);
            example.setVisible(true);
        });
    }
}

Рекомендации по применению:

  • Избегайте использования KeyListeners с текстовыми компонентами, так как это может привести к нежелательному и нестандартному поведению.Вместо этого используйте DocumentListeners и DocumentFilters.
  • Избегайте установки границ текстовых компонентов, так как это также приведет к нежелательному и нестандартному поведению, особенно с JTextAreas, которые не показывают полосы прокрутки, когда они размещены в JScrollPanes.Вместо этого установите свойства текстового компонента, такие как столбец и свойства шрифта.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...