Другим сценарием является то, что вы нанесли нулевой объект в тип значения . Например, код ниже:
object o = null;
DateTime d = (DateTime)o;
Он выкинет NullReferenceException
в роли. В приведенном выше примере это кажется совершенно очевидным, но это может произойти в более «поздних связующих» сложных сценариях, где нулевой объект был возвращен из некоторого кода, которого вы не являетесь, и приведение, например, генерируется некоторой автоматической системой.
Одним из примеров этого является этот простой фрагмент привязки ASP.NET с элементом управления календарем:
" />
Здесь SelectedDate
на самом деле является свойством - типа DateTime
- типа Calendar
Web Control, и привязка может отлично вернуть что-то null. Неявный генератор ASP.NET создаст кусок кода, который будет эквивалентен приведенному выше методу. И это поднимет NullReferenceException
, что довольно сложно определить, потому что он лежит в сгенерированном ASP.NET коде, который компилирует отлично ...
Вот мой взгляд на ваш графический интерфейс из ада, который, похоже, работает нормально. Это довольно интенсивно. Как вы выполняете обновления? В другом потоке?
final JFrame frame = new JFrame();
frame.setSize(600, 400);
frame.getContentPane().setLayout(new GridLayout(3, 1, 20, 20));
final JPanel[] panels = new JPanel[3];
for (int i = 0; i < panels.length; i++) {
panels[i] = new JPanel();
panels[i].setOpaque(true);
frame.getContentPane().add(panels[i]);
}
frame.setVisible(true);
ActionListener action = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Random gen = new Random();
Color color = new Color(gen.nextInt(256), gen.nextInt(256),
gen.nextInt(256));
frame.getContentPane().setBackground(color);
for (int i = 0; i < panels.length; i++) {
color = new Color(gen.nextInt(256), gen.nextInt(256),
gen.nextInt(256));
panels[i].setBackground(color);
}
}
};
Timer t = new Timer(100, action);
t.setRepeats(true);
t.start();
Я бы предложил использовать Swing Timer для многократных событий в Swing GUI, возможно, этот пример может помочь вам с другими вашими мечтами
JFrame
невозможно покрасить, но работает для ContentPane
ge JFrame.getContentPane.setColor(Color.red)
Наконец, что-то для удовольствия ... Попробуй. Используйте его как любой JFrame.
class JFrameWild extends JFrame {
private static final long serialVersionUID = 666L;
public JFrameWild(String string) {
super(string);
Thread thread = new Thread(new Runnable() {
public void run() {
while (true) {
yoyoMama(JFrameWild.this);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.setDaemon(true);
thread.start();
}
private void yoyoMama(Object object) {
if (object instanceof Container) {
Container c = (Container) object;
Component[] components = c.getComponents();
for (Component component : components) {
yoyoMama(component);
// put extra "wild" stuff here
component.setBackground((new Color((int) (Math.random() * (double) (0xFFFFFF)))));
}
} else {
if (object instanceof Component) {
Component component = (Component) object;
// put extra "wild" stuff here
component.setBackground((new Color((int) (Math.random() * (double) (0xFFFFFF)))));
}
}
}
}