【问题标题】:Draw Beautiful Speech Bubbles in Swing [closed]在摇摆中画出美丽的泡泡[关闭]
【发布时间】:2014-11-07 09:32:02
【问题描述】:

我正在尝试在摇摆中创建漂亮的泡泡,但结果不是很好......我的意思是我想要更好更漂亮的东西!

这是我正在使用的代码:

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)中的气泡之类的东西,但我不知道如何绘制这样的东西...... 谁能帮帮我?

谢谢!

【问题讨论】:

  • 查看形状 API
  • 使用 2 个椭圆,并将它们相交以创建圆角三角形。我认为圆角矩形很好。不要忘记设置框架来创建这个圆角三角形。
  • 您展示的 viber 示例有一个浅色阴影。我想这最有助于让你认为它更漂亮。否则(除了更圆的角和弯曲的“出口”)您自己的解决方案已经非常接近了。
  • @afzalex 我想我可以用GeneralPath画出来
  • 那你的问题是什么。你想让你的程序做什么。是衰落的行为吗?

标签: java swing graphics drawing shapes


【解决方案1】:

最后我用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);
}

【讨论】:

  • 恭喜,你成功了。但我想澄清一下,你当时的问题还不清楚,有人可以帮你解决这个问题。下次请尽量把你的问题说清楚。甚至我认为你是说你可以用 GeneralPath 做那个东西,但你还有其他问题。
猜你喜欢
  • 2011-02-12
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多