So, jetzt bitte nicht umfallen^^
Ich habe mir eben mithilfe der Reflection eine Wrapperklasse zu Graphics2D erstellen lassen, die eine einzige methode überschreibt:
[highlight=Java]
package gui;
import java.awt.*;
import java.awt.RenderingHints.Key;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ImageObserver;
import java.awt.image.RenderedImage;
import java.awt.image.renderable.RenderableImage;
import java.text.AttributedCharacterIterator;
import java.util.Map;
class AbsoluteStrokeGraphics2D extends Graphics2D{
private Graphics2D g2D;
public AbsoluteStrokeGraphics2D(Graphics2D g){
g2D=g;
}
@Override
public void draw(Shape shape){
GeneralPath path=new GeneralPath();
AffineTransform affineTransform;
path.append(shape.getPathIterator(affineTransform=g2D.getTransform()),false);
g2D.setTransform(new AffineTransform());
g2D.draw(path);
g2D.setTransform(affineTransform);
}
@Override public void transform(AffineTransform arg_0){ g2D.transform( arg_0); }
@Override public void fill(Shape arg_0){ g2D.fill( arg_0); }
@Override public void rotate(double arg_0,double arg_1,double arg_2){ g2D.rotate( arg_0, arg_1, arg_2); }
@Override public void rotate(double arg_0){ g2D.rotate( arg_0); }
@Override public void scale(double arg_0,double arg_1){ g2D.scale( arg_0, arg_1); }
@Override public void translate(double arg_0,double arg_1){ g2D.translate( arg_0, arg_1); }
@Override public Color getBackground(){ return g2D.getBackground(); }
@Override public void setBackground(Color arg_0){ g2D.setBackground( arg_0); }
@Override public boolean drawImage(Image arg_0,AffineTransform arg_1,ImageObserver arg_2){ return g2D.drawImage( arg_0, arg_1, arg_2); }
@Override public void drawImage(BufferedImage arg_0,BufferedImageOp arg_1,int arg_2,int arg_3){ g2D.drawImage( arg_0, arg_1, arg_2, arg_3); }
@Override public AffineTransform getTransform(){ return g2D.getTransform(); }
@Override public void setTransform(AffineTransform arg_0){ g2D.setTransform( arg_0); }
@Override public void shear(double arg_0,double arg_1){ g2D.shear( arg_0, arg_1); }
@Override public void setRenderingHint(Key arg_0,Object arg_1){ g2D.setRenderingHint( arg_0, arg_1); }
@Override public void clip(Shape arg_0){ g2D.clip( arg_0); }
@Override public GraphicsConfiguration getDeviceConfiguration(){ return g2D.getDeviceConfiguration(); }
@Override public void drawGlyphVector(GlyphVector arg_0,float arg_1,float arg_2){ g2D.drawGlyphVector( arg_0, arg_1, arg_2); }
@Override public void drawString(AttributedCharacterIterator arg_0,float arg_1,float arg_2){ g2D.drawString( arg_0, arg_1, arg_2); }
@Override public void drawString(String arg_0,float arg_1,float arg_2){ g2D.drawString( arg_0, arg_1, arg_2); }
@Override public FontRenderContext getFontRenderContext(){ return g2D.getFontRenderContext(); }
@Override public RenderingHints getRenderingHints(){ return g2D.getRenderingHints(); }
@Override public void setComposite(Composite arg_0){ g2D.setComposite( arg_0); }
@Override
@SuppressWarnings("unchecked")
public void addRenderingHints(Map arg_0){ g2D.addRenderingHints( arg_0); }
@Override public void drawRenderableImage(RenderableImage arg_0,AffineTransform arg_1){ g2D.drawRenderableImage( arg_0, arg_1); }
@Override public void drawRenderedImage(RenderedImage arg_0,AffineTransform arg_1){ g2D.drawRenderedImage( arg_0, arg_1); }
@Override public Composite getComposite(){ return g2D.getComposite(); }
@Override public Paint getPaint(){ return g2D.getPaint(); }
@Override public Object getRenderingHint(Key arg_0){ return g2D.getRenderingHint( arg_0); }
@Override public Stroke getStroke(){ return g2D.getStroke(); }
@Override public boolean hit(Rectangle arg_0,Shape arg_1,boolean arg_2){ return g2D.hit( arg_0, arg_1, arg_2); }
@Override public void setPaint(Paint arg_0){ g2D.setPaint( arg_0); }
@Override
@SuppressWarnings("unchecked")
public void setRenderingHints(Map arg_0){ g2D.setRenderingHints( arg_0); }
@Override public void setStroke(Stroke arg_0){ g2D.setStroke( arg_0); }
@Override public void finalize(){ g2D.finalize(); }
@Override public String toString(){ return g2D.toString(); }
@Override public Graphics create(int arg_0,int arg_1,int arg_2,int arg_3){ return g2D.create( arg_0, arg_1, arg_2, arg_3); }
@Override public Graphics create(){ return g2D.create(); }
@Override public Font getFont(){ return g2D.getFont(); }
@Override public void dispose(){ g2D.dispose(); }
@Override public void clearRect(int arg_0,int arg_1,int arg_2,int arg_3){ g2D.clearRect( arg_0, arg_1, arg_2, arg_3); }
@Override public void setFont(Font arg_0){ g2D.setFont( arg_0); }
@Override public void translate(int arg_0,int arg_1){ g2D.translate( arg_0, arg_1); }
@Override public Shape getClip(){ return g2D.getClip(); }
@Override public FontMetrics getFontMetrics(Font arg_0){ return g2D.getFontMetrics( arg_0); }
@Override public FontMetrics getFontMetrics(){ return g2D.getFontMetrics(); }
@Override public void setClip(Shape arg_0){ g2D.setClip( arg_0); }
@Override public void setClip(int arg_0,int arg_1,int arg_2,int arg_3){ g2D.setClip( arg_0, arg_1, arg_2, arg_3); }
@Override public boolean drawImage(Image arg_0,int arg_1,int arg_2,Color arg_3,ImageObserver arg_4){ return g2D.drawImage( arg_0, arg_1, arg_2, arg_3, arg_4); }
@Override public boolean drawImage(Image arg_0,int arg_1,int arg_2,ImageObserver arg_3){ return g2D.drawImage( arg_0, arg_1, arg_2, arg_3); }
@Override public boolean drawImage(Image arg_0,int arg_1,int arg_2,int arg_3,int arg_4,int arg_5,int arg_6,int arg_7,int arg_8,ImageObserver arg_9){ return g2D.drawImage( arg_0, arg_1, arg_2, arg_3, arg_4, arg_5, arg_6, arg_7, arg_8, arg_9); }
@Override public boolean drawImage(Image arg_0,int arg_1,int arg_2,int arg_3,int arg_4,int arg_5,int arg_6,int arg_7,int arg_8,Color arg_9,ImageObserver arg_10){ return g2D.drawImage( arg_0, arg_1, arg_2, arg_3, arg_4, arg_5, arg_6, arg_7, arg_8, arg_9, arg_10); }
@Override public boolean drawImage(Image arg_0,int arg_1,int arg_2,int arg_3,int arg_4,Color arg_5,ImageObserver arg_6){ return g2D.drawImage( arg_0, arg_1, arg_2, arg_3, arg_4, arg_5, arg_6); }
@Override public boolean drawImage(Image arg_0,int arg_1,int arg_2,int arg_3,int arg_4,ImageObserver arg_5){ return g2D.drawImage( arg_0, arg_1, arg_2, arg_3, arg_4, arg_5); }
@Override public void fillRect(int arg_0,int arg_1,int arg_2,int arg_3){ g2D.fillRect( arg_0, arg_1, arg_2, arg_3); }
@Override public void setColor(Color arg_0){ g2D.setColor( arg_0); }
@Override public Color getColor(){ return g2D.getColor(); }
@Override public void copyArea(int arg_0,int arg_1,int arg_2,int arg_3,int arg_4,int arg_5){ g2D.copyArea( arg_0, arg_1, arg_2, arg_3, arg_4, arg_5); }
@Override public void drawArc(int arg_0,int arg_1,int arg_2,int arg_3,int arg_4,int arg_5){ g2D.drawArc( arg_0, arg_1, arg_2, arg_3, arg_4, arg_5); }
@Override public void drawChars(char[] arg_0,int arg_1,int arg_2,int arg_3,int arg_4){ g2D.drawChars( arg_0, arg_1, arg_2, arg_3, arg_4); }
@Override public void drawLine(int arg_0,int arg_1,int arg_2,int arg_3){ g2D.drawLine( arg_0, arg_1, arg_2, arg_3); }
@Override public void drawOval(int arg_0,int arg_1,int arg_2,int arg_3){ g2D.drawOval( arg_0, arg_1, arg_2, arg_3); }
@Override public void drawPolygon(Polygon arg_0){ g2D.drawPolygon( arg_0); }
@Override public void drawPolygon(int[] arg_0,int[] arg_1,int arg_2){ g2D.drawPolygon( arg_0, arg_1, arg_2); }
@Override public void drawPolyline(int[] arg_0,int[] arg_1,int arg_2){ g2D.drawPolyline( arg_0, arg_1, arg_2); }
@Override public void drawRect(int arg_0,int arg_1,int arg_2,int arg_3){ g2D.drawRect( arg_0, arg_1, arg_2, arg_3); }
@Override public void drawRoundRect(int arg_0,int arg_1,int arg_2,int arg_3,int arg_4,int arg_5){ g2D.drawRoundRect( arg_0, arg_1, arg_2, arg_3, arg_4, arg_5); }
@Override public void drawString(String arg_0,int arg_1,int arg_2){ g2D.drawString( arg_0, arg_1, arg_2); }
@Override public void drawString(AttributedCharacterIterator arg_0,int arg_1,int arg_2){ g2D.drawString( arg_0, arg_1, arg_2); }
@Override public void fillArc(int arg_0,int arg_1,int arg_2,int arg_3,int arg_4,int arg_5){ g2D.fillArc( arg_0, arg_1, arg_2, arg_3, arg_4, arg_5); }
@Override public void fillOval(int arg_0,int arg_1,int arg_2,int arg_3){ g2D.fillOval( arg_0, arg_1, arg_2, arg_3); }
@Override public void fillPolygon(Polygon arg_0){ g2D.fillPolygon( arg_0); }
@Override public void fillPolygon(int[] arg_0,int[] arg_1,int arg_2){ g2D.fillPolygon( arg_0, arg_1, arg_2); }
@Override public void fillRoundRect(int arg_0,int arg_1,int arg_2,int arg_3,int arg_4,int arg_5){ g2D.fillRoundRect( arg_0, arg_1, arg_2, arg_3, arg_4, arg_5); }
@Override public void clipRect(int arg_0,int arg_1,int arg_2,int arg_3){ g2D.clipRect( arg_0, arg_1, arg_2, arg_3); }
@Override public void drawBytes(byte[] arg_0,int arg_1,int arg_2,int arg_3,int arg_4){ g2D.drawBytes( arg_0, arg_1, arg_2, arg_3, arg_4); }
@Override public Rectangle getClipBounds(Rectangle arg_0){ return g2D.getClipBounds( arg_0); }
@Override public Rectangle getClipBounds(){ return g2D.getClipBounds(); }
@Override public boolean hitClip(int arg_0,int arg_1,int arg_2,int arg_3){ return g2D.hitClip( arg_0, arg_1, arg_2, arg_3); }
@Override public void setPaintMode(){ g2D.setPaintMode(); }
@Override public void setXORMode(Color arg_0){ g2D.setXORMode( arg_0); }
@Override public void draw3DRect(int arg_0,int arg_1,int arg_2,int arg_3,boolean arg_4){ g2D.draw3DRect( arg_0, arg_1, arg_2, arg_3, arg_4); }
@Override public void fill3DRect(int arg_0,int arg_1,int arg_2,int arg_3,boolean arg_4){ g2D.fill3DRect( arg_0, arg_1, arg_2, arg_3, arg_4); }
@Override
@Deprecated public Rectangle getClipRect(){ return g2D.getClipRect(); }
}
[/highlight]
Okay, es funktioniert. Es benimmt sich wie ein stinknormales Graphics2D-Objekt, mit dem kleinen aber feinen Unterschied, dass Strokes nicht mitskaliert werden, sondern immer konstant bleiben.
Aber es ist doch einfach nur dermaßen shice hässlich :autsch:
Irgendwelche vorschläge, wie ich dasselbe ausformuliere, ohne 432 Milliarden methoden sinnlos zu wrappen? Irgendeine konstruktion mit anonymen inneren Klassen fällt mir leider nicht ein, da die verdammten Graphics2D ja keinerlei Konstruktoren zur verfügung stellen, weil sie ja irgendwie Klassen aber so abstrakt wie Interfaces sind^^ Bwwaaah... Was mach ich jetzt? Diesen Mist einfach so lassen und freuen dass es funzt? :bahnhof: