2016-06-16 15 views
1

Ich möchte ein Bild als Hintergrund in einigen JComponent (JPanel, JLayeredPane, ..) festlegen. Dazu habe ich die Klasse JImagePanel erstellt, die JPanel erweitert und die Methode überschreibt. Das gleiche gilt für die anderen Komponenten. Ich habe jetzt 3 Klassen, die sich nur dadurch unterscheiden, was sie erweitern. Ich wollte eine eindeutige Klasse JImageComponent erstellen, die JComponent erweitert, und dann werden alle anderen es erweitern, aber ich kann nicht, da die Klassen, die ich erstellte, bereits eine Klasse erweitern (JImagePanel erweitert JPanel). Kann ich das anders machen?Java Swing paintComponent() überschreiben

Dies ist der Code von einer der Klassen I erstellt:

public class JImagePanel extends JPanel { 

    private static final int DEFAULTX = 0; 
    private static final int DEFAULTY = 0; 
    private static final int DEFAULTWIDTH = 1100; 
    private static final int DEFAULTHEIGHT = 700; 

    private BufferedImage img; 
    private int imagex; 
    private int imagey; 
    private int imagewidth; 
    private int imageheight; 
    private static final long serialVersionUID = 1L; 

    public JImagePanel(String path){ 
     super(); 
     this.imagex=JImagePanel.DEFAULTX; 
     this.imagey=JImagePanel.DEFAULTY; 
     this.imagewidth=JImagePanel.DEFAULTWIDTH; 
     this.imageheight=JImagePanel.DEFAULTHEIGHT; 
     img = loadImage(path); 
    } 

    public JImagePanel(String path,int x,int y, int width, int height){ 
     super(); 
     this.imagex=x; 
     this.imagey=y; 
     this.imagewidth=width; 
     this.imageheight=height; 
     img = loadImage(path); 
    } 

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

     setOpaque(false); 
     graphics.drawImage(img, imagex, imagey,imagewidth,imageheight, null); 
    } 
} 

Danke.

+0

Ich bin verwirrt: Warum * genau * können Sie nicht alle Ihre anderen bilddarstellenden Klasse aus dieser haben? Warum kannst du sie nicht umschreiben, um diese zu erweitern? Was ist der Unterschied in all ihren Funktionalitäten? Beachten Sie, dass Sie die Opazität nicht innerhalb von paintComponent, sondern vom Konstruktor aus festlegen sollten. –

+0

Das Problem ist, dass alle Klassen von ihrer "natürlichen Eltern" Klasse erweitern müssen (zum Beispiel JImagePanel ist immer noch ein JPanel und muss es erweitern), daher kann ich nicht nur eine Klasse mit dieser Funktion erstellen und dann erweitern. Es tut mir leid, vielleicht habe ich deine Frage nicht verstanden. Und Danke, ich werde die Opazität im Konstruktor einstellen! –

+0

Ich möchte nur eine Klasse haben, weil ich keinen doppelten Code haben möchte. –

Antwort

0

Was Sie vorschlagen, ist nicht logisch möglich, da JPanel, JLayeredPane, etc. bereits JComponent erweitern. Sie versuchen, einen neuen Schritt in der Hierarchie hinzuzufügen. Jetzt geht es JImagePanel -->JPanel --> JComponent, etc. und Sie versuchen, es JImagePanel --> JPanel --> JImageComponent --> JComponent zu machen. Um dies zu tun, müssten Sie die JPanel Klasse ändern, so dass es tatsächlich JImageComponent erweitert.

Hier ist mein Vorschlag: Verwenden Sie nicht JImageComponent für die Klassen, die bereits Komponenten erweitern. Wenn Sie neue Komponenten erstellen, die vorhandene Komponenten nicht erweitern, erweitern Sie sie direkt um JImageComponent oder JComponent. Wenn der Zweck Ihrer Klasse JImageComponent darin besteht, Einheitlichkeit für Ihre Elemente bereitzustellen, sollten Sie eine Schnittstelle für alle Elemente implementieren.