Erzeugen eines leeren Graphics-Objektes

danoman

Mitglied
Hallo zusammen.
gibt es die Möglichkeit ein Graphics-Objekt zu erzeugen, welches leer ist? Welches zb. beim Aufruf einer überschriebenen paint-Methode nichts zeichnen würde?

Gruß
Daniel
 
ja









edit:
also du könntest z.B. eine eigene Klasse bauen, die das Interface implementiert,
alle Methoden einbauen, die dann entweder gar nix machen oder allein die Aufrufe loggen,
was ziemlich interessant ist wenn man das Graphics-Objekt an eine ansonsten im Quellcode unbekannte paint-Methode übergibt
 
Zuletzt bearbeitet von einem Moderator:
hab ich schon versucht... gibt nullpointer exceptions in der JComponent klasse.

Java:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at javax.swing.JComponent.paint(JComponent.java:1045)
        at emptygraphicstest.Main$1.paint(Main.java:53)
        at javax.swing.JComponent.paintChildren(JComponent.java:866)
        at javax.swing.JComponent.paint(JComponent.java:1038)
        at javax.swing.JComponent.paintChildren(JComponent.java:866)
        at javax.swing.JComponent.paint(JComponent.java:1038)
        at javax.swing.JLayeredPane.paint(JLayeredPane.java:581)
        at javax.swing.JComponent.paintChildren(JComponent.java:866)
        at javax.swing.JComponent.paintToOffscreen(JComponent.java:5145)
        at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:302)
        at javax.swing.RepaintManager.paint(RepaintManager.java:1145)
        at javax.swing.JComponent.paint(JComponent.java:1015)
        at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
        at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:78)
        at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:115)
        at java.awt.Container.paint(Container.java:1844)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:751)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:696)
        at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:676)
        at javax.swing.RepaintManager.access$700(RepaintManager.java:57)
        at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1550)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:226)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:602)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at javax.swing.JComponent.paint(JComponent.java:1045)
        at emptygraphicstest.Main$1.paint(Main.java:53)
        at javax.swing.JComponent.paintToOffscreen(JComponent.java:5138)
        at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:302)
        at javax.swing.RepaintManager.paint(RepaintManager.java:1145)
        at javax.swing.JComponent._paintImmediately(JComponent.java:5086)
        at javax.swing.JComponent.paintImmediately(JComponent.java:4896)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:740)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:696)
        at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:676)
        at javax.swing.RepaintManager.access$700(RepaintManager.java:57)
        at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1550)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:226)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:602)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

den Paint-Event habe ich mit diesem Graphics-Objekt versucht:

Java:
package emptygraphicstest;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.PathIterator;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.ImageObserver;
import java.text.AttributedCharacterIterator;
import javax.swing.DebugGraphics;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author dan
 */
public class EmptyGraphics extends Graphics {

    @Override
    public Graphics create() {
        return null;                               // hab hier auch versucht ein new DebugGraphics() zu returnen, bzw dieses 
                                                      // direkt zu instanziieren (in dem paintevent) - Exceptions treten dann in der 
                                                      //DebugGraphics-Klasse auf
    }

    @Override
    public void translate(int x, int y) {
    }

    @Override
    public Color getColor() {
        return Color.black;
    }

    @Override
    public void setColor(Color c) {
    }

    @Override
    public void setPaintMode() {
    }

    @Override
    public void setXORMode(Color c1) {
    }

    @Override
    public Font getFont() {
        return new Font("Arial", Font.PLAIN, 10);
    }

    @Override
    public void setFont(Font font) {
    }

    @Override
    public FontMetrics getFontMetrics(Font f) {
        return new FontMetrics(new Font("Arial", Font.PLAIN, 10)) {
        };
    }

    @Override
    public Rectangle getClipBounds() {
        return new Rectangle(0, 0, 2, 2);
    }

    @Override
    public void clipRect(int x, int y, int width, int height) {
    }

    @Override
    public void setClip(int x, int y, int width, int height) {
    }

    @Override
    public Shape getClip() {
        return new Rectangle2D.Float(0,0,2,2);
    }

    @Override
    public void setClip(Shape clip) {
    }

    @Override
    public void copyArea(int x, int y, int width, int height, int dx, int dy) {
    }

    @Override
    public void drawLine(int x1, int y1, int x2, int y2) {
    }

    @Override
    public void fillRect(int x, int y, int width, int height) {
    }

    @Override
    public void clearRect(int x, int y, int width, int height) {
    }

    @Override
    public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) {
    }

    @Override
    public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) {
    }

    @Override
    public void drawOval(int x, int y, int width, int height) {
    }

    @Override
    public void fillOval(int x, int y, int width, int height) {
    }

    @Override
    public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) {
    }

    @Override
    public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) {
    }

    @Override
    public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints) {
    }

    @Override
    public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints) {
    }

    @Override
    public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints) {
    }

    @Override
    public void drawString(String str, int x, int y) {
    }

    @Override
    public void drawString(AttributedCharacterIterator iterator, int x, int y) {
    }

    @Override
    public boolean drawImage(Image img, int x, int y, ImageObserver observer) {
        return false;
    }

    @Override
    public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) {
        return false;
    }

    @Override
    public boolean drawImage(Image img, int x, int y, Color bgcolor,
            ImageObserver observer) {
        return false;
    }

    @Override
    public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor,
            ImageObserver observer) {
        return false;
    }

    @Override
    public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer) {
        return false;
    }

    @Override
    public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor,
            ImageObserver observer) {
        return false;
    }

    @Override
    public void dispose() {
        
    }
}


Im Grunde genommen möchte ich ein JPanel von seinem Inhalt befreien. Ich möchte sozusagen alles wirklich löschen und nicht mit einem Rectangle übermalen (das ist schwierig weil der hintergrund einen farbverlauf enthält)....

Irgendwelche anderen Ideen?
 
Zuletzt bearbeitet:
wie wäre es mit [c]paintComponent[/c] überschreiben. Du lässt [c]super.paintComponent(g);[/c] weg und zeichnest einfach selbst, was du gerne Zeichnen möchtest.

MFG

Tomate_Salat
 
hm also im grunde genommen möchte ich einfach den hintergrund bei einem jtextfield entfernen. sodass man nur den text hat ohne dem weißen hintergrund.

darum funktioniert das mit dem überschreiben der paint-methoden nicht so ohne weiteres. es sei denn mir entgeht hier grade was...
 
gerade wenn du NullPointerExceptions bekommst, solltest du genau loggen, was von deinem Graphics aufgerufen wird,
wo vielleicht der Rückgabewert ein Problem sein kann,

dass create() null zurückgibt sieht schon ziemlich schlimm aus,
wieso du da null zurückgibst und was DebugGraphics damit zu tun hat verstehe ich nicht,
der erste naheliegende Versuch wäre bei mir
> return new EmptyGraphics()
oder gleich
> return this;


> Exceptions treten dann in der DebugGraphics-Klasse auf

ja und? dann gehe ihnen dort auf den Grund, kein Grund vorher irgendwo null zurückzugeben 😉
 
Klingt mal wieder nach der Sache mit der Tasse und dem Nagel. Eine Möglichkeit könnte sein, in "create" einfach
return this;
zu schreiben. Besser wäre ... ... .... jede andere Lösung 😉 paintComponent überschreiben würde sich anbieten, falls man nicht einfach den Hintergrund der TextFields auf eine transparente Farbe setzen kann...

EDIT: Ach, die letzte Antwort von SlaterB hatte das "return this" ja schon drin 😳
 

Neue Themen


Zurück
Oben