Изменение текстового поля для отображения только прописных и строчных букв - PullRequest
0 голосов
/ 02 февраля 2019

Я хочу, чтобы первая буква в текстовом поле была заглавной, а когда пользователь нажимал «ПРОБЕЛ», первая буква снова была заглавной.Мне очень жаль задавать много вопросов, но это мой первый месяц в программировании, а также в Java.

Моя функция для текстового поля:

private void userNameTextFieldPressed(final java.awt.event.KeyEvent event) {
int key = event.getKeyChar();
if (Character.isAlphabetic(event.getKeyChar())) {
        || (key >= event.VK_A && key <= event.VK_Z)
        || key == event.VK_BACK_SPACE) {
    this.userNameTextField.setEditable(true);
    this.userNameTextField.setBackground(Color.GREEN);
} else {
    this.userNameTextField.setEditable(false);
    this.userNameTextField.setBackground(Color.RED);
 }
}    
}

1 Ответ

0 голосов
/ 02 февраля 2019

Не

Используйте KeyLisyener для текстовых компонентов, это не подходящий механизм по ряду причин

Делайте

Используйте DocumentFilter дляизмените текст до его применения к физическому Document

См. Реализация фильтра документов для получения более подробной информации

В качестве (очень быстрого и простого) примера ...

public class PropercaseDocumentFilter extends DocumentFilter {

    @Override
    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
        text = modify(fb, offset, text, attrs);
        super.replace(fb, offset, length, text, attrs);
    }

    protected String modify(FilterBypass fb, int offset, String text, AttributeSet attrs) throws BadLocationException {
        if (text.length() > 0) {
            Document doc = fb.getDocument();
            StringBuilder sb = new StringBuilder(text);
            if (doc.getLength() == 0) {
                sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
            } else if (offset > 0 && offset < doc.getLength()) {
                if (doc.getText(offset - 1, 1).equals(" ")) {
                    sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
                }
            } else if (doc.getText(doc.getLength() - 1, 1).equals(" ")) {
                sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
            }
            text = sb.toString();
        }
        return text;
    }

}

Чего не делает этот пример, так это изменения текста, который вставляется (кроме первого символа), вам нужно подумать о том, как вы хотите, чтобы с этим справились, и внести соответствующие изменения

И поскольку я знаю, никто не читает документацию или учебные пособия ...

import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.DocumentFilter;

public class JavaApplication100 {

    public static void main(String[] args) {
        new JavaApplication100();
    }

    public JavaApplication100() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            setBorder(new EmptyBorder(10, 10, 10, 10));
            JTextField field = new JTextField(10);
            ((AbstractDocument)field.getDocument()).setDocumentFilter(new PropercaseDocumentFilter());
            add(field);
        }

    }

    public class PropercaseDocumentFilter extends DocumentFilter {

        @Override
        public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
            text = modify(fb, offset, text, attrs);
            super.replace(fb, offset, length, text, attrs);
        }

        protected String modify(FilterBypass fb, int offset, String text, AttributeSet attrs) throws BadLocationException {
            if (text.length() > 0) {
                Document doc = fb.getDocument();
                StringBuilder sb = new StringBuilder(text);
                if (doc.getLength() == 0) {
                    sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
                } else if (offset > 0 && offset < doc.getLength()) {
                    if (doc.getText(offset - 1, 1).equals(" ")) {
                        sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
                    }
                } else if (doc.getText(doc.getLength() - 1, 1).equals(" ")) {
                    sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
                }
                text = sb.toString();
            }
            return text;
        }

    }

}
...