2016-08-28 14 views
0

Ich kann nicht scheinen, dass ein Rechteck im JFrame angezeigt wird. Nach den Parametern dieses Projekts muss diese Klasse die Icon-Schnittstelle implementieren. Wenn ich den Code so laufe, wie ich bin, bekomme ich den JFrame, aber innen taucht nichts auf. Es sollte ein schwarzes Quadrat angezeigt werden. Ich nehme an, dass das Problem etwas damit zu tun hat, wie ich die Grafikinstanzvariable initialisiere. Ich habe nicht viel Erfahrung mit GUI-Grafiken arbeiten, so dass ich nicht ganz klar bin, wie man das richtig macht.JFrame zeigt nichts an

Und ja, ich weiß, dass die Methoden getIconWidth und getIconHeight redundant sind, da ich Konstanten verwende, aber ich muss diese Methoden haben, um die Schnittstelle zu implementieren.

public class MugDisplay extends JFrame implements Icon { 
private int width; 
private int height; 
private JPanel panel; 
private Graphics graphics; 

private static final int ICON_WIDTH = 100; 
private static final int ICON_HEIGHT = 100; 


public MugDisplay() { 
    this.configureGui(); 
    this.panel = new JPanel(); 
    this.panel.setLayout(new BorderLayout()); 
    this.add(this.panel, BorderLayout.CENTER); 
    this.graphics = this.getGraphics(); 
    int xPos = (this.panel.getWidth() - this.getIconWidth())/2; 
    int yPos = (this.panel.getHeight() - this.getIconHeight())/2; 
    this.paintIcon(this.panel, this.graphics, xPos, yPos); 
} 


@Override 
public void paintIcon(Component c, Graphics g, int x, int y) { 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setColor(Color.BLACK); 
    g2.fillRect(x, y, ICON_WIDTH, ICON_HEIGHT); 
} 


@Override 
public int getIconWidth() { 
    return ICON_WIDTH; 
} 


@Override 
public int getIconHeight() { 
    return ICON_HEIGHT; 
} 

private void configureGui() { 
    this.setPreferredSize(new Dimension(600, 600)); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.getContentPane().setLayout(new BorderLayout()); 
    this.pack(); 
    this.setVisible(true); 
} 

} 

Im Interesse einer MCVE zu haben, hier ist die Treiberklasse, die diese Klasse aufruft.

public class Main { 

public static void main(String[] args) { 
    MugDisplay md = new MugDisplay(); 
    md.setVisible(true); 
} 

} 
+0

Verwenden Sie 'this.getGraphics();' nicht, um die Grafiken zu erhalten, und rufen Sie nicht 'paintIcon' im Konstruktor auf. Überschreibe die 'paint'-Methode des Frames, rufe 'super.paint (g)' auf, berechne x & y und rufe 'paintIcon' dort auf (Parsing der Grafikinstanz der Paint-Methode). Sie sollten auch erwägen, zu einem 'JPanel' zu wechseln und stattdessen 'paintComponent' zu überschreiben, da ich nicht wirklich sehe, welchen Vorteil das Überschreiben von' paint 'in diesem Fall hat. –

Antwort

3

this.graphics = this.getGraphics() ist nicht, wie benutzerdefinierte Malerei in Swing funktioniert. Was Sie tun sollten, ist ein Panel zu erstellen, überschreiben Sie die paintComponent Methode, rufen Sie super und dann tun Sie Ihre Malerei. Zum Beispiel:

panel = new JPanel() { 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     int xPos = ... 
     paintIcon(this, g, xPos, yPos); 
    } 
} 

getGraphics Aufruf werden Sie mit einem kurzlebigen Graphics Objekt, das bald ungültig werden kann, weshalb Sie paintComponent für zwingende stattdessen entscheiden sollten, was immer Ihnen ein brauchbares Graphics Objekt geben. Siehe Performing Custom Painting.

In einem separaten Hinweis sieht es so aus, als ob Sie setVisible(true) aufrufen, bevor Sie die erforderlichen Komponenten zum JFrame hinzugefügt haben. Um sicherzustellen, dass Ihre Komponenten angezeigt werden, rufen Sie setVisible(true) auf, nachdem Sie alle zum Rahmen hinzugefügt haben.

+0

Danke. Das hat mein Problem gelöst. Ich wusste nicht einmal, dass Sie ein Panel mit dieser Syntax deklarieren könnten. – matt