8

我在我的 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 按钮:没有新行,但提交。

现在它的行为是这样的: - 如果我按下返回按钮并且 shift 是向下的:没有添加任何行。没发生什么事。- 如果我按下返回按钮并且 shift 未按下:已提交,但如果我再次开始输入,它将从新行开始。

有人知道如何做我想做的事吗?

编辑:

我尝试了一些其他代码来检测换档按钮是否按下:

                    if((k.getModifiersEx() == KeyEvent.SHIFT_DOWN_MASK) || 
                            (k.getModifiers() == KeyEvent.SHIFT_DOWN_MASK)) {

这也不起作用

4

3 回答 3

22

您可以使用InputMapActionMapJTextArea击键映射到动作:

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.

于 2010-01-29T15:36:28.157 回答
1

尝试使用 keyTyped 而不是 keyPressed。我相信 keyPressed 给你一个 shift 和 enter 事件,而 keyTyped 给你一个带有修饰符的组合事件。

于 2010-01-29T13:43:13.063 回答
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
      }
   });

}

在我看来,这里看到的问题是因为应用程序定义的操作和内部操作没有正确排序,导致在修改文本之前发生重绘。

于 2010-01-29T14:17:08.943 回答