#java #swing #awt #keylistener
Вопрос:
Я работаю над созданием приложения для чата с графическим интерфейсом на Java (я знаю, что это слишком амбициозно), которое просто отправляет сообщение в подключенную комнату. Я еще не занимался сетевыми вещами, но просто использовал графический интерфейс с голыми костями. У меня есть текстовое поле, в котором будет вводиться сообщение, и текстовая область, в которую будет отправлено отправленное сообщение с кнопкой для его отправки. Я хочу, чтобы при нажатии клавиши enter выполнялась задача отправки. Мой код таков
import javax.swing.*;
import java.awt.*;
public class Jabba {
//Class
public static void main(String args[]) {
//Main Method
//main frame
JFrame frame = new JFrame("Chat Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
//The Menu that will later allow us to connect and create rooms to join a chat
JMenuBar mb = new JMenuBar();
JMenu m1 = new JMenu("Connect");
JMenu m2 = new JMenu("Help");
//This is for help
mb.add(m1);
mb.add(m2);
JMenuItem m11 = new JMenuItem("Create new room");
JMenuItem m22 = new JMenuItem("Join an Existing Room");
m1.add(m11);
m1.add(m22);
//Our panel
JPanel panel = new JPanel();
JLabel label = new JLabel("Enter Text");
//The Message field
JTextField tf = new JTextField(15);
//The Sending button
JButton send = new JButton("Send");
//The resetting button
JButton reset = new JButton("Reset");
//Adding the panel
panel.add(label);
panel.add(tf);
panel.add(send);
panel.add(reset);
//The text area where the messages will go
JTextArea ta = new JTextArea();
//Adding it to the Scroll Pane so that It has scrolls
JScrollPane sp = new JScrollPane(ta);
//Actionlisteners allow us to listen to the actions that take place with
//The Specific components like here when the button is pressed
send.addActionListener(e ->{
//It will first store the text of the the text field in a
//variable called msg
String msg = tf.getText();
//Then Will remove the Text from the field so that new messages can be
//sent
tf.setText(null);
//Now it will send The message to the message text area
ta.append(msg "n");
});
reset.addActionListener(e ->{
//This is for the reset option
ta.setText(null);
//It will jus set all the text of the message area to null
//i.e. Nothing
}
);
//adds all the content and components to the main frame.
frame.getContentPane().add(BorderLayout.SOUTH, panel);
frame.getContentPane().add(BorderLayout.NORTH, mb);
/*notice the BorderLayout here, it is from the awt package and it
is letting us lay the components in a specific layout.
Also we have changed the component below after the center to sp
i.e. it is the scrollpane instead of our textarea to get the Scroll Bars!!*/
frame.getContentPane().add(BorderLayout.CENTER, sp);
frame.setVisible(true);
//Pretty Self-Explanatory
}
}
введите описание изображения здесь
Пожалуйста, помогите мне и простите, если я неправильно задал вопрос, так как я не совсем понял, как использовать классы KeyListener…## Заголовок ##
Комментарии:
1. Я бы рекомендовал прикрепить
ActionListener
его кJTextField
, возможно, используя экземпляр, которыйsend
использует кнопка. Дополнительные сведения см. в разделе Использование текстовых полей и Написание прослушивателя действий
Ответ №1:
Итак, как сказал мне Безумный программист и помог мне, я использовал Прослушиватель действий в этом текстовом поле и скопировал код, который я использовал для отправки сообщения, в прослушиватель действий для текстового поля var tf. Так что в псевдокоде это:
tf.addActionListener(e ->{
String msg = tf.getText();
tf.setText(null);
ta.append(msg "n");
});
Комментарии:
1. Создайте
Action
. Затем вы можете добавить один и тот же экземпляр действия в поле JTextField и в кнопку JButton. Для получения дополнительной информации прочитайте раздел из руководства Swing о том, как использовать действия . Или, если вы собираетесь использовать лямбда-код, вам следует создать метод, который может быть вызван из обоих компонентов, чтобы вы не повторяли код.