Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 矩形梯度_Java_Draw_Gradient - Fatal编程技术网

Java 矩形梯度

Java 矩形梯度,java,draw,gradient,Java,Draw,Gradient,我正在尝试为我的用户界面中的某些东西实现一个draw(graphics2dg)方法。它不是一个swing组件,我自己画。我正试图创建一个像这样的图像梯度边界 我怎样才能画出一个类似于那个的渐变呢?你并没有具体说明你想要什么,但如果它是我认为的那样,那么它就有点类似于我在书中写的东西 这里的技巧是不创建单个渐变绘制,也不填充单个形状。相反,必须用渐变填充的区域分为8个部分:四个边和四个角。边缘用简单的渐变色颜料填充。拐角处用径向渐变色涂料填充。然后只需要摆弄坐标,但这可以通过一种相当通用的方式来

我正在尝试为我的用户界面中的某些东西实现一个
draw(graphics2dg)
方法。它不是一个swing组件,我自己画。我正试图创建一个像这样的图像梯度边界

我怎样才能画出一个类似于那个的渐变呢?

你并没有具体说明你想要什么,但如果它是我认为的那样,那么它就有点类似于我在书中写的东西

这里的技巧是不创建单个渐变绘制,也不填充单个形状。相反,必须用渐变填充的区域分为8个部分:四个边和四个角。边缘用简单的渐变色颜料填充。拐角处用径向渐变色涂料填充。然后只需要摆弄坐标,但这可以通过一种相当通用的方式来完成,当内部形状以
矩形2D
给出时

然而,结果可能如下所示:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.MultipleGradientPaint.CycleMethod;
import java.awt.RadialGradientPaint;
import java.awt.Shape;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class RectangularGradientTest
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(new RectangularGradientTestPanel());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}


class RectangularGradientTestPanel extends JPanel
{
    @Override
    protected void paintComponent(Graphics gr)
    {
        super.paintComponent(gr);
        Graphics2D g = (Graphics2D)gr;
        Rectangle2D r = new Rectangle2D.Double(100,100,200,100);
        draw(g, r, 75);

        Shape rr = new RoundRectangle2D.Double(80,80,240,140,20,20);
        g.setColor(Color.BLACK);
        g.fill(rr);
    }

    @Override
    public Dimension getPreferredSize()
    {
        if (isPreferredSizeSet())
        {
            return super.getPreferredSize();
        }
        return new Dimension(400,300);
    }


    private static void draw(Graphics2D g, Rectangle2D r, double s)
    {
        Color c0 = new Color(255,0,0);
        Color c1 = new Color(255,0,0,0);

        double x0 = r.getMinX();
        double y0 = r.getMinY();
        double x1 = r.getMaxX();
        double y1 = r.getMaxY();
        double w = r.getWidth();
        double h = r.getHeight();

        // Left
        g.setPaint(new GradientPaint(
            new Point2D.Double(x0, y0), c0,
            new Point2D.Double(x0 - s, y0), c1));
        g.fill(new Rectangle2D.Double(x0 - s, y0, s, h));

        // Right
        g.setPaint(new GradientPaint(
            new Point2D.Double(x1, y0), c0,
            new Point2D.Double(x1 + s, y0), c1));
        g.fill(new Rectangle2D.Double(x1, y0, s, h));

        // Top
        g.setPaint(new GradientPaint(
            new Point2D.Double(x0, y0), c0,
            new Point2D.Double(x0, y0 - s), c1));
        g.fill(new Rectangle2D.Double(x0, y0 - s, w, s));

        // Bottom
        g.setPaint(new GradientPaint(
            new Point2D.Double(x0, y1), c0,
            new Point2D.Double(x0, y1 + s), c1));
        g.fill(new Rectangle2D.Double(x0, y1, w, s));

        float fractions[] = new float[] { 0.0f, 1.0f };
        Color colors[] = new Color[] { c0, c1 };

        // Top Left
        g.setPaint(new RadialGradientPaint(
            new Rectangle2D.Double(x0 - s, y0 - s, s + s, s + s), 
            fractions, colors, CycleMethod.NO_CYCLE));
        g.fill(new Rectangle2D.Double(x0 - s, y0 - s, s, s));

        // Top Right
        g.setPaint(new RadialGradientPaint(
            new Rectangle2D.Double(x1 - s, y0 - s, s + s, s + s), 
            fractions, colors, CycleMethod.NO_CYCLE));
        g.fill(new Rectangle2D.Double(x1, y0 - s, s, s));

        // Bottom Left
        g.setPaint(new RadialGradientPaint(
            new Rectangle2D.Double(x0 - s, y1 - s, s + s, s + s), 
            fractions, colors, CycleMethod.NO_CYCLE));
        g.fill(new Rectangle2D.Double(x0 - s, y1, s, s));

        // Bottom Right
        g.setPaint(new RadialGradientPaint(
            new Rectangle2D.Double(x1 - s, y1 - s, s + s, s + s), 
            fractions, colors, CycleMethod.NO_CYCLE));
        g.fill(new Rectangle2D.Double(x1, y1, s, s));
    }

}


你试过从红色开始,然后逐渐变为白色吗?我见过的唯一渐变要么是线性的,要么是径向的,但我从来没有见过一个向外呈矩形的渐变,所以我不完全确定如何做到这一点。你总是可以创建自己的绘制派生类来实现这一点。如果这是您希望选择的路径,那么请查看Java的源代码,了解Paint、GradientPaint以及类似的类和接口。