Java Graphics慢慢改变颜色

我有一个渐变背景,我想慢慢地,它想改变颜色,基本上它是通过不同的颜色。 颜色必须融合所有颜色,我不希望它通过颜色轻弹,这可能吗? 请赐教解决方案,谢谢。

还要考虑java.awt.image.MemoryImageSourcejavax.swing.Timer ,如下所示。

图片

我的防守真的太难说了(无论多么聪明),(尝试和享受)

在此处输入图像描述

 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.image.BufferedImage; import java.util.LinkedList; import java.util.Queue; import java.util.Random; import javax.swing.*; public class GradientPaintWithSwingTimerAndRunnable extends JFrame implements Runnable { private static final long serialVersionUID = 1L; private Queue iconQueue = new LinkedList(); private JLabel label = new JLabel(); private Random random = new Random(); private JPanel buttonPanel = new JPanel(); private JPanel labelPanel = new JPanel(); private Timer backTtimer; private Timer labelTimer; private JLabel one = new JLabel("one"); private JLabel two = new JLabel("two"); private JLabel three = new JLabel("three"); private final String[] petStrings = {"Bird", "Cat", "Dog", "Rabbit", "Pig", "Fish", "Horse", "Cow", "Bee", "Skunk"}; private boolean runProcess = true; private int index = 1; private int index1 = 1; public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { GradientPaintWithSwingTimerAndRunnable t = new GradientPaintWithSwingTimerAndRunnable(); } }); } public GradientPaintWithSwingTimerAndRunnable() { iconQueue.add(UIManager.getIcon("OptionPane.errorIcon")); iconQueue.add(UIManager.getIcon("OptionPane.informationIcon")); iconQueue.add(UIManager.getIcon("OptionPane.warningIcon")); iconQueue.add(UIManager.getIcon("OptionPane.questionIcon")); one.setFont(new Font("Dialog", Font.BOLD, 24)); one.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); two.setFont(new Font("Dialog", Font.BOLD, 24)); two.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); three.setFont(new Font("Dialog", Font.BOLD, 10)); three.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); labelPanel.setLayout(new GridLayout(0, 3, 4, 4)); labelPanel.add(one); labelPanel.add(two); labelPanel.add(three); //labelPanel.setBorder(new LineBorder(Color.black, 1)); labelPanel.setOpaque(false); JButton button0 = createButton(); JButton button1 = createButton(); JButton button2 = createButton(); JButton button3 = createButton(); buttonPanel.setLayout(new GridLayout(0, 4, 4, 4)); buttonPanel.add(button0); buttonPanel.add(button1); buttonPanel.add(button2); buttonPanel.add(button3); //buttonPanel.setBorder(new LineBorder(Color.black, 1)); buttonPanel.setOpaque(false); label.setLayout(new BorderLayout()); label.add(labelPanel, BorderLayout.NORTH); label.add(buttonPanel, BorderLayout.SOUTH); Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); label.setPreferredSize(new Dimension(d.width / 3, d.height / 3)); add(label, BorderLayout.CENTER); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); startBackground(); startLabel2(); new Thread(this).start(); printWords(); // generating freeze Swing GUI durring EDT } private JButton createButton() { JButton button = new JButton(); button.setBorderPainted(false); button.setBorder(null); button.setFocusable(false); button.setMargin(new Insets(0, 0, 0, 0)); button.setContentAreaFilled(false); button.setIcon(nextIcon()); button.setRolloverIcon(nextIcon()); button.setPressedIcon(nextIcon()); button.setDisabledIcon(nextIcon()); nextIcon(); return button; } private Icon nextIcon() { Icon icon = iconQueue.peek(); iconQueue.add(iconQueue.remove()); return icon; } // Update background at 4/3 Hz private void startBackground() { backTtimer = new javax.swing.Timer(750, updateBackground()); backTtimer.start(); backTtimer.setRepeats(true); } private Action updateBackground() { return new AbstractAction("Background action") { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { label.setIcon(new ImageIcon(getImage())); } }; } // Update Label two at 2 Hz private void startLabel2() { labelTimer = new javax.swing.Timer(500, updateLabel2()); labelTimer.start(); labelTimer.setRepeats(true); } private Action updateLabel2() { return new AbstractAction("Label action") { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { two.setText(petStrings[index]); index = (index + 1) % petStrings.length; } }; } // Update lable one at 3 Hz @Override public void run() { while (runProcess) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { one.setText(petStrings[index1]); index1 = (index1 + 1) % petStrings.length; } }); try { Thread.sleep(300); } catch (Exception e) { e.printStackTrace(); } } } // Note: blocks EDT private void printWords() { for (int i = 0; i < petStrings.length; i++) { String word = petStrings[i].toString(); System.out.println(word); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } three.setText(word); } three.setText(" Concurency Issues in Swing
" + " never to use Thread.sleep(int)
" + " durring EDT, simple to freeze GUI "); } public BufferedImage getImage() { int w = label.getWidth(); int h = label.getHeight(); GradientPaint gp = new GradientPaint(0f, 0f, new Color( 127 + random.nextInt(128), 127 + random.nextInt(128), 127 + random.nextInt(128)), w, w, new Color(random.nextInt(128), random.nextInt(128), random.nextInt(128))); BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = bi.createGraphics(); g2d.setPaint(gp); g2d.fillRect(0, 0, w, h); g2d.setColor(Color.BLACK); return bi; } }