Question

Dans le programme exemple suivant, si vous définissez useBorderlayout true, la méthode paintComponent est jamais appelé -, pourquoi

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

public class PaintComponentTest extends JPanel {
    private final boolean useBorderLayout;

    public PaintComponentTest(boolean useBorderLayout){
        this.useBorderLayout = useBorderLayout;
        initialiseComponents();
    }

    public void initialiseComponents(){
        setOpaque(true);
        setBackground(Color.RED);
        if(useBorderLayout){
            //this appears to be the offending line:
            setLayout(new BorderLayout());
        }
        final JPanel panel = new JPanel();
        panel.setOpaque(true);
        panel.setBackground(Color.GREEN);
        add(panel, BorderLayout.CENTER);

    }
    @Override
    public void paintComponent(Graphics g){
        System.out.println("PaintComponentTest.paintComponent");
        super.paintComponent(g);
    }

    public static void main(String [] args){
        final boolean useBorderLayout = (args.length == 1 && Boolean.parseBoolean(args[0]));

        System.out.println("Running with"+(useBorderLayout?"":"out")+" BorderLayout as layout manager...");

        SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                final JFrame frame = new JFrame("BorderLayout/PaintComponent test");
                frame.setPreferredSize(new Dimension(200, 200));
                frame.getContentPane().setLayout(new BorderLayout());
                final PaintComponentTest componentTest = new PaintComponentTest(useBorderLayout);
                frame.getContentPane().add(componentTest);
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}
Était-ce utile?

La solution

Parce qu'il n'a pas besoin de. La classe PaintComponentTest est un JPanel qui a un JPanel vert comme contenu. Lorsque le BorderLayout est réglé, le panneau vert prend tout l'espace dans le panneau et la méthode de paintComponent n'est pas nécessaire.

Ajouter cette méthode à votre code et vous devriez voir arriver:

    @Override
    public void paintChildren(Graphics g){
        System.out.println("PaintComponentTest.paintChildren");
        super.paintChildren(g);
    }

Autres conseils

Parce que le panneau imbriqué couvre l'ensemble du composant. région Damaged (à repeindre) est passé aux enfants parce que les limites de l'enfant couvrent toute la région endommagée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top