Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTextArea换班新线路&x2B;进入_Java_Jtextarea - Fatal编程技术网

Java JTextArea换班新线路&x2B;进入

Java JTextArea换班新线路&x2B;进入,java,jtextarea,Java,Jtextarea,我已经在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_ENTE

我已经在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没有关闭:submitted,但如果我再次开始键入,它将从新行开始

有人知道怎么做我想做的吗

编辑:

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

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

这也不起作用

请尝试使用键盘输入而不是按键。I beleive keyPressed为shift和enter提供了一个事件,而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
      }
   });

}

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

您可以使用
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
-“insert break”的原始操作用于
shift-ENTER

我尝试了这个操作。我保持同样的结果。现在我看到JTextArea在一个JScrollPane中。这会有影响吗?