【JavaSwing仿微信电脑版本】左侧导航栏实现

介绍

Java有一些主流的GUI框架,包括AWT,Swing、JavaFX等。AWT功能比较简易,JavaFx上手比较麻烦,而Swing是Java提供的轻量级的GUI框架,使用简单,上手也比较容易。
Swing框架提供了各种各样的类,用于创建不同类型的GUI组件和应用程序,使用Swing库可以使用图片,文本,输入框,列表等。

前期内容:

【JavaSwing仿微信电脑版本】主界面实现

【JavaSwing仿微信电脑版本】主界面实现 - 掘金 (juejin.cn)

image.png

微信左侧导航栏

布局分析

左侧导航栏可以分为两个部分,一是上面头像和5个菜单选项,二是下面小程序等菜单选项栏。左侧菜单布局使用BoxLayout,把上面的子菜单栏设置为BoxLayout.NORTH,固定值左侧导航栏的上面位置;把下面的子菜单栏设置为BoxLayout.SOUTH固定至左侧导航栏的下面位置。

左侧导航栏还要设置它的背景颜色,我们可以根据微信的导航栏颜色设置左侧导航栏的背景色,导航栏颜色为16进制值:2E2E2E,RGB值:(46,46,46)。

  • 设置布局
// 设置左侧导航栏父布局为BorderLayout
setLayout(new BorderLayout(0, 40)); 
// 把上面菜单栏添加至左侧菜单栏布局中 
add(topPanel, BorderLayout.NORTH);
// 把下面菜单栏添加至左侧菜单栏布局中 
add(bottomPanel, BorderLayout.SOUTH);
  • 设置背景色
// 创建一个颜色
Color leftBarColor = new Color(46, 46, 46);
// 设置父布局容器的颜色
setBackground(leftBarColor);

左侧菜单栏布局排列效果:

上面菜单栏

上面菜单栏包含用户头像和5个菜单项,都是垂直排列的所以我们使用一个BoxLayout并把它设置为垂直排列

// 设置上面菜单栏的布局
topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS));
头像图片

头像图片放在左侧菜单栏最上方,在Swing中可以使用JLabel显示一张图片。

// 获取图片资源地址
String iconPath = Objects.requireNonNull(getClass().getResource("/img/img_tx1.png")).getPath();
// 创建一个图标对象
ImageIcon icon = new ImageIcon(iconPath);
// 创建一个显示图标的Label
JLabel imageLabel = new JLabel(icon);
// 设置图标距离
imageLabel.setBorder(BorderFactory.createEmptyBorder(30, 10, 15, 5));
// 把图标添加至容器中
topPanel.add(imageLabel);

添加头像图片效果:

5个子菜单

创建一个向布局添加图片的函数,以便我们方便代码编写。

 private void addImage(JPanel targetPanel, String iconName){
    iconName = "/img/"+iconName;
    String iconPath = Objects.requireNonNull(getClass().getResource(iconName)).getPath();
    ImageIcon icon = new ImageIcon(iconPath);
    JLabel imageLabel = new JLabel(icon);
    imageLabel.setBorder(BorderFactory.createEmptyBorder(2, 15, 15, 15));
    targetPanel.add(imageLabel);
}

使用addImage函数添加子菜单。addImage函数的第一个参数为目标容器,第二个参数为图片地址。addImage函数加载项目resources目录下img文件夹下的图片,所以使用时先把使用到的图片存放的正确的位置。

addImage(topPanel, "img_icon_chat_on.png");
addImage(topPanel, "img_icon_hy.png");
addImage(topPanel, "img_icon_sc.png");
addImage(topPanel, "img_icon_file.png");
addImage(topPanel, "img_icon_pq.png");

添加完头像和5个子菜单后的效果:

下面菜单栏

上面菜单栏包含3个菜单项,都是垂直排列的所以我们使用一个BoxLayout并把它设置为垂直排列

// 设置下面菜单栏的布局方式
bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.Y_AXIS));
添加菜单

下面菜单栏的添加操作和上面菜单栏的添加方式是一样的,所以我们可以使用上面写好的addImage函数来给下面菜单栏添加子菜单。

addImage(bottomPanel, "img_icon_micro.png");
addImage(bottomPanel, "img_icon_phone.png");
addImage(bottomPanel, "img_icon_menu.png");

效果

完整代码

package com.mumu.java.wechat_gui.ui;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.util.Objects;

import static com.mumu.java.wechat_gui.theme.LeftBarTheme.*;

/**
 * @Author: MuMu
 * @Date: 2024/4/9 10:38
 */
public class LeftBarPenal extends JPanel {
    private final JPanel topPanel = new JPanel();
    private final JPanel bottomPanel = new JPanel();
    public LeftBarPenal(){
        initLayout();
    }

