#java #swing #jtextarea #keylistener
#java #качать #jtextarea #keylistener
Вопрос:
У меня небольшая, но досадная проблема. Я использую JTextArea для захвата ввода с помощью KeyListener — он просто захватывает ввод после нажатия кнопки возврата. Проблема в том, что когда я очищаю текст, курсор остается на второй строке, что раздражает.
Вот код:
@SuppressWarnings ("serial")
public class ProgramEditor extends JTextArea implements KeyListener {
//FIELDS
String command = "";
//CONSTRUCTOR
public ProgramEditor() {
super();
this.setBorder(BorderFactory.createLineBorder(Color.BLACK));
this.setLineWrap(true);
addKeyListener(this);
this.requestFocus();
}
@Override
public void keyPressed(KeyEvent e) {
int i = e.getExtendedKeyCode();
if (i == 10){
command = this.getText();
this.setText(null);
}
}
}
Комментарии:
1. Потому что я беру больше, чем ввод одной строки.
2.
this.requestFocus(true);
Я почти уверен, что это устарело, и если это так, ваш компилятор будет выдавать предупреждения. Не игнорируйте предупреждения компилятора, исправьте их! Кроме того, часть приведенного выше (плохо отформатированного) кода не нужна, а большая часть остального — плохой дизайн или просто плохое кодирование. Если вы получили этот пример с сайта, никогда больше не посещайте этот сайт. Это учит вас ужасным привычкам.3. Возможно, вы могли бы показать мне, как это должно быть сделано? Это может быть более полезным, чем просто уничтожение моей работы?
4. 1) Используйте
DocumentListener
вместоKeyListener
. 2) Было бы лучше иметь фабричный метод для создания таких текстовых областей, чем путем расширения компонента. 3)this.setFocusable(true);
бессмысленно, учитывая, что это значение по умолчанию. 4) ВызовrequestFocus()
завершится ошибкой. (Если он сфокусирован в вашем приложении., это потому, что это первый фокусируемый компонент). 5)requestFocus(true);
должно бытьrequestInWindowFocus(true);
. 6)if (i == 10){
Не используйте магические числа, для ключей определены константы. 7)setText(null);
уже было рассмотрено в ответе. — Но это не проверка кода.5. Я полагаю, вы пытаетесь быть полезными так… спасибо, я думаю…
Ответ №1:
Swing использует привязки клавиш для обработки событий. Для JTextArea клавиша ввода обрабатывается привязкой клавиш, которая вставляет строку перевода строки в текстовую область. Итак, этот код выполняется ПОСЛЕ вашего кода, нажатого клавишей.
Правильное решение — заменить действие по умолчанию для клавиши Ввода вашим собственным пользовательским действием. Прочитайте раздел из Swing tutorial о привязках клавиш для получения дополнительной информации и примеров.
Вопрос в том, почему вы используете JTextArea в пользователь никогда не может ввести символ новой строки? Более простым решением было бы просто использовать JTextField. Затем вы можете добавить ActionListener в текстовое поле для обработки клавиши ввода.
Наконец, худшим решением было бы попробовать обработать метод keyReleased() . Затем должно было быть выполнено действие по умолчанию для клавиши ввода текстовой области.
Комментарии:
1. Я использую область JText с переносом текста, потому что длина команды может быть очень длинной и часто не помещается в одну строку, и пользователь должен иметь возможность просматривать текст. По сути, это макропрограммист для небольшой программы-аниматора, которую я разработал … в противном случае я бы использовал текстовое поле — не так ли?
2. Я имею в виду, что я думал об использовании JButton вместо клавиши возврата для получения введенного текста — но тогда, если кто-то когда-либо нажмет кнопку возврата, тогда было бы невозможно когда-либо снова очистить текстовую область — что просто кажется сумасшедшим. Я прочитаю раздел о привязках и посмотрю, смогу ли я найти решение. Спасибо.
Ответ №2:
Попробуйте setCaretPosition(int)
метод в JTextArea, в частности, сделать keyPressed
в
@Override
public void keyPressed(KeyEvent e) {
int i = e.getExtendedKeyCode();
if (i == 10){
command = this.getText();
this.setText(""); //I'd use "" over null; it just seems more proper to keep a string even if there's no difference
this.setCaretPosition(0);
}
}
Проверьте это: http://docs.oracle.com/javase/7/docs/api/javax/swing/text/JTextComponent.html#setCaretPosition (int)
Комментарии:
1. Это не работает, я не знаю почему… но это было первое, что я попробовал. Я тоже пробовал это.setCaratPosition(1) — это помещает карат в правильное положение, но оно вызывает исключение во время выполнения…
Ответ №3:
Попробуйте использовать это:
this.setCaretPosition(0);