Я добавил keylistener к своему полю JTextArea, но оно не ведет себя, как я ожидал.
inputTextArea.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent k) {
//If the return button is hit, only set to a new line if shift is also down.
if(k.getKeyChar() == KeyEvent.VK_ENTER) {
if(k.isShiftDown()) {
inputTextArea.append(" \n");
} else {
//Send The Message...
boolean cleanTextField = false;
try {
sendMessage(inputTextArea.getText());
cleanTextField = true;
msgScrollPane.setAutoscrolls(true);
JScrollBar vbar = msgScrollPane.getVerticalScrollBar();
if ((vbar.getValue() + vbar.getVisibleAmount()) == vbar.getMaximum()) {
msgPane.setCaretPosition(msgDoc.getLength());
}
} catch (Exception ex) {
ex.printStackTrace();
cleanTextField = false;
} finally {
if(cleanTextField) {
inputTextArea.setText("");
}
}
}
}
}
});
Я хочу это: - если кнопка возврата нажата и сдвиг снижается: добавьте новую строку. - Если кнопка возврата нажата и кнопка сдвига не снижается: никакая новая строка, но отправляют.
Теперь это ведет себя как это: - если я нажал кнопку возврата и сдвиг, снижается: никакая строка не добавляется. Ничего не происходит. - Если я нажал кнопку возврата и сдвиг, не снижается: отправленный, но если я начинаю вводить снова, это начинается на новой строке.
Кто-то знает, как сделать то, что я хочу?
Править:
Я попробовал некоторый другой код, чтобы обнаружить, если кнопка сдвига снижается:
if((k.getModifiersEx() == KeyEvent.SHIFT_DOWN_MASK) ||
(k.getModifiers() == KeyEvent.SHIFT_DOWN_MASK)) {
Это не работает также
Вы можете использовать InputMap
и ActionMap
из JTextArea
] для сопоставления нажатий клавиш с действиями:
private static final String TEXT_SUBMIT = "text-submit";
private static final String INSERT_BREAK = "insert-break";
...
private void initialize() {
InputMap input = inputTextArea.getInputMap();
KeyStroke enter = KeyStroke.getKeyStroke("ENTER");
KeyStroke shiftEnter = KeyStroke.getKeyStroke("shift ENTER");
input.put(shiftEnter, INSERT_BREAK); // input.get(enter)) = "insert-break"
input.put(enter, TEXT_SUBMIT);
ActionMap actions = inputTextArea.getActionMap();
actions.put(TEXT_SUBMIT, new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
submitText();
}
});
}
...
private void submitText() {
// TODO
}
Исходное действие для ENTER
- «вставить-разрыв» - используется для shift ENTER
.
Вместо того, чтобы выполнять действия немедленно при получении события, последовательность их напустя, опубликовав их с использованием ракуритов. Код должен выглядеть как:
if(k.isShiftDown()) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
inputTextArea.append(" \n");
}
});
} else {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
//rest of the else body here
}
});
}
На мой взгляд, проблемы, видимые здесь, являются потому, что определенные приложениями действиями и внутренние действия не являются правильно секвенированы, что приведет к перерасходованию, прежде чем текст был изменен.
Попробуйте использовать CooktyPed и не сжать. Я Velive KeyWressed дает вам событие для смещения и для ввода, тогда как Cooktyped дает вам одно комбинированное событие с модификатором.