2014-09-13 99 views
2

我想在秋千上创造美丽的泡泡,但结果不是很好...我的意思是我想要更好,更漂亮的东西!在Swing中画出美丽的泡泡

enter image description here

enter image description here

这里是代码我使用:

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(安卓版本5.0.0)中的语音气泡,但我不知道如何画这样的东西... 任何人都可以帮助我吗?

enter image description here

谢谢!

+2

查看形状API – MadProgrammer 2014-09-13 08:31:36

+0

使用2个椭圆,并将它们相交以创建圆角三角形类型。我认为圆角矩形很好。不要忘记设置框架来创建这个圆角三角形。 – afzalex 2014-09-13 08:40:44

+0

您展示的Viber示例具有光影。我想这对你认为它更美的原因贡献最大。否则(除了更圆的角落和弯曲的“出口”),您自己的解决方案已经非常接近。 – 5gon12eder 2014-09-13 09:14:10

回答

5

最后我GeneralPath绘制...

enter image description here

足够接近? :))

@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); 
} 
+1

恭喜,你做到了。但是我想澄清你那个时候你的问题还不清楚,有人可以帮助你。请下次尝试清楚您的问题。即使我认为你说你可以用GeneralPath来做这件事,并且还有其他问题。 – afzalex 2014-09-15 22:21:25