2017-10-17 2 views
0

Ich möchte die Hintergrundänderung auf einem ContentPane über einen bestimmten Zeitraum vornehmen.Ändern der ContentPane-Hintergrundfarbe im Laufe der Zeit

Ich habe eingestellte Standard bg Farbe in der Klasse

getContentPane().setBackground(Color.white);     

und dann auf ButtonActionPerformed ich Benutzer möchte eine andere Farbe wählen, und dann, wenn nicht null der Hintergrund dieser Farbe (der Standard ein und Auserwählte ändern sollte)

Im Moment funktioniert das, aber es ändert nur die Standardfarbe auf neue gewählte Farbe in der angegebenen Zeit.

+0

Möchten Sie die Farbe überblenden? – MadProgrammer

+0

Farbmischung [Beispiel] (https://stackoverflow.com/questions/21270610/java-smooth-color-transition/21270957#21270957), [Beispiel] (https://stackoverflow.com/questions/13223065/color- fading-algorithm/13223818 # 13223818) – MadProgrammer

+0

es muss nicht verblasst sein – mth

Antwort

0

können Sie den folgenden Code verwenden:

import java.awt.Color; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.function.Consumer; 
import javax.swing.JButton; 
import javax.swing.JColorChooser; 
import javax.swing.JFrame; 
import javax.swing.Timer; 

public class Main { 
    public static class Blinker { 
     private Color color1; 
     private Timer timer; 
     private Consumer<Color> setColor; 
     private int timesBlinked; 

     public Blinker(int delay, int blinkTimes, Color color1, Color color2, Consumer<Color> setColor) { 
      this.color1 = color1; 
      this.setColor = setColor; 
      timesBlinked = 0; 
      timer = new Timer(delay, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        if (timesBlinked < blinkTimes) { 
         if (timesBlinked % 2 == 0) 
          setColor.accept(color2); 
         else 
          setColor.accept(color1); 
         ++timesBlinked; 
        } 
        else 
         stop(); 
       } 
      }); 
     } 

     private void stop() { 
      timer.stop(); 
     } 

     public void start() { 
      setColor.accept(color1); 
      timer.start(); 
     } 
    } 

    public static void startBlink(int delay, int blinkTimes, Color color1, Color color2, Consumer<Color> setColor) { 
     new Blinker(delay, blinkTimes, color1, color2, setColor).start(); 
    } 

    public static class YourJFrame extends JFrame { 
     public YourJFrame(String title) { 
      super(title); 

      JButton button = new JButton("Choose color"); 
      button.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        Color bgC = JColorChooser.showDialog(null, "Choose color: ", Color.YELLOW); 
        if (bgC != null) 
         startBlink(500, 7, getContentPane().getBackground(), bgC, c -> getContentPane().setBackground(c)); //Change the number arguments at will. 
       } 
      }); 

      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      getContentPane().setLayout(new GridBagLayout()); //Just to keep the button centered. 
      getContentPane().add(button); 
      getContentPane().setBackground(Color.WHITE); 
      pack(); 
      setLocationRelativeTo(null); 
      setVisible(true); 
     } 
    } 

    public static void main(final String[] args) { 
     new YourJFrame("Blinker frame").setSize(250, 250); 
    } 
} 

Das delay Argument startBlink Methode bestimmt die Geschwindigkeit des zu blinken.
Je niedriger die Zahl, desto höher die Geschwindigkeit.

Das blinkTimes Argument der startBlink Methode bestimmt, wie oft die Farben blinken (abwechselnd).
Denken Sie daran, dies eine ungerade Anzahl zu halten, wenn Sie möchten, dass die Farbe endgültig geändert wird.

Sie können einfach die Klasse Blinker und die Methode startBlink in Ihren Code kopieren, um loszulegen.

+0

Großartig! Vielen Dank! Ich habe es geschafft, es so zu implementieren – mth

0

Etwas wie:

Timer bT = new Timer (TIMER_DELAY, new ActionListener() { 
    static final int[] startRGB = { 255, 255, 255 }; 
    int[] endRGB = { bg.getRed(), bg.getGreen(), bg.getBlue() }; 
    int pct = 0; 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     ++pct; 

     int[] rgb = new int[3]; 
     for (int i = 0; i < 3; ++i) { 
      rgb[i] = (pct*startRGB[i] + (100 - pct)*endRGB[]i])/100; 
     } 
     getContentPane().setBackground(new Color(rgb[0], rgb[1], rgb[2])); 
     repaint(50L); 
     if (pct == 100) { 
      stop(); 
     } 
    } 
}); 

Hier 100 Schritte sollten setRepeats(true) haben einen Prozentsatz pct und Schrittweite 1.

Timer verwenden.

Verwandte Themen