Je souhaite utiliser un JLabel dans un environnement très simple, mais je me demande pourquoi je dois définir l'emplacement à chaque repeinture.

Code:

public class Example {
    public static void main(String[] args) {
        JFrame frame = buildFrame();
        TestPane pane = new TestPane();

        frame.add(pane);

        while (true) {
            pane.repaint();
            frame.setVisible(true);
        }
    }

    private static JFrame buildFrame() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(480, 272);
        frame.setVisible(true);
        return frame;
    }
}

public class TestPane extends JPanel {
    JLabel testLabel = new JLabel("TEST");

    TestPane() {
        super();
        add(testLabel);
        testLabel.setLocation(200, 200);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        testLabel.setLocation(200, 200); // without this line, the label will always be at the top center
    }
}

La mise en page en boucle provient de diverses animations avec des images que je fais. Pourquoi le repaint réinitialise-t-il toujours l'emplacement de toutes les étiquettes, je dois donc définir l'emplacement sur chaque paintComponent ?

0
fortuneNext 7 oct. 2019 à 17:46

1 réponse

Meilleure réponse

pourquoi je dois définir l'emplacement sur chaque repeinture.

Vous ne le faites pas. En fait, vous ne devriez jamais définir la position ou tout type de contrainte d'un composant dans la méthode paintComponent. La méthode paintComponent est uniquement pour la peinture, pas pour l'orientation ou quoi que ce soit d'autre.

Lorsque vous jpanel.add(myComponent, constraints) la position du composant sera décidée par le LayoutManager actuel du conteneur . (Lorsque vous jpanel.add(myComponent); sans aucune contrainte, les contraintes par défaut seront appliquées, chaque gestionnaire de mise en page ayant sa propre valeur par défaut).

L'étiquette est placée en haut du panneau car vous ne définissez pas la disposition du panneau, elle a donc sa valeur par défaut, qui est FlowLayout. Afin de le modifier, vous devrez utiliser un autre gestionnaire de mise en page avec les contraintes appropriées.

Par exemple, pour le placer au centre du panneau, vous devez faire :

jpanel.setLayout(new BorderLayout());
jpanel.add(myLabel,BorderLayout.CENTER);

Enfin, en faisant while(true) dans le thread où votre interface graphique est exécutée, cela bloquera le thread, ce qui signifie que l'interface graphique sera "gelée" car les événements ne peuvent pas avoir lieu.

2
George Z. 7 oct. 2019 à 15:25