2015-07-04 95 views
2

当我使用矩形的(0,0)“矩形(0,0,100,100)”的坐标时,我获得渐变。当我使用时:移动一个具有渐变填充的矩形

GradientPaint gp = new GradientPaint(0, 0, c1, 0, 100, c2); 
Rectangle reckt = new Rectangle(0,100,100,200); 

渐变消失。我究竟做错了什么?

public void draw(Graphics g) { 
    Graphics2D g2d = (Graphics2D) g; 

    c1 = new Color(0, 0, 255); 
    c2 = new Color(0, 255, 255); 
    GradientPaint gp = new GradientPaint(0, 0, c1, 0, 100, c2); 

    g2d.setPaint(gp); 
    Rectangle reckt = new Rectangle(0,0,100,100); 
    g2d.fill(reckt); 

} 
+1

使用AffineTransform并转换位置,然后只需在0x0处绘制/绘制。完成后请不要忘记重置它 – MadProgrammer

回答

1

前两个参数定义了渐变开始时的x/y点,第四个和第五个参数定义了高度和宽度。所以基本上,你绘制您的矩形以外的渐变填充

你有两个选择,要么改变,如果GradientFill的X/Y位置或使用AffineTransformtranslateGraphics背景下,你想画,简单地总是在画为0x0两种

一个AffineTransform允许你翻译(除其他事项外)的Graphics顶部/左侧位置,例如...

Translated

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GradientPaint; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.geom.AffineTransform; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestTranslate { 

    public static void main(String[] args) { 
     new TestTranslate(); 
    } 

    public TestTranslate() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Color c1 = new Color(0, 0, 255); 
      Color c2 = new Color(0, 255, 255); 
      GradientPaint gp = new GradientPaint(0, 0, c1, 0, 100, c2); 
      for (int offset = 0; offset < getWidth(); offset += 50) { 
       Graphics2D g2d = (Graphics2D) g.create(); 
       g2d.setPaint(gp); 
       g2d.setTransform(AffineTransform.getTranslateInstance(offset, offset)); 
       g2d.fill(new Rectangle(0, 0, 100, 100)); 
       g2d.dispose(); 
      } 
     } 

    } 

} 
+0

您可以帮助我使用AffineTransform吗? – user3130648

+0

我用过: 'AffineTransform move = new AffineTransform(); move.translate(200,200); g2d1.setTransform(move);' – user3130648

+0

@ user3130648查看更新 – MadProgrammer