Java - Comment flasher la fenêtre JPanel


J'ai une fenêtre JPanel avec quelques choses dessinées dessus. J'essaie de comprendre comment je peux flasher l'écran, comme un simple flash, pour attirer l'attention des utilisateurs? J'ai trouvé une question précédente à ce sujet, mais cela n'a pas fonctionné pour ce que j'essaie de faire. J'ai une boucle qui met à jour l'écran en fonction de quelques variables. Je voudrais juste que l'écran clignote à un certain moment, puis revienne à la normale.

Merci!

Author: Hovercraft Full Of Eels, 2012-07-31

3 answers

Vous pouvez utiliser Trident pour interpoler les différentes propriétés dans votre classe. Voici une démo qui anime l'arrière-plan du panneau:

import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import org.pushingpixels.trident.Timeline;
import org.pushingpixels.trident.Timeline.RepeatBehavior;

public class TestPanel {
    private static void createAndShowGUI() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        panel.add(new JLabel("Some text"));

        frame.add(panel);
        frame.pack();
        frame.setVisible(true);

        final Timeline timeline = new Timeline(panel);
        timeline.addPropertyToInterpolate("background", panel.getBackground(),
                Color.red);
        timeline.setDuration(1000);

        timeline.playLoop(5, RepeatBehavior.REVERSE);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

EDIT: commentaires pour masquer automatiquement une fenêtre contextuelle

Vous pouvez utiliser la minuterie pour masquer une fenêtre, par exemple:

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

public class TempPopup {

    public static void main(String[] args) {

        JOptionPane pane = new JOptionPane("Message",
                JOptionPane.INFORMATION_MESSAGE);
        final JDialog dialog = pane.createDialog(null, "Title");

        Timer timer = new Timer(2000, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dialog.setVisible(false);
                dialog.dispose();
            }
        });
        timer.setRepeats(false);
        timer.start();
        dialog.setVisible(true);
        dialog.dispose();
    }
}
 3
Author: tenorsax, 2012-08-01 18:22:40

Utiliser une vitre composant comme dans l'exemple de démonstration ci-dessous:


import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Demo {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        final JPanel panel = new JPanel();
        frame.add(panel);

        JComponent flashPane = new JComponent() {
            @Override
            public void paint(Graphics g) {
                // Add code to draw whatever you want to grab attention here
                g.setColor(Color.CYAN);
                g.fillRect(0, 0, panel.getWidth(), panel.getHeight());
                super.paint(g);
            }
        };

        panel.getRootPane().setGlassPane(flashPane);
        frame.setBounds(0, 0, 200, 200);
        frame.setVisible(true);

        // Sample loop to flash every 2 seconds
        while(true) {
            try {
                Thread.sleep(2000);
                flashPane.setVisible(true);
                Thread.sleep(200);
                flashPane.setVisible(false);
            } catch(Exception ex) {
            }
        }
    }
}
 1
Author: Sticks, 2012-07-31 18:00:34

Je suggérerais un pseudo-code comme ceci:

if(your flash condition is true){
yourFrame.visible = False; // no longer display the frame.
Thread.sleep(500); // waits for half a second.
yourFrame.visible = True; // show the frame again.
}

Vous voudrez peut-être valider votre vue (cadre) après pour vous assurer que tous les changements qui peuvent s'être produits dans votre modèle (variables, etc.) sont reflétés après le réveil du thread et que le cadre est à nouveau affiché.

 -1
Author: James C, 2012-07-31 23:13:59