Я работаю над JTextPane
, который работает (почти) точно так же, как поле ввода тегов здесь, в stackoverflow. Для этого я преобразовываю текст в компоненты, как только пользователь нажимает ввод, табуляцию или пробел. Естественно, я не хочу, чтобы какой-либо из этих символов вводился в текстовую панель. Я нашел это решение, SSCCE:
import java.awt.Color;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextPane;
import javax.swing.KeyStroke;
import javax.swing.text.BadLocationException;
import javax.swing.text.Element;
import javax.swing.text.StyledDocument;
@SuppressWarnings("serial")
public class TagTextPane extends JTextPane {
public TagTextPane() {
this.getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "finalizeTag");
this.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "finalizeTag");
this.getInputMap().put(KeyStroke.getKeyStroke("TAB"), "focusNext");
this.getActionMap().put("focusNext", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent arg0) {
finalizeTag();
transferFocus();
}
});
this.getActionMap().put("finalizeTag", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
finalizeTag();
}
});
}
private void finalizeTag() {
StyledDocument doc = (StyledDocument) getDocument();
Element element = doc.getCharacterElement(getCaretPosition() - 1);
int start = element.getStartOffset();
int len = element.getEndOffset() - start;
String tag = "";
try {
tag = this.getDocument().getText(start, len);
} catch (BadLocationException e) {
}
this.setSelectionStart(start);
this.setSelectionEnd(start + len);
JLabel label = new JLabel(tag);
label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
this.insertComponent(label);
}
public static void main(String[] args) {
JFrame frame = new JFrame("TagTextPaneTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TagTextPane tPane = new TagTextPane();
frame.setSize(400, 100);
frame.getContentPane().add(tPane);
frame.setVisible(true);
}
}
Нажатие «tab» обычно приводит к вставке символа табуляции, а нажатие «enter» обычно приводит к вводу разрыва строки, а нажатие «space» приводит к вводу пробела. Странно то, что мой код предотвращает ввод разрывов строк и табуляции, но все же позволяет вводить пробелы в обычном режиме при выполнении предполагаемого действия.
Почему этот подход ведет себя по-разному для этих ключей?
Как я могу остановить ввод пробела? (Возможно, позже я захочу распространить это поведение на запятые и тому подобное.)
Как я могу оптимально контролировать поведение определенных символов и нажатий клавиш в
JTextComponent
? Я видел это, где предлагается использоватьKeyListener
, но я также видел это, где Роб Камик указывает, почему не следует использоватьKeyListener
. Так мне лучше использоватьDocumentFilter
, или это разбить бабочку на колесе?Это даже лучший способ создать такое поле ввода тега?
SPACE
была привязка. Может быть, использоватьDocumentListener
? - person trashgod   schedule 03.04.2013