2012-04-13 18 views
9

Ich habe die folgende benutzerdefinierte JPanel und ich habe es zu meinem Rahmen mit Netbeans GUI Builder, aber der Hintergrund wird sich nicht ändern! Ich kann den Kreis sehen, indem ich mit g.fillOval() zeichne. Was ist los mit dir?JPanel setBackground (Color.BLACK) tut nichts

public class Board extends JPanel{ 

    private Player player; 

    public Board(){ 
     setOpaque(false); 
     setBackground(Color.BLACK); 
    } 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setColor(Color.red); 
     g.fillOval(player.getxCenter(), player.getyCenter(), player.getRadius(), player.getRadius()); 
    } 

    public void updatePlayer(Player player){ 
     this.player=player; 
    } 
} 

Antwort

14

Wenn Ihr Panel 'nicht deckend' (transparent) ist sehen Sie nicht Ihre Hintergrundfarbe.

+0

"Die Hintergrundfarbe wird nur verwendet, wenn die Komponente undurchsichtig ist ..." - ['setBackground()'] (http://docs.oracle.com/javase/6/docs/api/ javax/swing/JComponent.html # setBackground% 28java.awt.Color% 29). – trashgod

+8

+1, OP schreibt 'setOpaque (false)' und erwartet immer noch, dass die Farbe sichtbar ist :( –

14

Sie haben die super.paintComponent(); auch nennen, den ursprünglichen Hintergrund der Java API ziehen zu können. Der Super bezieht sich auf den ursprünglichen JPanel-Code.

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 

    g.setColor(Color.red); 
    g.fillOval(player.getxCenter(), player.getyCenter(), player.getRadius(), player.getRadius()); 
} 
+0

hilft habe ich versucht, dass vor (fand es nach googeln), aber es löst das Problem nicht :( –

+0

Ich bin mir nicht sicher, aber ich obwohl das Panel sollte undurchsichtig sein. –

+0

Ich habe das auch versucht, keine Änderung :) –

3

Ich habe gerade versucht, eine nackte Knochen-Implementierung und es funktioniert einfach:

public class Test { 

    public static void main(String[] args) { 
      JFrame frame = new JFrame("Hello"); 
      frame.setPreferredSize(new Dimension(200, 200)); 
      frame.add(new Board()); 
      frame.pack(); 
      frame.setVisible(true); 
    } 
} 

public class Board extends JPanel { 

    private Player player = new Player(); 

    public Board(){ 
     setBackground(Color.BLACK); 
    } 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setColor(Color.red); 
     g.fillOval(player.getCenter().x, player.getCenter().y, 
      player.getRadius(), player.getRadius()); 
    } 
} 

public class Player { 

    private Point center = new Point(50, 50); 

    public Point getCenter() { 
     return center; 
    } 

    private int radius = 10; 

    public int getRadius() { 
     return radius; 
    } 
} 
+0

Ich arbeite in Netbeans, also ist es nicht schwer, es so zu machen, aber trotzdem habe ich es geschafft, mein Board manuell zu erstellen() und habe es manuell zu meinem Frame hinzugefügt.Ich dachte, ich könnte mit meinem Board arbeiten, indem ich den integrierten GUI-Builder verwende, aber auf diese Weise kann ich die Größe dieses Board-JPanels nicht ändern (nicht einmal im Code, da es automatisch generiert wird und ich nicht darauf zugreifen kann). –

2

Sie benötigen ein neues JPanel-Objekt in den Vorstand Konstruktor zu erstellen. beispiels

public Board(){ 
    JPanel pane = new JPanel(); 
    pane.setBackground(Color.ORANGE);// sets the background to orange 
} 
3
setOpaque(false); 

zu VERÄNDERT

setOpaque(true); 
+0

vielleicht kannst du in ein paar Worten erklären, was das Problem mit dem Code des Posters ist und was dann deine Lösung ist. Vielen Dank! –

-1

Um den Hintergrund zu einer bestimmten Farbe vollständig abgebunden:

1)

zuerst die Hintergrundfarbe eingestellt

2) Aufrufmethode "Clear (0,0, this.getWidth(), this.getHeight()) "(Breite und Höhe der Komponente malen Bereich)

Ich denke, es ist das grundlegende Verfahren, um den Hintergrund zu setzen ... Ich hatte das gleiche Problem.

Ein weiterer nützlicher Hinweis: Wenn Sie ABER NICHT in eine bestimmte Zone zeichnen möchten (etwas wie eine Maske oder ein "Loch"), rufen Sie die setClip() Methode der Grafik mit der "Loch" Form auf (beliebige Form) Rufen Sie dann die Methode Clear() auf (der Hintergrund sollte zuvor auf die Farbe "Loch" eingestellt sein).

Sie können kompliziertere Clip-Zonen erstellen, indem Sie method clip() (beliebig oft) aufrufen, nachdem Sie die Methode setClip() aufgerufen haben, um Überschneidungen von Clipping-Shapes zu erhalten.

ich keine Methode für Gewerkschaften oder Inversionen von Clip Zonen gefunden haben, nur Kreuzungen, zu schlecht ...

Hoffe, dass es

+0

Diese Antwort ist sehr vage, geht in zufällige Themen, die für OP nicht wichtig sind, und Schritt 2 kompiliert nicht, oder vielleicht tut es das, aber es gibt keinen Kontext für diese Methode. Zumindest existiert es nicht als eine Member-Methode von JPanel oder JFrame. Bitte geben Sie mehr Kontext und prägnant in Ihren Beiträgen. – kevr