本文将向您解释“如何在Java swing应用程序中绘制聊天气泡?” 聊天气泡与呼出气泡或思想气泡相同。 今天,大多数聊天应用程序都以这种格式显示转换,因此本文将帮助您在用Java swing创建的桌面应用程序中进行相同的操作。
以下课程用于绘制第一个聊天气泡:(箭头位于气泡的左侧)
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