在swing中画出美丽的泡泡

我想在swing上创造美丽的泡泡,但结果不是很好……我的意思是我想要更好,更美的东西!

在此处输入图像描述

在此处输入图像描述

这是我正在使用的代码:

import javax.swing.*; import java.awt.*; import java.awt.geom.Area; import java.awt.geom.RoundRectangle2D; public class BubbleTest { public static void main(String[] args) { try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException e) { e.printStackTrace(); } LeftArrowBubble leftArrowBubble = new LeftArrowBubble(); JOptionPane.showMessageDialog(null, leftArrowBubble); RightArrowBubble rightArrowBubble = new RightArrowBubble(); JOptionPane.showMessageDialog(null, rightArrowBubble); } private static class LeftArrowBubble extends JPanel { private int strokeThickness = 5; private int padding = strokeThickness / 2; private int radius = 10; private int arrowSize = 6; @Override protected void paintComponent(final Graphics g) { final Graphics2D graphics2D = (Graphics2D) g; RenderingHints qualityHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); qualityHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); graphics2D.setRenderingHints(qualityHints); graphics2D.setColor(new Color(80, 150, 180)); graphics2D.setStroke(new BasicStroke(strokeThickness)); int x = padding + strokeThickness + arrowSize; int width = getWidth() - arrowSize - (strokeThickness * 2); int height = getHeight() - strokeThickness; graphics2D.fillRect(x, padding, width, height); RoundRectangle2D.Double rect = new RoundRectangle2D.Double(x, padding, width, height, radius, radius); Polygon arrow = new Polygon(); arrow.addPoint(14, 6); arrow.addPoint(arrowSize + 2, 10); arrow.addPoint(14, 12); Area area = new Area(rect); area.add(new Area(arrow)); graphics2D.draw(area); graphics2D.dispose(); } } private static class RightArrowBubble extends JPanel { private int strokeThickness = 5; private int padding = strokeThickness / 2; private int arrowSize = 6; private int radius = 10; @Override protected void paintComponent(final Graphics g) { final Graphics2D graphics2D = (Graphics2D) g; RenderingHints qualityHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); qualityHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); graphics2D.setRenderingHints(qualityHints); graphics2D.setColor(new Color(20, 130, 230)); graphics2D.setStroke(new BasicStroke(strokeThickness)); int width = getWidth() - arrowSize - (strokeThickness * 2); int height = getHeight() - strokeThickness; graphics2D.fillRect(padding, padding, width, height); RoundRectangle2D.Double rect = new RoundRectangle2D.Double(padding, padding, width, height, radius, radius); Polygon arrow = new Polygon(); arrow.addPoint(width, 6); arrow.addPoint(width + arrowSize, 10); arrow.addPoint(width, 12); Area area = new Area(rect); area.add(new Area(arrow)); graphics2D.draw(area); graphics2D.dispose(); } } } 

任何想法的家伙?

我想在viber中使用语音泡泡(android版本5.0.0),但我不知道如何绘制这样的东西……任何人都可以帮助我吗?

在此处输入图像描述

谢谢!

最后我用GeneralPath绘制它…

在此处输入图像描述

足够近? :))

 @Override protected void paintComponent(final Graphics g) { final Graphics2D graphics2D = (Graphics2D) g; RenderingHints qualityHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); qualityHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); graphics2D.setRenderingHints(qualityHints); graphics2D.setPaint(new Color(80, 150, 180)); int width = getWidth(); int height = getHeight(); GeneralPath path = new GeneralPath(); path.moveTo(5, 10); path.curveTo(5, 10, 7, 5, 0, 0); path.curveTo(0, 0, 12, 0, 12, 5); path.curveTo(12, 5, 12, 0, 20, 0); path.lineTo(width - 10, 0); path.curveTo(width - 10, 0, width, 0, width, 10); path.lineTo(width, height - 10); path.curveTo(width, height - 10, width, height, width - 10, height); path.lineTo(15, height); path.curveTo(15, height, 5, height, 5, height - 10); path.lineTo(5, 15); path.closePath(); graphics2D.fill(path); }