[英]JTextArea new line on shift + enter
我已經在我的JTextArea字段中添加了一個keylistener,但它的行為並不像我預期的那樣。
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("");
}
}
}
}
}
});
我想要這樣: - 如果按下返回按鈕並且shift已關閉:添加一個新行。 - 如果按下返回按鈕且移位按鈕未關閉:沒有換行,但提交。
現在它的行為如下: - 如果我點擊返回按鈕並且班次下降:沒有添加任何行。 什么都沒發生。 - 如果我點擊返回按鈕並且班次沒有下降:提交,但是如果我再次開始輸入,則從新行開始。
有人知道怎么做我想要的嗎?
編輯:
我嘗試了一些其他代碼來檢測shift按鈕是否關閉:
if((k.getModifiersEx() == KeyEvent.SHIFT_DOWN_MASK) ||
(k.getModifiers() == KeyEvent.SHIFT_DOWN_MASK)) {
這不起作用
您可以使用JTextArea
的InputMap
和ActionMap
將鍵擊映射到操作:
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
。
嘗試使用keyTyped而不是keyPressed。 我相信keyPressed為你提供了一個移位和輸入的事件,而keyTyped為你提供了一個帶有修飾符的組合事件。
不要在接收事件時立即執行操作,而是通過使用SwingUtilities.invokeLater()發布它們來對它們進行排序。 代碼應如下所示:
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
}
});
}
在我看來,這里看到的問題是因為應用程序定義的操作和內部操作沒有正確排序,導致在修改文本之前重新發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.