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.pswp.cn/news/372213.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372213.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372213.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java內存模型按照線程隔離性_深入理解Java多線程與并發框(第③篇)——Java內存模型與原子性、可見性、有序性...

一、Java內存模型Java Memory Modle,簡稱 JMM,中文名稱 Java內存模型,它是一個抽象的概念,用來描述或者規范訪問內存變量的方式。因為各中計算機的操作系統和硬件不同,方式機制也可能不同,Java內存模型用于…

PHP通過PDO連接Microsoft Access數據庫

1連接到access數據庫 $db new PDO("odbc:Driver{Microsoft Access Driver (*.mdb, *.accdb)}; dbq" .realpath("yourfilepath\# ddsbbn3A02.Mdb")) or die("Connect Error"); realpath函數用來規范化絕對路徑 2修改數據庫中BM_sitelink表中字段…

ZK實際應用:樣式和布局

在之前的ZK in Action帖子中,我們使用ZK MVVM實現了CRUD功能 。 我們還快速瀏覽了一些樣式代碼,可能需要更多的解釋。 在本文中,我們將討論如何在ZK小部件上附加新CSS樣式規則,以及如何覆蓋現有樣式。 我們還將介紹ZK中UI布局的一…

java面向對象的三大特征是6_Java面向對象的三大特征

面向對象的本質:以類的方式組織代碼,以對象的方式組織數據。面向對象三大特性:封裝 繼承 多態封裝:概念:隱藏對象內部的復雜性,只對外公開簡單的接口。便于外界調用,從而提高系統的可擴展性&…

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.因…

java中如何調用dal接口案例_關于Java:接口的目的

好吧,我認為接口是一種強制對象實現一定數量功能的方法,而不必使用繼承。有點像合同。我半明白他們的意思。但是,如果界面中的所有內容都是:public interface animal{void eat(object food);}它沒有這樣的實現,那么無論…

Android Studio混淆

這一篇說一下Android Studio的代碼混淆: 第一步:要想使混淆生效,要修改項目(App)下的build.gradle一處內容:minifyEnabled 的值 設置為true,當前項目就可以使用混淆了。 apply plugin: com.and…

內存訪問模式很重要

在高性能計算中,通常會說高速緩存未命中的代價是算法的最大性能損失。 多年來,處理器速度的提高大大超過了延遲到主內存的速度。 通過更寬的多通道總線,到主內存的帶寬已大大增加,但是延遲并未顯著減少。 為了掩蓋這種延遲&#x…

上傳頭像將光標去掉

οnfοcus"this.blur();" unselectable"on" οnfοcus"this.blur();"支持火狐,谷歌等主流瀏覽器 unselectable支持ie瀏覽器轉載于:https://www.cnblogs.com/jar-gon/p/6841239.html

java底層 文件操作_JAVA的文件操作【轉】

11.3 I/O類使用由于在IO操作中,需要使用的數據源有很多,作為一個IO技術的初學者,從讀寫文件開始學習IO技術是一個比較好的選擇。因為文件是一種常見的數據源,而且讀寫文件也是程序員進行IO編程的一個基本能力。本章IO類的使用就從…

JAVA多線程,真的能提高效率嗎

舉個栗子 比如挖一個隧道,有2種開工方法1、只在山的一頭挖,直至挖到山的另一頭,從而打通隧道,這可以看成是單線程 2、在山的兩頭挖,同時開工,最后在山的中間接通,從而打通隧道,這感覺…

Java 8:測試Lambda水

Java 8大約有一年的時間了,它具有我非常期待的語言功能: Lambda Expression 。 令人遺憾的是,另一個重要功能Java平臺模塊已延遲到Java9。但是,將lambda表達式(或閉包)添加到該語言中將使Java編程變得更好。…

java定義js函數_JS中可以先使用函數,然后再定義.

首先要說明的,下面這種方式是對的,雖然不知道為什么,很奇怪為什么可以先使用,再定義,希望有了解的人可以給個說法.hello(www.openj.cn);function hello(name){alert("hello " name)};本文首發于 http://blog.openj.cn下面的這種定義函數方式,對于寫一些比較復雜的代碼…

基于閥值的工作流引擎設計

最近在做工作流處理流程部分的工作,順便研究了一下工作流引擎的一些設計理念和原理。由于以前接觸過人工智能神經網絡的一些東西,發現工作流引擎和神經網絡還是頗有一些相似之處,都是滿足一定的條件下向下一個節點傳遞。在神經網絡的神經元中…

Git之安裝管理

1.Git安裝部署 Git是分布式的版本控制系統,我們只要有了一個原始Git版本倉庫,就可以讓其他主機克隆走這個原始版本倉庫,從而使得一個Git版本倉庫可以被同時分布到不同的主機之上,并且每臺主機的版本庫都是一樣的,沒有主…