JTextArea после нажатия клавиши ввода

Я создаю чат для java, используя сокеты. Моя проблема в том, что в кадре для пользователя, когда я впервые нажимаю Enter, курсор переходит к следующей строке, и все после этого мне приходится нажимать клавишу Backspace, потому что в противном случае с предложением, которое я написал, отправляется пустое предложение. Я использую KeyListener для нажатия клавиши ввода и ввожу следующий код в функцию keyPressed.

    if(arg0.getKeyCode()==10)
    {
        System.out.println("Bika sto enter\n");
        String toserver = ClientText.text2.getText();

        try {
            if(toserver.equals("close it")) {
                ClientText.clientSocket.close(); 
            }



            ClientText.text2.moveCaretPosition(ClientText.text2.getSelectionStart());
            ClientText.text2.setCaretPosition(0);
            ClientText.text2.setText("");
            ClientText.outToServer.writeBytes(toserver+'\n');
            //ClientText.outToServer.writeUTF(toserver+'\n');
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

Дело в том, что это работает только после первого использования чата. Например, я что-то отправил, и курсор переходит на следующую строку, если я нажму Enter. Затем, если я что-то напишу и нажму Enter, курсор перейдет к началу второй строки! Поэтому есть пустая первая строка, которую я должен стирать каждый раз, когда есть какая-либо помощь в этом? Спасибо


person MikEKOU    schedule 06.08.2013    source источник
comment
stackoverflow.com/a/2162974/1428683 Я нашел ответ в этом посте после небольшого исследования.   -  person MikEKOU    schedule 06.08.2013
comment
Почему бы не опубликовать соответствующую часть этого ответа и предоставить свой собственный ответ и отметить его правильно, что будет хорошей идеей, так как это также поможет будущим посетителям (хотя не удаляйте эту ссылку из этого ответа, таким образом, это ссылка останется активной в правой части этой страницы в категории Связанные). В противном случае вы можете удалить этот пост, что, на мой взгляд, сейчас не очень хорошо :-)   -  person nIcE cOw    schedule 06.08.2013
comment
Я предлагаю также посмотреть объявление о каком-то протоколе чата. Попробуйте этот tools.ietf.org /html/rfc1459.html   -  person Gianmarco    schedule 23.08.2013


Ответы (1)


Я точно не знаю, как выглядит ваш графический интерфейс, но я бы использовал javax.swing.JTextField вместо JTextArea. Если вы хотите использовать JTextArea (например, чтобы разрешить многострочные сообщения), и вы не можете заставить работать часть ввода для отправки, я бы прибегнул к использованию KeyListener в качестве ввода ключа, как обычный компьютер ( если все остальное терпит неудачу).

Это то, что я имею в виду:

import java.awt.event.*;
import javax.swing.JTextArea; //or JTextField
public class KeyInput implements KeyListener{
    private JTextArea ta; //or JTextField
    public KeyInput(JTextArea ta){ //or JTextField
        this.ta = ta;
    }

    public void keyPressed(KeyEvent e){
        if(e.getKeyCode() == KeyEvent.VK_ENTER){
            //code to send message goes here
        }else{
            ta.append("\n"+e.getKeyChar());
        }
    }
//keyReleased(KeyEvent) and keyTyped(KeyEvent) methods go here, need no content
}

Помните, если вы используете JTextArea, обязательно поместите его в JScrollPane.
ВАЖНО: в своем клиентском классе убедитесь, что вы добавили ta.setEditable(false), в котором ta является именем переменной вашего JTextArea ( опять же, можно заменить JTextField, и в этом случае вам не нужен JScrollPane).

Надеюсь это поможет.

person Arc676    schedule 27.09.2013
comment
Я, вероятно, должен был спросить раньше, но может ли кто-нибудь объяснить голосование за и почти мгновенное последующее отрицание? - person Arc676; 08.10.2013