Maison > Java > javaDidacticiel > Pourquoi mes JButtons se comportent-ils de manière inattendue lorsque je redimensionne ma fenêtre Java ?

Pourquoi mes JButtons se comportent-ils de manière inattendue lorsque je redimensionne ma fenêtre Java ?

Barbara Streisand
Libérer: 2024-12-14 17:21:15
original
453 Les gens l'ont consulté

Why are my JButtons behaving unexpectedly when I resize my Java window?

Quelque chose ne va pas avec la mise en page, JButton montrant un comportement inattendu lors du redimensionnement de la fenêtre

Le problème décrit implique un comportement inattendu de l'interface utilisateur graphique (GUI) d'une application Java lorsque la fenêtre est redimensionnée. Redimensionner la fenêtre entraîne une modification du comportement de certains composants de JButton, notamment le texte et la couleur du bouton.

Analyse du problème

Pour comprendre le problème, il est essentiel d'examiner le code et identifiez les dépendances entre la taille de la fenêtre et le comportement des composants JButton. Le problème peut résider dans la façon dont les composants sont disposés ou dans la façon dont leurs propriétés sont gérées.

Révision du code

Le code fourni utilise un ComponentAdapter pour détecter les changements dans la taille du Composant DrawingArea. Lorsque la taille change, les actions suivantes sont déclenchées :

  • Le minuteur est redémarré.
  • Le texte sur le bouton "Démarrer/Arrêter" est remplacé par "Stop".
  • isTimerRunning est défini sur true.

Ces actions sont sans aucun doute destinées à garantir que le minuteur démarre lorsque la fenêtre est redimensionné. Cependant, le code ne gère pas le redimensionnement d'autres composants, tels que les composants JButton.

Cause du comportement inattendu

Le comportement inattendu est probablement dû à la façon dont les composants JButton sont disposés. et comment leurs propriétés sont gérées. Lorsque la fenêtre est redimensionnée, le gestionnaire de mise en page peut réorganiser les composants, ce qui peut affecter leurs propriétés. Par exemple, le texte sur les boutons peut être tronqué ou les couleurs peuvent changer.

Solutions possibles

Pour résoudre le problème, tenez compte des suggestions suivantes :

  1. Utilisez un gestionnaire de mise en page qui gère mieux le redimensionnement : Remplacez le GridLayout par un gestionnaire de mise en page plus adapté à la gestion du redimensionnement, tel que GridBagLayout ou SpringLayout.
  2. Utiliser le positionnement absolu : Au lieu d'utiliser un gestionnaire de mise en page, vous pouvez spécifier manuellement la taille et la position des composants JButton en utilisant le positionnement absolu. Cette approche garantit que les composants conservent leurs propriétés souhaitées quelle que soit la taille de la fenêtre.
  3. Ajouter des propriétés au gestionnaire de mise en page : Si vous souhaitez utiliser un gestionnaire de mise en page spécifique, vous pouvez y ajouter des propriétés pour contrôler son comportement lorsque la fenêtre est redimensionnée. Cela vous permet de personnaliser le gestionnaire de mise en page pour répondre à vos besoins spécifiques.
  4. Utiliser SwingWorker : SwingWorker peut être utilisé pour effectuer des tâches de longue durée dans un thread séparé, ce qui peut aider à empêcher l'interface graphique. du gel lors du redimensionnement.

Exemple d'implémentation

