JTextArea neue Zeile über Umschalt + EINGABETASTE
Habe ich einen keylistener auf meinem JTextArea Feld, aber es benimmt sich nicht wie ich erwartet hatte.
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("");
}
}
}
}
}
});
Möchte ich dieses:
- Wenn die return-Taste wird geschlagen und shift down ist: füge eine neue Zeile ein.
- Wenn Sie die zurück-Taste getroffen wird und die shift-Taste ist nicht down: keine neue Linie, sondern senden.
Nun verhält es sich so:
- Wenn ich auf die return-Taste und shift down ist: keine Zeile Hinzugefügt. Nichts passiert.
- Wenn ich drücken Sie die zurück-Taste und die Umschalttaste ist nicht down: eingereicht, aber wenn ich mit der Eingabe beginnen wieder, es beginnt auf neuer Zeile.
Weiss einer wie das zu tun, was ich will?
EDIT:
Ich versuchte einige andere code, um festzustellen, ob die shift-Taste gedrückt ist:
if((k.getModifiersEx() == KeyEvent.SHIFT_DOWN_MASK) ||
(k.getModifiers() == KeyEvent.SHIFT_DOWN_MASK)) {
Diese funktioniert nicht so gut
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die
InputMap
undActionMap
desJTextArea
Zuordnung der Tastenkombinationen zu Aktionen:Die ursprüngliche Aktion für
ENTER
- "insert-break" - ist für dieshift ENTER
.Versuchen Sie es mit keyTyped und nicht keyPressed. Ich glaube, keyPressed gibt Sie ein Ereignis für die Umschalt-und die EINGABETASTE, während keyTyped gibt Ihnen eine kombinierte Veranstaltung mit einem modifier.
Tun, anstatt die Aktionen sofort nach Erhalt der Ereignis-Sequenz für später, indem wir Sie mit SwingUtilities.invokeLater(). Der code sollte wie folgt Aussehen:
Meiner Meinung nach, die Probleme, die hier zu sehen sind, weil die Anwendung definierten Maßnahmen und interne Maßnahmen, die nicht ordnungsgemäß sequenziert, was zu repaints passiert, bevor der text geändert wurde.