2016-04-01 3 views
0

У меня вопрос о графике в Java. Возможно, это основной вопрос. Ниже вы можете увидеть мой код, чтобы создать объект Graphics с моей панелью в JFrame. Я хотел бы создать графический объект в конструкторе. (Если я создаю графический объект с помощью кнопки, он работает) Если я запускаю приложение, то сразу получаю исключение nullpointer из-за g.setColor (Color.RED);Java Graphics Nullpointer

Но я не понимаю, почему я получаю это исключение. Я отлаживал программу, и панель создается до того, как я использую .. = panel.getGraphics(); команда. Итак, как правило, мой объект Graphics должен быть сгенерирован правильно, а не null. Так что не стоит устанавливать цвет. Не могли бы вы объяснить мне, почему я получаю это исключение?

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

очевидно, 'g' является нулевым – logger

+0

[Это] (http://stackoverflow.com/questions/8184913/any-alternative-to-calling-getgraphics-which-is-returning-null) может быть полезно. –

ответ

0

Ваш JPanel создан, правда. И ваш G2DTest (который является JFrame) также создан.

Но до тех пор, пока не вызывается frame.setVisible(true);, эти объекты являются просто ручками для нереализованных системных объектов. Фактическая операционная система окна не создаются до тех пор, пока кадр (и дочерние объекты) не станет видимым. Попытка извлечь графический контекст из нереализованного окна приводит к null.


Как и в сторону, вы действительно не должны создавать и хранения Graphics контекст жизни вашего G2DTest JFrame.

  • Любая картина, которую вы делаете, должна содержаться в пределах вызовов до #paintComponent(Graphics g), которая предоставляет вам графический контекст в качестве аргумента.
  • Конфликт, который вы держите, - это скудный ресурс, возможно, содержащий «тяжелые весовые ресурсы», например, внеэкранную память. Держась за нее, ваше приложение может не играть хорошо с другими приложениями, удерживая ресурсы, которые он не использует, когда (скажем) сводится к значку.
  • Ваше приложение может сломаться при переходе с одного экрана на другой на компьютере с несколькими мониторами. Каждый монитор может использовать другую графическую конфигурацию; ваше содержание в контексте не будет обновляться.

Есть исключения: полноэкранная игра в эксклюзивном режиме может содержать графический контекст в течение длительного времени. Но, как правило, не держите ссылку на контекст Graphics в своем приложении.