All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jidesoft.swing.Flashable Maven / Gradle / Ivy

/*
 * @(#)Flashable.java 3/16/2007
 *
 * Copyright 2002 - 2007 JIDE Software Inc. All rights reserved.
 */

package com.jidesoft.swing;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * Flashable is a basic interface to enable flashing in any component. Internally it uses {@link Animator}
 * to create the flashing effect.
 * 

* Whenever a Flashable is installed to a JComponent, you can always use {@link #isFlashableInstalled(javax.swing.JComponent)} * to check if it is installed. */ public abstract class Flashable { public static final String CLIENT_PROPERTY_FLASHABLE = "jide.flashable"; private int _interval = 500; protected JComponent _component; protected Animator _animator; protected Timer _timer = null; private static boolean _synchronizedFlashFlag; private static Timer _synchronizedFlashTimer; public Flashable(JComponent component) { _component = component; install(_component); } static class FlashTimer extends Timer implements ActionListener { public FlashTimer(int delay, ActionListener listener) { super(delay, listener); addActionListener(this); } public void actionPerformed(ActionEvent e) { _synchronizedFlashFlag = !_synchronizedFlashFlag; } } /** * Gets the flash flag. We have an internal timer which sets this flag value. All Flashables will use the same flash * flag so that they are all in sync when flashing. * * @return true or false. True means the flash is on and false means flash is off. */ public static boolean getSynchronizedFlashFlag() { return _synchronizedFlashFlag; } private void install(JComponent component) { _animator = new Animator(component, 0, getInterval(), -1) { @Override protected Timer createTimer(int delay, ActionListener listener) { if (_synchronizedFlashTimer == null) { _synchronizedFlashTimer = new FlashTimer(delay, listener); } _synchronizedFlashTimer.removeActionListener(listener); _synchronizedFlashTimer.addActionListener(listener); return _synchronizedFlashTimer; } @Override void stopTimer() { if (_synchronizedFlashTimer != null) { _synchronizedFlashTimer.removeActionListener(this); } } @Override void startTimer() { if (_synchronizedFlashTimer != null) { _synchronizedFlashTimer.removeActionListener(this); _synchronizedFlashTimer.addActionListener(this); if (!_synchronizedFlashTimer.isRunning()) { _synchronizedFlashTimer.start(); } } } }; _animator.addAnimatorListener(new AnimatorListener() { public void animationStarts(Component component) { } public void animationFrame(Component component, int totalStep, int step) { flash(); } public void animationEnds(Component component) { } }); component.putClientProperty(CLIENT_PROPERTY_FLASHABLE, this); } /** * Gets the table that will flash. * * @return the table. */ public JComponent getComponent() { return _component; } /** * Sets the table that will flash. * * @param component the new table. */ public void setComponent(JComponent component) { JComponent old = _component; if (old != component) { _component.putClientProperty(CLIENT_PROPERTY_FLASHABLE, null); _component = component; _component.putClientProperty(CLIENT_PROPERTY_FLASHABLE, this); } } /** * Gets the interval, in ms. * * @return the interval. */ public int getInterval() { return _interval; } /** * Sets the interval, in ms. If the flashing is running, the new interval will take effect immediately. By default, * it is 300 ms. * * @param interval the new interval. */ public void setInterval(int interval) { int old = _interval; if (old != interval) { _interval = interval; getAnimator().setDelay(interval); } } /** * This method actually does the flashing. This method is called in the actionPerformed of the timer. */ abstract public void flash(); /** * Clears any flashing effect. This method will be called in {@link #startFlashing()} and {@link #stopFlashing()}. */ abstract public void clearFlashing(); protected Animator getAnimator() { return _animator; } /** * Starts flashing. */ public void startFlashing() { clearFlashing(); getAnimator().start(); } /** * Stops flashing. */ public void stopFlashing() { clearFlashing(); getAnimator().stop(); } /** * Uninstalls the Flashable from the component. Once uninstalled, you have to create a new Flashable in * order to use thflashingng feature again. If you just want to stop flashing, you should use {@link * #stopFlashing()}. */ public void uninstall() { stopFlashing(); _animator.dispose(); _animator = null; getComponent().putClientProperty(CLIENT_PROPERTY_FLASHABLE, null); } /** * Checks if it is flashing. * * @return true if flashing. */ public boolean isFlashing() { return getAnimator().isRunning(); } /** * Checks if there is a Flashable installed on the component. * * @param component the component. * @return true if installed. */ public static boolean isFlashableInstalled(JComponent component) { Object flashable = component.getClientProperty(CLIENT_PROPERTY_FLASHABLE); return flashable instanceof Flashable; } /** * Gets the TableFlashable installed on the table, if any. * * @param component the component. * @return whether a Flashable is installed. */ public static Flashable getFlashable(JComponent component) { Object flashable = component.getClientProperty(CLIENT_PROPERTY_FLASHABLE); if (flashable instanceof Flashable) { return ((Flashable) flashable); } else { return null; } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy