Java Swing中的聊天气泡

本文将向您解释“如何在Java swing应用程序中绘制聊天气泡?” 聊天气泡与呼出气泡或思想气泡相同。 今天,大多数聊天应用程序都以这种格式显示转换,因此本文将帮助您在用Java swing创建的桌面应用程序中进行相同的操作。

chatbubble1

以下课程用于绘制第一个聊天气泡:(箭头位于气泡的左侧)

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.geom.Area;
import java.awt.geom.RoundRectangle2D;
import javax.swing.JPanel;
/*** @author harsh*/
public class LeftArrowBubble extends JPanel {private static final long serialVersionUID = -5389178141802153305L;private int radius = 10;private int arrowSize = 12;private int strokeThickness = 3;private int padding = strokeThickness / 2;@Overrideprotected void paintComponent(final Graphics g) {final Graphics2D g2d = (Graphics2D) g;g2d.setColor(new Color(0.5f, 0.8f, 1f));int x = padding + strokeThickness + arrowSize;int width = getWidth() - arrowSize - (strokeThickness * 2);int bottomLineY = getHeight() - strokeThickness;g2d.fillRect(x, padding, width, bottomLineY);g2d.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING,   RenderingHints.VALUE_ANTIALIAS_ON));g2d.setStroke(new BasicStroke(strokeThickness));RoundRectangle2D.Double rect = new RoundRectangle2D.Double(x, padding, width, bottomLineY, radius, radius);Polygon arrow = new Polygon();arrow.addPoint(20, 8);arrow.addPoint(0, 10);arrow.addPoint(20, 12);Area area = new Area(rect);area.add(new Area(arrow));g2d.draw(area);}
}

下面的代码是绘制第二个聊天气泡。 (箭头指向气泡的右侧):

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.geom.Area;
import java.awt.geom.RoundRectangle2D;
import javax.swing.JPanel;
/*** @author harsh*/
public class RightArrowBubble extends JPanel {private static final long serialVersionUID = -5389178141802153305L;private int strokeThickness = 3;private int radius = 10;private int arrowSize = 12;private int padding = strokeThickness / 2;@Overrideprotected void paintComponent(final Graphics g) {final Graphics2D g2d = (Graphics2D) g;g2d.setColor(new Color(0.5f, 0.5f, 1f));int bottomLineY = getHeight() - strokeThickness;int width = getWidth() - arrowSize - (strokeThickness * 2);g2d.fillRect(padding, padding, width, bottomLineY);RoundRectangle2D.Double rect = new RoundRectangle2D.Double(padding, padding, width, bottomLineY,  radius, radius);Polygon arrow = new Polygon();arrow.addPoint(width, 8);arrow.addPoint(width + arrowSize, 10);arrow.addPoint(width, 12);Area area = new Area(rect);area.add(new Area(arrow));g2d.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));g2d.setStroke(new BasicStroke(strokeThickness));g2d.draw(area);}
}

这是使用以上两个类的代码:

