2010-01-29 60 views
7

我已經添加了一個keylistener到我的JTextArea字段,但它不像我預期的那樣工作。JTextArea換行新行+輸入

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)) { 

這並不工作,以及

回答

21

您可以使用JTextAreaInputMapActionMap的擊鍵映射到操作:

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

+0

謝謝!這是我需要的解決方案! – dododedodonl 2010-01-29 21:48:28

+0

+1爲我在網上找到的最不起眼的答案+1。 – sethro 2012-11-16 20:54:43

1

嘗試使用和的keyTyped沒有在keyPressed。我相信keyPressed爲你提供了一個換班和輸入的事件,而keyTyped給你一個帶修飾符的組合事件。

+0

這並不能解決我的問題。它們是相同的。 – dododedodonl 2010-01-29 13:56:27

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 
     } 
    }); 

} 

在我看來,這裏看到的問題是由於應用程序定義的操作和內部操作不被正確排序,從而導致重新繪製文本已經被修改之前發生的事情。

+0

我試過這個。我保持相同的結果。 現在我看到JTextArea在JScrollPane中。這可以產生效果嗎? – dododedodonl 2010-01-29 14:29:42