2016-04-01 16 views
0

Ich habe eine Frage zu Graphics in Java. Vielleicht ist es eine grundlegende Frage. Unten können Sie meinen Code sehen, um ein Graphics-Objekt mit meinem Panel in einem JFrame zu erstellen. Ich möchte ein Grafikobjekt im Konstruktor erstellen. (Wenn ich das Grafikobjekt in einer Schaltfläche erstelle, funktioniert es) Wenn ich die Anwendung starte, bekomme ich sofort eine Nullpointer-Ausnahme wegen g.setColor (Color.RED);Java Graphics Nullpointer

Aber ich verstehe nicht, warum ich diese Ausnahme bekomme. Ich habe das Programm debugged und das Panel wird erstellt, bevor ich das verwende .. = panel.getGraphics(); Befehl. Also normalerweise sollte mein Graphics-Objekt korrekt und nicht null generiert werden. Also sollte es kein Problem sein, eine Farbe einzustellen. Können Sie mir bitte erklären, warum ich diese Ausnahme bekomme?

public class G2DTest extends JFrame { 

private JPanel contentPane; 
private JPanel panel; 
Graphics g; 


/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       G2DTest frame = new G2DTest(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 
public G2DTest() { 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 796, 810); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    contentPane.setLayout(null); 

    panel = new JPanel(); 
    panel.setBackground(Color.WHITE); 
    panel.setBounds(80, 87, 309, 234); 
    contentPane.add(panel); 

    JRadioButton rdbtnRot = new JRadioButton("rot"); 
    rdbtnRot.setBounds(438, 183, 251, 41); 
    contentPane.add(rdbtnRot); 
    g = panel.getGraphics(); 
    g.setColor(Color.RED); 

} 
+0

liegt auf der Hand, 'g' ist null – logger

+0

[Dies] (http://stackoverflow.com/questions/8184913/any-alternative-to-calling-getgraphics-which-is-returning-null) nützlich sein kann. –

Antwort

0

Ihr JPanel ist erstellt, wahr. Und Ihr G2DTest (ein JFrame) wird ebenfalls erstellt.

Aber bis frame.setVisible(true); aufgerufen wird, sind diese Objekte nur Handles zu nicht realisierten Systemobjekten. Das eigentliche Betriebssystem Windows wird nicht erstellt, bis der Rahmen (und die untergeordneten Objekte) sichtbar gemacht werden. Wenn versucht wird, einen Grafikkontext aus einem nicht realisierten Fenster abzurufen, wird null angezeigt.


Als Nebenwirkung, sollten Sie wirklich keinen Graphics Kontext für das Leben Ihres G2DTest JFrame werden erstellen und zu speichern.

  • Jedes Bild, das Sie tun, sollte in Aufrufen zu #paintComponent(Graphics g) enthalten sein, die Ihnen einen Grafikkontext als Argument zur Verfügung stellt.
  • Der Graphics Kontext, den Sie festhalten, ist eine knappe Ressource, die möglicherweise "schwergewichtige Ressourcen" wie Offscreen-Speicher enthält. Wenn Sie es festhalten, spielt Ihre Anwendung möglicherweise nicht gut mit anderen Anwendungen und hält Ressourcen, die sie nicht verwendet, wenn sie (zum Beispiel) zu einem Symbol minimiert werden.
  • Ihre Anwendung kann beschädigt werden, wenn sie von einem Bildschirm auf einen anderen auf einem Computer mit mehreren Monitoren verschoben wird. Jeder Monitor könnte eine andere Grafikkonfiguration verwenden; Ihr Kontext wird nicht aktualisiert.
  • Es gibt Ausnahmen: Ein Spiel im Vollbildmodus mit exklusivem Modus kann einen Grafikkontext für eine längere Dauer enthalten. Aber halten Sie in der Regel keine Referenz auf den Kontext Graphics in Ihrer Anwendung.