`

SWING实现类似微信的泡泡聊天界面

阅读更多

        前段时间由于工作的同时学习Android,好长一段时间没有关注博客了,今天回归到博客。废话不多说下面开始今天的主题“类似微信的泡泡聊天界面如何实现”。如果用过微信的朋友,对下图已经非常熟悉了:



 在Android中做出这样的界面很简单,一个ListView + BaseAdapter + 几张图片。那在Swing中如何来实现同样的界面呢?各位对Swing有兴趣的朋友可以想想,我这里提供一种思路: JTable + TableCellRenderer + TableModel + 几张图片。其中实现TableCellRenderer是关键。下面先上一张截图:


 下面是TableCellRenderer的实现:

package org.hjm.renderer;

import java.awt.Color;
import java.awt.Component;
import java.util.HashMap;
import java.util.Map;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

import net.miginfocom.swing.MigLayout;

import org.hjm.component.NinePatchImageIcon;
import org.hjm.component.RLabel;
import org.hjm.component.RTextPane;
import org.hjm.entity.IMMessage;
/**
 * <code>BubbleRenderer</code> 
 * 
 * @author Jimmy
 * @since v1.0.0 (Oct 15, 2013)
 */
public class BubbleRenderer implements TableCellRenderer {
	LeftViewHolder mLeftHolder = new LeftViewHolder();
	RightViewHolder mRightHolder = new RightViewHolder();
	Map<String, Integer> mCacheCount = new HashMap<String, Integer>();
	int iCount = 0;
	
	public BubbleRenderer() {
	}
	
	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		Holder holder = null;
		IMMessage imMsg = (IMMessage)value;
		String sSender = imMsg.getSender();
		String sMsg = imMsg.getMsg();
		String sTime = imMsg.getTime();
		
		Integer iDisplaySide = mCacheCount.get(sSender);
		if (iDisplaySide == null) {
			iDisplaySide = iCount++;
			mCacheCount.put(sSender, iDisplaySide);
		}
		
		if (iDisplaySide % 2 == 0) {
			holder = mLeftHolder;
		} else {
			holder = mRightHolder;
		}
		holder.mLblUser.setText(sSender);
		holder.mLblTime.setText(sTime);
		holder.mTxtMsg.setText(sMsg);
		int iHeight = holder.mTxtMsg.getPreferredSize().height + 20;
		iHeight = iHeight < 85 ? 85 : iHeight;
		
		System.err.println(iHeight);
		int iH = table.getRowHeight(row);
		if (iH != iHeight) {
			table.setRowHeight(row, iHeight);
		}
		return holder;
	}
	
	private class Holder extends JPanel{
		private static final long serialVersionUID = -2850253575244483981L;
		JLabel mLblUser = new JLabel();
		JLabel mLblTime = new JLabel();
		RLabel mLblHead = new RLabel();
		RTextPane mTxtMsg = new RTextPane();
		public Holder() {
			setBackground(Color.white);
		}
	}
	
	private class LeftViewHolder extends Holder{
		private static final long serialVersionUID = 1L;
		private final Icon mBgIconLeft= new NinePatchImageIcon(this.getClass().getResource(
				"/resource/msg_bg2.9.png"));
		private final Icon mHeadLeft= new ImageIcon(this.getClass().getResource(
				"/resource/head1.png"));
		public LeftViewHolder() {
			this.setLayout(new MigLayout("ins 0"));
			mTxtMsg.setBackgroundIcon(mBgIconLeft);
			mLblHead.setIcon(mHeadLeft);
			this.add(mLblTime, "wmax pref");
			this.add(mLblUser, "pushx,growx, wrap");
			this.add(mLblHead, "spanx 2,split 2,wmax pref");
			this.add(mTxtMsg, "growy, pushy, wmin 300px");
		}
	}

	private class RightViewHolder extends Holder{
		private static final long serialVersionUID = 1L;
		private final Icon mBgIconRgh = new NinePatchImageIcon(this.getClass().getResource(
				"/resource/msg_bg1.9.png"));
		private final Icon mHeadRight = new ImageIcon(this.getClass().getResource(
				"/resource/head2.png"));
		public RightViewHolder() {
			this.setLayout(new MigLayout("ins 0, rtl"));
			mLblHead.setIcon(mHeadRight);
			mTxtMsg.setBackgroundIcon(mBgIconRgh);
			mLblUser.setHorizontalAlignment(JLabel.RIGHT);
			this.add(mLblTime, "wmax pref");
			this.add(mLblUser, "pushx,growx, wrap");
			this.add(mLblHead, "spanx 2,split 2,wmax pref");
			this.add(mTxtMsg, "growy, pushy, wmin 300px");
		}
	}

}

    如果想要转载的朋友,请注明此地址,谢谢。 附件中提供源码下载(BlogPratice.rar), 注意编码是UTF-8

  • 大小: 22.6 KB
  • 大小: 51.2 KB
4
0
分享到:
评论
10 楼 xiaoyan2016 2018-06-05  
看起来挺不错的,之前看到过一篇html5高仿微信聊天界面实战项目
https://blog.csdn.net/xiaoyan_2015/article/details/80189361
9 楼 趙素熙 2017-04-16  
      
I works very well. it's really amazing code. thank you for sharing good code.
8 楼 u010932348 2014-12-31  
   
7 楼 u010932348 2014-12-31  
   
6 楼 u010932348 2014-12-31  
   
5 楼 EricCho 2014-09-16  
楼主,首先非常感谢你写出这么牛叉的东西,我用了一下。现在有个问题想请教一下,我用你写的这个做了一个简单的聊天应用,可以聊天的时候消息不能滚到最下面,我试过了很多方法都不奏效,不知道楼主有没有研究过,麻烦告知一二,谢谢!
4 楼 541595308 2014-09-15  
楼主,你吊爆了
3 楼 NeighborWolf 2014-08-26  
挺不错的,可惜文字还不能复制,这点不方便。
2 楼 JimmyHR 2013-11-18  
rex0654335 写道
  

1 楼 rex0654335 2013-11-16  
  

相关推荐

    SWING实现类似微信的泡泡聊天界面Android源代码

    那在Swing中如何来实现同样的界面呢?各位对Swing有兴趣的朋友可以想想,我这里提供一种思路: JTable + TableCellRenderer + TableModel + 几张图片。其中实现TableCellRenderer是关键。 文章请参阅:...

    swing版本山寨微信打飞机

    《Swing版本山寨微信打飞机游戏解析》 在IT领域,开发者经常通过模仿热门应用来学习和提升自己的技能。"Swing版本山寨微信打飞机"就是这样一个项目,它基于Java Swing库,旨在复制微信内置的经典游戏——“打飞机”...

    Java项目:基于Java Swing实现的微信飞机大战小游戏实战项目含背景音乐哦

    总的来说,这个Java Swing实现的微信飞机大战小游戏涵盖了Java GUI编程的基础,面向对象的设计原则,以及音频处理和游戏逻辑的实现。对于初学者来说,这是一个很好的实践项目,可以帮助他们深入理解Java编程并提升...

    原生java仿微信聊天源码.zip

    在描述中提到,“前端,整个前端与微信1比1比例仿做”,这意味着项目采用了JavaFX或者Swing等Java GUI库,构建出与微信界面高度相似的用户交互界面。开发者需要熟悉Java的图形界面设计,包括布局管理、事件处理、...

    基于Swing的类似编辑器的界面

    本文将深入探讨基于Swing的"类似编辑器的界面"的设计与实现,以及涉及到的关键技术,包括可关闭的选项卡面板、文件复制功能、JSplitPane和滚动面板。 首先,"可关闭的选项卡面板"是一种常见的用户界面设计,常用于...

    Java基于Swing实现的简单聊天室,支持多人在线闲谈.zip

    这个“Java基于Swing实现的简单聊天室,支持多人在线闲谈.zip”文件是一个示例项目,展示了如何利用Swing构建一个基本的多用户聊天应用。下面将详细阐述其涉及的关键知识点。 1. **Swing组件**:Swing提供了丰富的...

    用swing和socket实现的聊天室

    总结起来,"用swing和socket实现的聊天室"项目涵盖了Java GUI编程、网络编程以及数据库操作等多个核心概念。通过这个项目,开发者可以锻炼到客户端-服务器架构的实现,理解Socket通信的原理,以及如何利用数据库存储...

    QQ聊天窗口泡泡模式的Swing实现

    本篇文章将深入探讨如何使用Swing实现QQ聊天窗口中的“泡泡模式”,这是一种常见且吸引人的消息显示方式。 首先,Swing是Java AWT(Abstract Window Toolkit)的扩展,提供了更现代、更丰富的图形用户界面元素。它...

    Java仿微信飞机大战--Swing界面

    总的来说,“Java仿微信飞机大战--Swing界面”项目是一个很好的学习资源,它涵盖了Java GUI编程、对象导向设计、游戏逻辑实现、图形绘制和音频处理等多个方面。对于想要提升Java编程技能,特别是对游戏开发感兴趣的...

    一个利用Java Swing实现可视化界面的扫雷小游戏.zip

    一个利用Java Swing实现可视化界面的扫雷小游戏.zip 一个利用Java Swing实现可视化界面的扫雷小游戏.zip 一个利用Java Swing实现可视化界面的扫雷小游戏.zip 一个利用Java Swing实现可视化界面的扫雷小游戏.zip 一个...

    局域网内的聊天系统 java swing 实现

    总的来说,这个"局域网内的聊天系统 java swing 实现"项目是一个很好的学习资源,涵盖了Java GUI开发、网络编程和多线程等重要技术,对于想要提升Java Swing技能或者想要构建类似应用的开发者来说,具有很高的参考...

    swing实现的猫版聊天室

    在"Swing实现的猫版聊天室"项目中,开发者利用Swing库构建了一个简易的聊天应用程序,旨在提供一个互动的交流平台,用户可以通过双击发送文件进行互动。这个项目对于学习Java GUI编程,特别是Swing组件的使用,以及...

    基于swing的多线程聊天室

    【基于Swing的多线程聊天室】是一个Java应用程序,它利用了Swing库来构建图形用户界面(GUI)并采用多线程技术实现多用户之间的实时通信。Swing是Java Standard Edition(Java SE)的一部分,提供了丰富的组件库用于...

    java swing 实现的带启动界面的简易截图软件

    java swing 实现的带启动界面的简易截图软件,启动界面有进度条,可保存可粘贴到qq微信,简单实用

    Swing做的高仿QQ登陆界面

    下面我们将详细探讨Swing在创建登录界面以及相关功能实现上的应用。 首先,Swing提供了丰富的组件库,包括JFrame(主窗口)、JLabel(文本标签)、JButton(按钮)、JTextField(文本输入框)和JPasswordField...

    高仿微信打飞机游戏(awt+swing)源代码

    微信打飞机游戏以其简洁的操作和竞技性吸引了大量的玩家,而本资源提供的是一款使用Java AWT和Swing库实现的高仿版本。本文将详细介绍这款游戏中涉及到的关键技术和编程思想。 1. Java AWT与Swing库的应用: AWT...

    Java Swing 界面美化包-含源码

    Java Swing 是Java标准库中的一个组件,用于创建图形用户界面(GUI)。Swing 提供了丰富的组件集合,如按钮、文本框、菜单等,用于构建桌面应用程序。然而,Swing 的默认界面风格(LookAndFeel)在视觉上可能相对...

    swing界面美化包

    Swing界面美化的实现主要依赖于两个关键概念:LookAndFeel和UI Delegate。LookAndFeel是一种可以改变所有组件外观和感觉的全局设置,而UI Delegate则负责具体组件的绘制和行为。Java提供了一些内置的LookAndFeel,如...

    用swing实现的QQ界面

    这个项目“用Swing实现的QQ界面”展示了如何利用JDK 6.0中的Swing组件来模仿腾讯QQ的用户界面,从而提供类似的功能。下面将详细讨论Swing、Java GUI设计以及在实现QQ界面过程中可能涉及的关键技术。 Swing是Java的...

Global site tag (gtag.js) - Google Analytics