warum ist paintComponent() nie aufgerufen, indem Sie repaint()?

Ich habe ein Programm, das zeichnet benutzerdefinierte JComponents auf einem JLayeredPane jedoch alle Aufrufe von repaint() auf die Komponenten scheinen, nichts zu tun, noch die paintComponent-Methode wird automatisch aufgerufen, wenn das Fenster die Größe neu.

Habe ich nach einige Ratschläge, die hier gegeben:
Warum ist paint()/paintComponent() nie aufgerufen wird?

Aber keine der Lösungen scheint zu beheben mein problem, update-swing-Komponenten auf der EDT, die Einstellung, die Größe der Komponente manuell vor dem Aufruf von repaint(), Aufruf von super.paintComponent(g) in der überschriebenen paintComponent() und Aufruf von revalidate() auf den frame aus, nach dem hinzufügen von neuen Komponenten (obwohl diese natürlich nicht das Problem in diesem Fall)

Irgendwelche Ideen, was das sein könnte beenden Sie den Anruf? Vielen Dank im Voraus 🙂

Hier ist der code für die Ansicht und die SVGElementContainer, anzeigen.setFile() ist der Einstiegspunkt, wie es wird aufgerufen, wenn ein neues Dokument dargestellt werden muss.

public class View extends JLayeredPane implements SVGViewport {

    private SVGDocument document;
    //Array list of the SVGElementContainer components
    private ArrayList<SVGElementContainer> elemContainers;
    private SVGFrame frame;
    private int elemCount;
    private Border viewBorder;
    private int borderWidth = 1;

    //panels displayed on the JLayeredPane
    private JPanel backgroundPanel;

    /** Creates a new view */
    public View(SVGFrame frame) {
        super();
        this.frame = frame;
        elemCount = 0;

        elemContainers = new ArrayList<SVGElementContainer>();
        viewBorder = BorderFactory.createLineBorder(Color.BLACK, borderWidth);
    }

    public float getViewportWidth() {
        return getWidth();
    }

    public float getViewportHeight() {
        return getHeight();
    }

    //paints all elements and adds them to the JLayeredPane
    public void paintAllElements(){

        System.out.println("Painting all elements");

        //Paint document
        for (SVGElement elem : document) {
            //only paint stylable (rect, line, circle) elements
            if (elem instanceof SVGStylable){
                //create a new SVGElementContainer
                SVGElementContainer newElemCont = new SVGElementContainer();

                //add component to JLayeredPane
                elemCount++;
                this.add(newElemCont, new Integer(elemCount + 1));

                //set the current element within its container and calls repaint() on the component
                System.out.println("Painting element #" + elemCount);
                newElemCont.setElement(elem);
                newElemCont.repaint();
            }
            else {
                System.out.println("Skip painting group element!");
            }
        }
    }

    /** Gets the document currently being displayed by the view. */
    public SVGDocument getDocument() {
        return document;
    }

    /** Sets the document that the view should display.
     *
     * @param document the document to set
     */
    public void setDocument(SVGDocument document) {
        this.document = document;
        //paintBackground();
        paintAllElements();
        revalidate();
    }

    public void revalidate(){
        //calls validate() on the frame in order to display newly added components
        frame.getContentPane().validate();
    }
}

public class SVGElementContainer extends JPanel{

    private SVGElement elem;

    public SVGElementContainer(){
        super();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        System.out.println("PAINT METHOD CALLED!");
        paint2D((Graphics2D) g);
    }

    //paint the element onto this JComponent
    public void paint2D(Graphics2D g){
        if (!(elem instanceof SVGStylable)){
            System.out.println("Skipping non-stylable element!");
            return;
        }

        setOpaque(false);

        Shape shape = elem.createShape();

        //get fill stroke and width properties
        SVGStylable style = (SVGStylable) elem;
        SVGPaint fillPaint = style.getFill();
        SVGPaint strokePaint = style.getStroke();
        SVGLength strokeWidth = style.getStrokeWidth();

        //Fill the interior of the shape
        if (fillPaint.getPaintType() == SVGPaint.SVG_PAINTTYPE_RGBCOLOR) {
            g.setPaint(fillPaint.getRGBColor());
            g.fill(shape);
        }

        //Stroke the outline of the shape
        if (strokePaint.getPaintType() == SVGPaint.SVG_PAINTTYPE_RGBCOLOR) {
            Stroke stroke = new BasicStroke(strokeWidth.getValue());
            g.setStroke(stroke);
            g.setColor(strokePaint.getRGBColor());
            g.draw(shape);
        }
    }

    public void setElement(SVGElement elem){
        this.elem = elem;
        setComponentSize();
    }

    private void setComponentSize(){

        //this.setPreferredSize(new Dimension(
        // (int)elem.getDocument().getWidth().getValue(),
        // (int)elem.getDocument().getHeight().getValue()));

        this.setSize(new Dimension(
                (int)elem.getDocument().getWidth().getValue(),
                (int)elem.getDocument().getHeight().getValue()));
    }

}
  • Für bessere Hilfe früher, nach einem SSCCE.
  • Vielen Dank, Ihre Beschreibung geholfen mein problem zu lösen - ich nicht aufrufen super.paintComponent(Graphics).
InformationsquelleAutor Sirhc | 2011-05-05
Schreibe einen Kommentar