import java.awt.HeadlessException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.GroupLayout;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
/*** @author harsh*/
public class TestPanel extends JPanel {private static final long serialVersionUID = 9029457020704524363L;private JLabel messageLbl1, userImageLbl1, messageLbl, userImageLbl;private JPanel msgPanel1, msgPanel;String userImageUrl = "http://cdn1.iconfinder.com/data/icons/nuvola2/22x22/apps/personal.png";public TestPanel() throws MalformedURLException {userImageLbl = new JLabel();msgPanel = new LeftArrowBubble();messageLbl = new JLabel();messageLbl1 = new JLabel();msgPanel1 = new RightArrowBubble();userImageLbl1 = new JLabel();userImageLbl.setIcon(new ImageIcon(new URL(userImageUrl)));messageLbl.setText("Hi, How are you?");GroupLayout msgPanelLayout = new GroupLayout(msgPanel);msgPanel.setLayout(msgPanelLayout);msgPanelLayout.setHorizontalGroup(msgPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(msgPanelLayout.createSequentialGroup().addGap(21, 21, 21).addComponent(messageLbl).addContainerGap(162, Short.MAX_VALUE)));msgPanelLayout.setVerticalGroup(msgPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(msgPanelLayout.createSequentialGroup().addComponent(messageLbl).addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));messageLbl1.setIcon(new ImageIcon(new URL(userImageUrl)));userImageLbl1.setText("I'm Good.");GroupLayout jPanel1Layout = new GroupLayout(msgPanel1);msgPanel1.setLayout(jPanel1Layout);jPanel1Layout.setHorizontalGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup().addContainerGap(171, Short.MAX_VALUE).addComponent(userImageLbl1).addGap(22, 22, 22)));jPanel1Layout.setVerticalGroup(jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addComponent(userImageLbl1).addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));GroupLayout layout = new GroupLayout(this);this.setLayout(layout);layout.setHorizontalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(userImageLbl).addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING).addComponent(msgPanel1, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(msgPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)).addComponent(messageLbl1).addContainerGap()));layout.setVerticalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(userImageLbl).addComponent(msgPanel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)).addGap(18, 18, 18).addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(messageLbl1).addComponent(msgPanel1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)).addContainerGap(22, Short.MAX_VALUE)));}public static void main(String[] args) {SwingUtilities.invokeLater(new Runnable() {public void run() {try {JOptionPane.showMessageDialog(null, new TestPanel());} catch (HeadlessException e) {e.printStackTrace();} catch (MalformedURLException e) {e.printStackTrace();}}});}
}

参考: harryjoy博客上来自我们JCG合作伙伴 Harsh Raval的java swing中的聊天气泡 。


翻译自: https://www.javacodegeeks.com/2012/08/chat-bubble-in-java-swing.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java内存模型按照线程隔离性_深入理解Java多线程与并发框(第③篇)——Java内存模型与原子性、可见性、有序性...

一、Java内存模型Java Memory Modle,简称 JMM,中文名称 Java内存模型,它是一个抽象的概念,用来描述或者规范访问内存变量的方式。因为各中计算机的操作系统和硬件不同,方式机制也可能不同,Java内存模型用于…

ZK实际应用:样式和布局

在之前的ZK in Action帖子中,我们使用ZK MVVM实现了CRUD功能 。 我们还快速浏览了一些样式代码,可能需要更多的解释。 在本文中,我们将讨论如何在ZK小部件上附加新CSS样式规则,以及如何覆盖现有样式。 我们还将介绍ZK中UI布局的一…

Tornado(一)

Tornado 特点 Tornado是一个用Python写的相对简单的、不设障碍的Web服务器架构,用以处理上万的同时的连接口,让实时的Web服务通畅起来。虽然跟现在的一些用Python写的Web架构相似,比如Django,但Tornado更注重速度,能够…

Android下Opengl ES实现单屏幕双眼显示

http://blog.csdn.net/u011371324/article/details/68946779 默认情况下,Opengl ES使用系统提供的帧缓冲区作为绘图表面,一般情况下,如果只在屏幕的表面绘图的话,系统提供的默认帧缓冲区很高效,但是很多应用程序需要渲…

Oracle Service Bus –线程阻塞案例研究

本案例研究描述了在AIX 6.1和IBM Java VM 1.6上运行的Oracle Service Bus 11g遇到的线程阻塞问题的完整根本原因分析过程。 本文也是您提高线程转储分析技能的绝佳机会,我强烈建议您学习并正确理解以下分析方法。 与过早的中间件(Weblogic)重…

java 可以重载等于号码_Java面试之Java基础4——重载与重写的区别

目录重载与重写的概念重载与重写的区别重载与重写的总结构造器是否能被重写override为什么函数不能根据返回类型来区分重载重载与重写的概念重载:同样一个方法可以根据输入参数列表的不同,做出不同的处理。普通方法和构造器方法都能够重载。方法重载&…

二维数组、多维数组

