【JAVA】【GUI】【小结】制作聊天窗口

完整代码

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

样例

在这里插入图片描述

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值