1 votes

Changer temporairement la couleur d'arrière-plan d'un JButton ?

Je suis très novice en Java et j'ai besoin d'aide. Je suis en train de faire une petite application de bureau en Java où j'ai essentiellement une grille de 4 boutons JB (grille de 2 x 2), et j'ai besoin que la couleur de fond des boutons JB individuels change, et après une seconde, revienne à la couleur originale (le jeu que j'essaie de faire est comme Simon, où vous devez suivre un modèle de boutons qui s'allument). J'ai un vecteur qui contient des nombres générés aléatoirement dans la plage de 1 à 4, et je veux pouvoir obtenir chaque élément du vecteur et faire en sorte que le bouton correspondant change de couleur pendant une seconde (par exemple, si le vecteur contient 2 4 1, je voudrais que le bouton 2 change, puis que le bouton 4 change, puis que le bouton 1 change).

Est-ce possible ou existe-t-il une meilleure façon de procéder avec autre chose que des boutons JB ? Comment puis-je mettre cela en œuvre ?

De plus, j'utilise Mac OS X, qui apparemment (d'après certaines choses que j'ai lues sur des forums) n'aime pas que l'arrière-plan des JButtons change (je pense que c'est à cause de l'apparence du système), comment puis-je changer cela pour que cela fonctionne sur Mac ?

Merci d'avance pour toute aide :)

3voto

trashgod Points 136305

Une approche consiste à étendre JToggleButton et de passer outre paintComponent() pour afficher la couleur. A javax.swing.Timer peut contrôler le timing. Voici un exemple un peu plus élaboré exemple .

private static class SimonButton extends JToggleButton {

    private final Color color;
    Dimension size = new Dimension(100, 100);

    public SimonButton(Color color) {
        this.color = color;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (this.isSelected()) {
            g.setColor(color);
        } else {
            g.setColor(Color.lightGray);
        }
        g.fillRect(0, 0, this.getWidth(), this.getHeight());
    }

    @Override
    public Dimension getPreferredSize() {
        return size;
    }
}

3voto

camickr Points 137095

Vous pouvez simplement utiliser la méthode setBackground(...) pour définir la couleur, puis utiliser un temporisateur Swing pour réinitialiser l'arrière-plan lorsqu'il se déclenche.

Editar:

Si votre problème est que la méthode setBackground() ne fonctionne pas sur certains LAF, vous pouvez ajouter une icône au bouton qui est simplement une couleur unie. Pour modifier la couleur d'arrière-plan, il suffit de changer l'icône.

2voto

rob Points 3107

Pour vos besoins, vous ne devez pas nécessairement utiliser une JButton . Vous pouvez utiliser JLabels o JPanels .

Pendant l'initialisation, vous pouvez setBackground() sur chacun d'entre eux pour définir sa couleur, et ajoutez un MouseListener à chacun d'eux pour détecter un clic.

Pour faire clignoter le motif Simon, créez un javax.swing.Timer qui se déclenche une fois par seconde. (Vous voudrez peut-être rendre le délai configurable si 1 seconde vous semble long). Pour simplifier, le minuteur pourrait setOpaque(false) sur tous les JLabels alors setOpaque(true) sur le JLabel dont vous voulez faire clignoter la couleur. Notez que vous pouvez attendre la prochaine itération du timer avant de faire setOpaque(true) pour que les flashes ne fonctionnent pas ensemble si vous voulez flasher la même chose. JLabel plusieurs fois de suite.

L'avantage d'utiliser setOpaque() est que vous pouvez définir la MouseListener pour simplement appeler setOpaque(true) sur la presse et setOpaque(false) lors de la libération, et vérifiez si le bon JLabel a été cliqué, sans avoir à recalculer de manière répétée la couleur à utiliser pour une opération donnée. JLabel .

0voto

Ajay Yadav Points 1
okJButton = new JButton() {
@Override
public void paintComponent(Graphics g) {
    g.setColor(Color.decode("0X123456"));
    g.fillRect(0, 0, getSize().width, getSize().height);
}
};
okJButton.setForeground(Color.white);
okJButton.setBorder(new LineBorder(Color.white, 1));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X