我已经在我的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已关闭:添加一个新行。 - 如果点击了返回按钮且移位按钮未关闭:没有换行,但提交。
现在它的行为如下: - 如果我点击返回按钮并且班次下降:没有添加任何行。什么都没发生。 - 如果我点击返回按钮并且班次没有停止:提交,但如果我再次开始输入,则从新行开始。
有人知道如何做我想做的事吗?
编辑:
我尝试了一些其他代码来检测班次按钮是否已关闭:
if((k.getModifiersEx() == KeyEvent.SHIFT_DOWN_MASK) ||
(k.getModifiers() == KeyEvent.SHIFT_DOWN_MASK)) {
这不起作用
答案 0 :(得分:21)
您可以使用InputMap
的{{1}}和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
。
答案 1 :(得分:1)
尝试使用keyTyped而不是keyPressed。我相信keyPressed会给你一个转移和输入的事件,而keyTyped会给你一个带有修饰符的组合事件。
答案 2 :(得分:0)
不是在接收事件时立即执行操作,而是通过使用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
}
});
}
在我看来,这里看到的问题是因为应用程序定义的操作和内部操作没有正确排序,导致在修改文本之前重新发生。