二维数组: 定义二维数组 int[,] myArray new int[几个一维数组,数组中的个数]; 数组可以具有多个维度。例如,下列声明创建一个四行两列的二维数组(可以理解为4个1维数组,数组中包含2个元素): int[,] myArray new int[4,2]; int[…

一张大图片有多个小图片

这个页面也是我看到别人的写的,感觉不错,就自己留下了为了以后自己可以容易找到,也希望可以方便到别人。 写这个页面 需要注意的是: 1.写每一个小图片的位置时候,要用id,这样等级就高了,不然不起作用。 2.因…

Android Studio混淆

这一篇说一下Android Studio的代码混淆: 第一步:要想使混淆生效,要修改项目(App)下的build.gradle一处内容:minifyEnabled 的值 设置为true,当前项目就可以使用混淆了。 apply plugin: com.and…

Java 8:测试Lambda水

Java 8大约有一年的时间了,它具有我非常期待的语言功能: Lambda Expression 。 令人遗憾的是,另一个重要功能Java平台模块已延迟到Java9。但是,将lambda表达式(或闭包)添加到该语言中将使Java编程变得更好。…

基于阀值的工作流引擎设计

最近在做工作流处理流程部分的工作,顺便研究了一下工作流引擎的一些设计理念和原理。由于以前接触过人工智能神经网络的一些东西,发现工作流引擎和神经网络还是颇有一些相似之处,都是满足一定的条件下向下一个节点传递。在神经网络的神经元中…

Git之安装管理

1.Git安装部署 Git是分布式的版本控制系统,我们只要有了一个原始Git版本仓库,就可以让其他主机克隆走这个原始版本仓库,从而使得一个Git版本仓库可以被同时分布到不同的主机之上,并且每台主机的版本库都是一样的,没有主…

Java执行程序服务类型

ExecutorService功能是Java 5附带的。它扩展了Executor接口,并提供了线程池功能来执行异步简短任务。 使用Java 6提供的ExecutorService接口有五种异步执行任务的方法。 ExecutorService execService Executors.newCachedThreadPool(); 这…

MySQL的主动优化和被动优化_MySQL“被动”性能优化汇总!

年少不知优化苦,遇坑方知优化难。 ——村口王大爷本文内容导图如下:我之前有很多文章都在讲性能优化的问题,比如下面这些:当然,本篇也是关于性能优化的,那性能优化就应该一把梭子吗?还是要符合一…

python2

一、管理库的安装 安装pip 提示报错:安装pip提示No module named setuptools Windows环境下Python默认是没有安装setuptools这个模块的,这也是一个第三方模块。下载地址为http://pypi.python.org/pypi/setuptools。下载后直接运行ez_setup.py 参考地址&…

【图】最短路径——Floyed算法和Dijkstra算法

最短路径问题(floyed.cpp dijkstra.cpp) 题目描述平面上有n个点(n<100)&#xff0c;每个点的坐标均在-10000&#xff5e;10000之间。其中的一些点之间有连线。若有连线&#xff0c;则表示可从一个点到达另一个点&#xff0c;即两点间有通路&#xff0c;通路的距离为两点间的…

Java并发– CyclicBarrier示例

Java中的CyclicBarrier是JDK 5中java.util.Concurrent包中引入的同步器&#xff0c;以及其他并发实用程序&#xff08;如Counting Semaphore &#xff0c; BlockingQueue &#xff0c; ConcurrentHashMap等&#xff09;。CyclicBarrier与CountDownLatch类似&#xff0c;我们在上…

JasperReports JSF插件用例–简单列表报告

这是JasperReports JSF插件系列的第一篇“用例文章” &#xff0c;我将专注于一个简单的需求&#xff0c;并且我将进一步深入。 起点是我们已经为图书商店完成的项目设置&#xff0c;我将向其中添加一个列表&#xff0c;其中包含在数据库中注册的其他图书&#xff0c;该列表也将…

ER图流程图

ER图&#xff1a;ER图分为实体、属性、关系三个核心部分。实体是长方形体现&#xff0c;而属性则是椭圆形&#xff0c;关系为菱形。 图书馆管理系统流程图&#xff08;图片源于网上&#xff09;&#xff1a;对于程序员来说&#xff0c;我们要知道&#xff1a;整个系统中&#x…

php源码仿三一重工,织梦仿三一重工业大学气企业网站php源码

★模板引荐★源码称呼&#xff1a;仿三一重工业大学气企业网站php源码仿三一重工业大学气企业网站php源码&#xff0c;尝试完备无错&#xff0c;兼容合流欣赏器。模板包括安置证明&#xff0c;并包括尝试数据。本模板鉴于DEDECms 5.7 GBK安排&#xff0c;须要 UTF-8版本的请本人…