完整代码
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Example08 {
private static void createGUI() {
JFrame frame = new JFrame("Chat");
frame.setLayout(new BorderLayout());
frame.setSize(400,500);
frame.setLocation(300, 200);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setVerticalScrollBarPolicy
(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
JTextArea outArea = new JTextArea(20, 20);
outArea.setEditable(false);
scrollPane.setViewportView(outArea);
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));
JLabel label = new JLabel("message");
JTextField inField = new JTextField(20);
JButton sentButton = new JButton("sent");
panel.add(label);
panel.add(inField);
panel.add(sentButton);
frame.add(scrollPane, BorderLayout.CENTER);
frame.add(panel, BorderLayout.PAGE_END);
sentButton.addActionListener(e->{
String content = inField.getText();
if (content != null && !content.trim().equals("")) {
outArea.append("Me:" + content + "\n");
}
else {
outArea.append("Can not sent null !\n");
}
inField.setText("");
});
inField.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
String content = inField.getText();
char keyChar = e.getKeyChar();
if (keyChar == '\n' && content != null && !content.trim().equals("")) {
outArea.append("Me:" + content + "\n");
}
inField.setText("");
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(Example08::createGUI);
}
}
设计思路
选用JFrame作为顶级容器,使用的是BorderLayout布局
聊天信息界面是拥有竖向滚动条的JScrollPane,放在CENTER
文本域JTextArea以不可编辑状态添加到JScroollpane
信息输入界面是JPanel,放置在PAGE_END
标签JLabel,文本框JTextField,按钮JButton以FlowLayout的形式居中放在JPanel
JPane面板可以添加多个组件,但JScrollPane中只能添加一个组件
解决方案:将多个组件放在一个组件中再添加给JScrollPane
分部解析
JFrame
JFrame frame = new JFrame("Chat");//创建一个名为“Chat”的容器
frame.setLayout(new BorderLayout());//将其设置为BorderLayout布局
frame.setSize(400,500);//设置容器大小
frame.setLocation(300, 200);//设置容器在屏幕上出现的位置
frame.setVisible(true);//设置容器是否可见
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//默认关闭方式
JScrollPane
JScrollPane scrollPane = new JScrollPane();//创建滚动面板
scrollPane.setVerticalScrollBarPolicy
(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
//设置垂直导航条需要时才会出现
JTextArea outArea = new JTextArea(20, 20);//创建文本域
outArea.setEditable(false);//设置不可编辑
scrollPane.setViewportView(outArea);//让组件在JScrollPane中可见
JPanel
JPanel panel = new JPanel();//创建面板
panel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));
//设置组件布局方式为FlowLayout居中
JLabel label = new JLabel("message");//创建“message”标签框
JTextField inField = new JTextField(20);//创建最多输入20个字符的文本框
JButton sentButton = new JButton("sent");//创建“sent”按钮
panel.add(label);
panel.add(inField);
panel.add(sentButton);//添加到面板
关于的按钮动作事件
sentButton.addActionListener(e->{
String content = inField.getText();
if (content != null && !content.trim().equals("")) {
outArea.append("Me:" + content + "\n");
}
else {
outArea.append("Can not sent null !\n");
}
inField.setText("");
});
主要作用:当文本不为空时单击按钮可发送信息,否则进行提示
JAVA基础入门 P131 4.6 Lambda表达式
当需要将接口作为参数传递给方法,但接口只有一个抽象方法时可以使用
{参数列表} -> {表达式主体}
这里实现的有参接口是
public interface ActionListener extends EventListener {
/**
* Invoked when an action occurs.
* @param e the event to be processed
*/
public void actionPerformed(ActionEvent e);
}
关于文本框的键盘事件
inField.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
String content = inField.getText();
char keyChar = e.getKeyChar();
if (keyChar == '\n' && content != null && !content.trim().equals("")) {
outArea.append("Me:" + content + "\n");
}
inField.setText("");
}
});
主要作用:当在文本框键入回车时,发送信息
JAVA基础入门 P129 5.4匿名内部类
因为作为参数的接口具有多个抽象方法,所以不能使用Lambda表达式
在这里使用匿名内部类
fun(new 父接口() {匿名内部类体})
这里实现的接口是
public interface KeyListener extends EventListener {
/**
* Invoked when a key has been typed.
* See the class description for {@link KeyEvent} for a definition of
* a key typed event.
* @param e the event to be processed
*/
public void keyTyped(KeyEvent e);
/**
* Invoked when a key has been pressed.
* See the class description for {@link KeyEvent} for a definition of
* a key pressed event.
* @param e the event to be processed
*/
public void keyPressed(KeyEvent e);
/**
* Invoked when a key has been released.
* See the class description for {@link KeyEvent} for a definition of
* a key released event.
* @param e the event to be processed
*/
public void keyReleased(KeyEvent e);
}