Ограниченный выбор в JTextField / JTextComponent?

Рассмотрим JFormattedTextField (или любой JTextComponent, действительно), в котором есть префикс и суффикс, отображаемый вокруг того, что является фактическим «текстом» поля.

Например, двойной 3.5 будет String (через форматирование) «3.50», вокруг которого будет префикс «$» и суффикс «», для текста дисплея «3,50».

Ясно, что это просто сделать. Тем не менее, пользователю по-прежнему разрешено выбирать текст в префиксе / суффиксе, поэтому они могут, возможно, удалить часть или весь префикс / суффикс. Я бы предпочел, чтобы пользователь был ограничен таким, чтобы префикс / суффикс не мог быть выбран вообще (пока все еще часть текстового поля, поэтому нет JLabels). Я могу почти выполнить это с помощью CaretListener (или переопределив setCaretPosition / moveCaretPosition), который не позволяет Ca выбрать все поле и не позволяет клавишам со стрелками перемещаться в префикс / суффикс. Тем не менее, клавиши перетаскивания мышью и клавиши со стрелкой-стрелкой все еще позволяют перемещению в эти ограниченные области.

Есть идеи?

Для этого вы можете использовать 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. Поэтому я не уверен, что вы можете использовать это с форматированным текстовым полем, так как это может заменить поведение по умолчанию.

  • Усечение длинных строк с помощью CSS: возможно?
  • Java отрицательный int для шестнадцатеричного и обратного сбоев
  • Чтобы нарисовать подчеркивание под TextView в Android
  • Форматирование текста в ярлыке WinForm
  • Тайм-аут в async / wait
  • Сортировка текстового файла по длине строки, включая пробелы
  • Как добавить разрыв строки в Android TextView?
  • Как эффективно анализировать CSV-файл в Perl?
  • Подчеркивание текста в UIButton
  • Обосновать последнюю строку div?
  • Как читать и анализировать CSV-файлы на C ++?
  • Давайте будем гением компьютера.