我有一个JPanel,我想在其中绘制一个渐变.我有下面的代码,但只绘制了2种颜色渐变.我想添加一个3,但不知道如何.我想要的是将面板的左上角设置为白色,右上角设置为红色,并且两个底角都设置为黑色.我要怎么做才能达到这个目的,就像这样:
I have a JPanel, and I would like to paint a gradient within it. I have the code below, but that only paints a 2 color gradient. I would like to add a 3rd but don't know how. What I want is to have the top left of the panel as white, top right red, and both bottom corners black. What would I have to do to achieve this, something that looks like this:
package pocketshop.util; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JPanel; public class ColorPicker extends JPanel{ public ColorPicker(){ repaint(); } @Override public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2d = (Graphics2D)g; int w = getWidth(); int h = getHeight(); GradientPaint gp = new GradientPaint( 0, 0, Color.white, 0, h, Color.black); g2d.setPaint(gp); g2d.fillRect(0, 0, w, h); } }
可能的解决方案
Possible solution
我能够使用2个渐变(一个水平和一个垂直)得出这样的结果:
I was able to come up with using 2 gradients one horizontal and one vertical, like this:
public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2d = (Graphics2D)g; int w = getWidth(); int h = getHeight(); // Vertical GradientPaint gp = new GradientPaint( 0, 0, new Color(0,0,0,0), 0, h, Color.black); // Horizontal GradientPaint gp2 = new GradientPaint( 0, 0, Color.white, w, 0, Color.red, true); g2d.setPaint(gp2); g2d.fillRect(0, 0, w, h); g2d.setPaint(gp); g2d.fillRect(0, 0, w, h); }推荐答案
像这样吗?
import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import javax.imageio.ImageIO; import javax.swing.*; public class ThreeWayGradient { public static void main(String[] args) { final BufferedImage image = new BufferedImage( 200, 200, BufferedImage.TYPE_INT_RGB); Runnable r = new Runnable() { @Override public void run() { Graphics2D g = image.createGraphics(); GradientPaint primary = new GradientPaint( 0f, 0f, Color.WHITE, 200f, 0f, Color.ORANGE); GradientPaint shade = new GradientPaint( 0f, 0f, new Color(0, 0, 0, 0), 0f, 200f, new Color(0, 0, 0, 255)); g.setPaint(primary); g.fillRect(0, 0, 200, 200); g.setPaint(shade); g.fillRect(0, 0, 200, 200); JLabel l = new JLabel(new ImageIcon(image)); JOptionPane.showMessageDialog(null, l); File f = new File(System.getProperty("user.home"), "ThreeWayGradient.png"); try { ImageIO.write(image, "png", f); } catch (IOException ex) { ex.printStackTrace(); } } }; SwingUtilities.invokeLater(r); } }
将其制成工厂方法
..因为它更漂亮.
Making it into a factory method
..because it is prettier.
import java.awt.*; import java.awt.image.BufferedImage; import javax.swing.*; public class ThreeWayGradient { public static BufferedImage getThreeWayGradient( int size, Color primaryLeft, Color primaryRight, Color shadeColor) { BufferedImage image = new BufferedImage( size, size, BufferedImage.TYPE_INT_RGB); Graphics2D g = image.createGraphics(); GradientPaint primary = new GradientPaint( 0f, 0f, primaryLeft, size, 0f, primaryRight); int rC = shadeColor.getRed(); int gC = shadeColor.getGreen(); int bC = shadeColor.getBlue(); GradientPaint shade = new GradientPaint( 0f, 0f, new Color(rC, gC, bC, 0), 0f, size, shadeColor); g.setPaint(primary); g.fillRect(0, 0, size, size); g.setPaint(shade); g.fillRect(0, 0, size, size); g.dispose(); return image; } /** * Presumed to have a layout that shows multiple components. */ public static void addGradient( JPanel p, int s, Color pL, Color pR, Color sh) { JLabel l = new JLabel(new ImageIcon(getThreeWayGradient(s, pL, pR, sh))); p.add(l); } public static void main(String[] args) { Runnable r = new Runnable() { @Override public void run() { JPanel gui = new JPanel(new GridLayout(2,4,1,1)); addGradient(gui,100,Color.YELLOW,Color.RED,Color.GREEN); addGradient(gui,100,Color.GREEN,Color.YELLOW,Color.RED); addGradient(gui,100,Color.RED,Color.GREEN,Color.YELLOW); addGradient(gui,100,Color.BLUE,Color.MAGENTA,Color.PINK); addGradient(gui,100,Color.WHITE,Color.RED,Color.BLACK); addGradient(gui,100,Color.RED,Color.GREEN,Color.BLACK); addGradient(gui,100,Color.BLUE,Color.PINK,Color.BLACK); addGradient(gui,100,Color.BLUE,Color.CYAN,Color.BLACK); JOptionPane.showMessageDialog(null, gui); } }; SwingUtilities.invokeLater(r); } }
更多推荐
Java 3颜色渐变
发布评论