    private void initLayout(){
        setLayout(new BorderLayout(0, 40));
        setBackground(Left_bar_color);
        add(topPanel, BorderLayout.NORTH);
        add(bottomPanel, BorderLayout.SOUTH);
        topMenu();
        bottomMenu();
    }

    private void topMenu(){
        topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS));
        topPanel.setBackground(Left_bar_color);

        // 添加头像
        String iconPath = Objects.requireNonNull(getClass().getResource("/img/img_tx1.png")).getPath();
        ImageIcon icon = new ImageIcon(iconPath);
        JLabel imageLabel = new JLabel(icon);
        imageLabel.setBorder(BorderFactory.createEmptyBorder(30, 10, 15, 10));
        topPanel.add(imageLabel);

        // 添加5个子菜单
        addImage(topPanel, "img_icon_chat_on.png");
        addImage(topPanel, "img_icon_hy.png");
        addImage(topPanel, "img_icon_sc.png");
        addImage(topPanel, "img_icon_file.png");
        addImage(topPanel, "img_icon_pq.png");
    }

    private void bottomMenu(){
        bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.Y_AXIS));
        bottomPanel.setBackground(Left_bar_color);


        addImage(bottomPanel, "img_icon_micro.png");
        addImage(bottomPanel, "img_icon_phone.png");
        addImage(bottomPanel, "img_icon_menu.png");
    }

    private void addImage(JPanel targetPanel, String iconName){
        iconName = "/img/"+iconName;
        String iconPath = Objects.requireNonNull(getClass().getResource(iconName)).getPath();
        ImageIcon icon = new ImageIcon(iconPath);
        JLabel imageLabel = new JLabel(icon);
        imageLabel.setBorder(BorderFactory.createEmptyBorder(2, 15, 15, 15));
        targetPanel.add(imageLabel);
    }
}
以下是一个简单的JavaSwing仿微信聊天的源代码示例: ``` import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Date; import java.text.SimpleDateFormat; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollBar; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.ScrollPaneConstants; import javax.swing.SwingConstants; import javax.swing.border.Border; public class ChatFrame extends JFrame implements ActionListener{ private static final long serialVersionUID = 1L; private JTextField textField; private JTextArea textArea; private JButton sendButton; private JPanel southPanel; private JPanel northPanel; private JScrollPane jScrollPane; private JScrollBar jScrollBar; public ChatFrame(){ initUI(); } private void initUI(){ setTitle("仿微信聊天"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(600, 800); setLocationRelativeTo(null); // north panel northPanel = new JPanel(new BorderLayout()); JLabel label = new JLabel("好友昵称"); label.setFont(new Font("微软雅黑", Font.BOLD, 16)); label.setHorizontalAlignment(SwingConstants.CENTER); northPanel.add(label, BorderLayout.CENTER); Border border = BorderFactory.createLineBorder(Color.LIGHT_GRAY); northPanel.setBorder(border); add(northPanel, BorderLayout.NORTH); // center panel textArea = new JTextArea(); textArea.setEditable(false); textArea.setLineWrap(true); textArea.setWrapStyleWord(true); textArea.setFont(new Font("微软雅黑", Font.PLAIN, 16)); jScrollPane = new JScrollPane(textArea); jScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); jScrollBar = jScrollPane.getVerticalScrollBar(); add(jScrollPane, BorderLayout.CENTER); // south panel southPanel = new JPanel(new BorderLayout()); southPanel.setPreferredSize(new Dimension(600, 100)); southPanel.setBackground(Color.WHITE); southPanel.setBorder(border); textField = new JTextField(); textField.setFont(new Font("微软雅黑", Font.PLAIN, 16)); sendButton = new JButton("发送"); sendButton.setFont(new Font("微软雅黑", Font.BOLD, 16)); sendButton.addActionListener(this); southPanel.add(textField, BorderLayout.CENTER); southPanel.add(sendButton, BorderLayout.EAST); add(southPanel, BorderLayout.SOUTH); } @Override public void actionPerformed(ActionEvent e) { if(e.getSource() == sendButton){ String content = textField.getText(); if(content.length() > 0){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateStr = sdf.format(new Date()); String text = "我 " + dateStr + "\n" + content + "\n\n"; textArea.append(text); textField.setText(""); jScrollBar.setValue(jScrollBar.getMaximum()); } } } public static void main(String[] args) { ChatFrame chatFrame = new ChatFrame(); chatFrame.setVisible(true); } } ``` 这个示例实现了一个简单的仿微信聊天界面,包括好友昵称、聊天记录和发送消息等功能。其中,northPanel和southPanel是上下两个面板,用来放置好友昵称和发送消息的文本框和按钮;textArea是一个文本区域,用来显示聊天记录;jScrollPane和jScrollBar是滚动面板和滚动条,用来实现聊天记录的滚动显示。在actionPerformed方法中,实现了发送消息的逻辑,将消息添加到聊天记录中,并且将滚动条滚动到最底部。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值