Voici un exemple d'implémentation qui utilise un GridBagLayout pour gérer la mise en page et garantir que les composants JButton conservent leurs propriétés souhaitées :

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class BallAnimation {

    private int x;
    private int y;
    private boolean positiveX;
    private boolean positiveY;
    private boolean isTimerRunning;
    private int speedValue;
    private int diameter;
    private DrawingArea drawingArea;
    private Timer timer;
    private Queue<Color> clut = new LinkedList<>(Arrays.asList(
        Color.BLUE.darker(),
        Color.MAGENTA.darker(),
        Color.BLACK,
        Color.RED.darker(),
        Color.PINK,
        Color.CYAN.darker(),
        Color.DARK_GRAY,
        Color.YELLOW.darker(),
        Color.GREEN.darker()));
    private Color backgroundColour;
    private Color foregroundColour;

    private ActionListener timerAction = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            x = getX();
            y = getY();
            drawingArea.setXYColourValues(x, y, backgroundColour, foregroundColour);
        }
    };

    private JPanel buttonPanel;
    private JButton startStopButton;
    private JButton speedIncButton;
    private JButton speedDecButton;
    private JButton resetButton;
    private JButton colourButton;
    private JButton exitButton;

    public BallAnimation() {
        x = y = 0;
        positiveX = positiveY = true;
        speedValue = 1;
        isTimerRunning = false;
        diameter = 50;
        backgroundColour = Color.white;
        foregroundColour = clut.peek();
        timer = new Timer(10, timerAction);
    }

    private void createAndDisplayGUI() {
        JFrame frame = new JFrame("Ball Animation");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        drawingArea = new DrawingArea(x, y, backgroundColour, foregroundColour, diameter);
        drawingArea.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent ce) {
                timer.restart();
                startStopButton.setText("Stop");
                isTimerRunning = true;
            }
        });

        JPanel contentPane = frame.getContentPane();
        contentPane.setLayout(new BorderLayout());
        contentPane.add(makeButtonPanel(), BorderLayout.EAST);
        contentPane.add(drawingArea, BorderLayout.CENTER);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JPanel makeButtonPanel() {
        buttonPanel = new JPanel(new GridBagLayout());
        buttonPanel.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 5));

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;

        startStopButton = makeButton("Start", gbc, 0, 0);
        colourButton = makeButton("Change Color", gbc, 0, 1);
        exitButton = makeButton("Exit", gbc, 0, 2);

        return buttonPanel;
    }

    private JButton makeButton(String text, GridBagConstraints gbc, int row, int column) {
        JButton button = new JButton(text);
        button.setOpaque(true);
        button.setForeground(Color.WHITE);
        button.setBackground(Color.GREEN.DARKER);
        button.setBorder(BorderFactory.createLineBorder(Color.GRAY, 4));
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                if (button == startStopButton) {
                    if (!isTimerRunning) {
                        startStopButton.setText("Stop");
                        timer.start();
                        isTimerRunning = true;
                    } else {
                        startStopButton.setText("Start");
                        timer.stop();
                        isTimerRunning = false;
                    }
                } else if (button == colourButton) {
                    clut.add(clut.remove());
                    foregroundColour = clut.peek();
                    drawingArea.setXYColourValues(x, y, backgroundColour, foregroundColour);
                    colourButton.setBackground(foregroundColour);
                } else if (button == exitButton) {
                    timer.stop();
                    System.exit(0);
                }
            }
        });
        gbc.gridx = column;
        gbc.gridy = row;
        buttonPanel.add(button, gbc);
        return button;
    }

    private int getX() {
        if (x < 0) {
            positiveX = true;
        } else if (x >= drawingArea.getWidth() - diameter) {
            positiveX = false;
        }
        return calculateX();
    }

    private int calculateX() {
        if (positiveX) {
            return (x += speedValue);
        } else {
            return (x -= speedValue);
        }
    }

    private int getY() {
        if (y < 0) {
            positiveY = true;
        } else if (y >= drawingArea.getHeight() - diameter) {
            positiveY = false;
        }
        return calculateY();
    }

    private int calculateY() {
        if (positiveY) {
            return (y += speedValue);
        } else {
            return (y -= speedValue);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new BallAnimation().createAndDisplayGUI());
    }
}

class DrawingArea extends JComponent {

    private int x;
    private int y;
    private int ballDiameter;
    private Color backgroundColor;
    private Color foregroundColor;

    public DrawingArea(int x, int y, Color bColor, Color fColor, int dia) {
        this.x = x;
        this.y = y;
        ballDiameter = dia;
        backgroundColor = bColor;
        foregroundColor = fColor;
        setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 5));
    }

    public void setXYColourValues(int x, int y, Color bColor, Color fColor) {
        this.x = x;
        this.y = y;
        backgroundColor = bColor;
        foregroundColor = fColor;
        repaint();
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(500, 400);
    }

    @Override
    public void paintComponent(Graphics g) {
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal