前段时间由于工作的同时学习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。
相关推荐
那在Swing中如何来实现同样的界面呢?各位对Swing有兴趣的朋友可以想想,我这里提供一种思路: JTable + TableCellRenderer + TableModel + 几张图片。其中实现TableCellRenderer是关键。 文章请参阅:...
《Swing版本山寨微信打飞机游戏解析》 在IT领域,开发者经常通过模仿热门应用来学习和提升自己的技能。"Swing版本山寨微信打飞机"就是这样一个项目,它基于Java Swing库,旨在复制微信内置的经典游戏——“打飞机”...
总的来说,这个Java Swing实现的微信飞机大战小游戏涵盖了Java GUI编程的基础,面向对象的设计原则,以及音频处理和游戏逻辑的实现。对于初学者来说,这是一个很好的实践项目,可以帮助他们深入理解Java编程并提升...
在描述中提到,“前端,整个前端与微信1比1比例仿做”,这意味着项目采用了JavaFX或者Swing等Java GUI库,构建出与微信界面高度相似的用户交互界面。开发者需要熟悉Java的图形界面设计,包括布局管理、事件处理、...
本文将深入探讨基于Swing的"类似编辑器的界面"的设计与实现,以及涉及到的关键技术,包括可关闭的选项卡面板、文件复制功能、JSplitPane和滚动面板。 首先,"可关闭的选项卡面板"是一种常见的用户界面设计,常用于...
这个“Java基于Swing实现的简单聊天室,支持多人在线闲谈.zip”文件是一个示例项目,展示了如何利用Swing构建一个基本的多用户聊天应用。下面将详细阐述其涉及的关键知识点。 1. **Swing组件**:Swing提供了丰富的...
总结起来,"用swing和socket实现的聊天室"项目涵盖了Java GUI编程、网络编程以及数据库操作等多个核心概念。通过这个项目,开发者可以锻炼到客户端-服务器架构的实现,理解Socket通信的原理,以及如何利用数据库存储...
本篇文章将深入探讨如何使用Swing实现QQ聊天窗口中的“泡泡模式”,这是一种常见且吸引人的消息显示方式。 首先,Swing是Java AWT(Abstract Window Toolkit)的扩展,提供了更现代、更丰富的图形用户界面元素。它...
总的来说,“Java仿微信飞机大战--Swing界面”项目是一个很好的学习资源,它涵盖了Java GUI编程、对象导向设计、游戏逻辑实现、图形绘制和音频处理等多个方面。对于想要提升Java编程技能,特别是对游戏开发感兴趣的...
一个利用Java Swing实现可视化界面的扫雷小游戏.zip 一个利用Java Swing实现可视化界面的扫雷小游戏.zip 一个利用Java Swing实现可视化界面的扫雷小游戏.zip 一个利用Java Swing实现可视化界面的扫雷小游戏.zip 一个...
总的来说,这个"局域网内的聊天系统 java swing 实现"项目是一个很好的学习资源,涵盖了Java GUI开发、网络编程和多线程等重要技术,对于想要提升Java Swing技能或者想要构建类似应用的开发者来说,具有很高的参考...
在"Swing实现的猫版聊天室"项目中,开发者利用Swing库构建了一个简易的聊天应用程序,旨在提供一个互动的交流平台,用户可以通过双击发送文件进行互动。这个项目对于学习Java GUI编程,特别是Swing组件的使用,以及...
【基于Swing的多线程聊天室】是一个Java应用程序,它利用了Swing库来构建图形用户界面(GUI)并采用多线程技术实现多用户之间的实时通信。Swing是Java Standard Edition(Java SE)的一部分,提供了丰富的组件库用于...
java swing 实现的带启动界面的简易截图软件,启动界面有进度条,可保存可粘贴到qq微信,简单实用
下面我们将详细探讨Swing在创建登录界面以及相关功能实现上的应用。 首先,Swing提供了丰富的组件库,包括JFrame(主窗口)、JLabel(文本标签)、JButton(按钮)、JTextField(文本输入框)和JPasswordField...
微信打飞机游戏以其简洁的操作和竞技性吸引了大量的玩家,而本资源提供的是一款使用Java AWT和Swing库实现的高仿版本。本文将详细介绍这款游戏中涉及到的关键技术和编程思想。 1. Java AWT与Swing库的应用: AWT...
Java Swing 是Java标准库中的一个组件,用于创建图形用户界面(GUI)。Swing 提供了丰富的组件集合,如按钮、文本框、菜单等,用于构建桌面应用程序。然而,Swing 的默认界面风格(LookAndFeel)在视觉上可能相对...
Swing界面美化的实现主要依赖于两个关键概念:LookAndFeel和UI Delegate。LookAndFeel是一种可以改变所有组件外观和感觉的全局设置,而UI Delegate则负责具体组件的绘制和行为。Java提供了一些内置的LookAndFeel,如...
这个项目“用Swing实现的QQ界面”展示了如何利用JDK 6.0中的Swing组件来模仿腾讯QQ的用户界面,从而提供类似的功能。下面将详细讨论Swing、Java GUI设计以及在实现QQ界面过程中可能涉及的关键技术。 Swing是Java的...