Новая строка JTextArea на сдвиге + входит

Я добавил keylistener к своему полю 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("");
     }
    }
   }
  }
 }
});

Я хочу это: - если кнопка возврата нажата и сдвиг снижается: добавьте новую строку. - Если кнопка возврата нажата и кнопка сдвига не снижается: никакая новая строка, но отправляют.

Теперь это ведет себя как это: - если я нажал кнопку возврата и сдвиг, снижается: никакая строка не добавляется. Ничего не происходит. - Если я нажал кнопку возврата и сдвиг, не снижается: отправленный, но если я начинаю вводить снова, это начинается на новой строке.

Кто-то знает, как сделать то, что я хочу?

Править:

Я попробовал некоторый другой код, чтобы обнаружить, если кнопка сдвига снижается:

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

Это не работает также

7
задан dododedodonl 29 January 2010 в 14:15
поделиться

3 ответа

Вы можете использовать InputMap и 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 - «вставить-разрыв» - используется для shift ENTER .

21
ответ дан 6 December 2019 в 08:14
поделиться

Вместо того, чтобы выполнять действия немедленно при получении события, последовательность их напустя, опубликовав их с использованием ракуритов. Код должен выглядеть как:

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
ответ дан 6 December 2019 в 08:14
поделиться

Попробуйте использовать CooktyPed и не сжать. Я Velive KeyWressed дает вам событие для смещения и для ввода, тогда как Cooktyped дает вам одно комбинированное событие с модификатором.

1
ответ дан 6 December 2019 в 08:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: