2014-07-12 4 views
3

Я пытаюсь реализовать метод draw(Graphics2D g) для чего-то в моем пользовательском интерфейсе. Это не качели, и я сам рисую рисунок. Я пытаюсь создать градиент границы, как это изображениеRectangular Gradient

gradient border

Как нарисовать градиент, похожий на этот?

+0

Вы пробовали, начиная с красным затем постепенно угасает до белого? –

+1

Единственные градиенты, которые я когда-либо видел, были линейными или радиальными, но я никогда не видел ни одного, который вышел наружу в прямоугольной форме, поэтому я не совсем уверен, как это сделать. – Kyranstar

+0

Вы всегда можете создать свой собственный Paint-производный класс, который сделает это. Если это путь, который вы хотите выбрать, ознакомьтесь с исходным кодом Java для Paint, GradientPaint и аналогичных классов и интерфейсов. –

ответ

3

Вы действительно не указать то, что вы хотите, но если это то, что я думаю, , что это так, то она несколько похожа на то, что я написал в my answer to "How to make gradient border of an image using java?".

Трюк здесь заключается в том, чтобы не создавать одну градиентную краску и не заполнять одну фигуру. Вместо этого область, которая должна быть заполнена градиентами, делится на 8 частей: четыре края и четыре угла. Края заполнены простыми градиентными красками. Уголки заполнены радиальными градиентными красками. Тогда речь идет только о том, чтобы возиться с координатами, но это можно сделать довольно обычным образом, когда внутренняя форма задается как Rectangle2D.

Однако результат может затем, например, выглядеть следующим образом:

enter image description here

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)); 
    } 

}