NullPointerException przy próbie wywołania metody getGraphics()

0

Witam.

Piszę właśnie Xleta, którego zadaniem będzie wyświetlić na części ekranu menu z ustawionym stopniem przezroczystości i kilkoma opcjami do wyboru. Dodam, że korzystam z emulatora XletView. Problem pojawia się przy próbie ustawienia przezroczystości menu - w logu dostaję NullPointerException, a na ekranie nic się nie pojawia. Metodą prób i błędów (tj. komentowania linijek kodu podejrzanych za powodowanie błędu) doszłam, że ów problem pojawia się przy próbie wywołania metody getGraphics():

import java.awt.Color;

import javax.tv.xlet.Xlet;
import javax.tv.xlet.XletContext;
import javax.tv.xlet.XletStateChangeException;

import org.dvb.ui.DVBAlphaComposite;
import org.dvb.ui.DVBGraphics;
import org.dvb.ui.UnsupportedDrawingOperationException;
import org.havi.ui.*;
import java.awt.*;


public class Zad2Xlet implements Xlet {

	HScene scena;
	HSceneFactory fabryka; 
	HSceneTemplate szablon;
	HListGroup menu;
	HListElement obrazek;
	HListElement komponenty;
	HListElement kompozycje;
	HListElement koniec;
        
        XletContext kontekst;
        
    
    
	public void destroyXlet(boolean arg0) throws XletStateChangeException {
		

	}

	public void initXlet(XletContext arg0) throws XletStateChangeException {
	
                kontekst = arg0;
                
                fabryka = HSceneFactory.getInstance();
		szablon = new HSceneTemplate();

		menu = new HListGroup();  
		obrazek = new HListElement("Obrazek");
		komponenty = new HListElement("Komponenty");
		kompozycje = new HListElement("Kompozycje");
		koniec = new HListElement("Koniec");
                
		
		HScreenDimension rozmiar = new HScreenDimension(1f, 1f);
                HScreenPoint polozenie = new HScreenPoint(0.5f, 0.5f);
		szablon.setPreference(HSceneTemplate.SCENE_SCREEN_DIMENSION, rozmiar, HSceneTemplate.PREFERRED);
                szablon.setPreference(HSceneTemplate.SCENE_SCREEN_LOCATION, polozenie, HSceneTemplate.PREFERRED);
		
                scena = fabryka.getBestScene(szablon);
		
                menu.setBounds(0, 0, 300, 500);
		
		menu.addItem(obrazek, 0);  
                menu.addItem(komponenty, 1);  
                menu.addItem(kompozycje, 2);  
                menu.addItem(koniec, 3);  
               
		try {
                    
                     DVBGraphics gc = (org.dvb.ui.DVBGraphics) menu.getGraphics();  // <<<<<<< BŁĄD: Wyjątek w menu.getGraphics() ->  NullPointerException
                     DVBAlphaComposite reg = DVBAlphaComposite.getInstance(DVBAlphaComposite.SRC, 0f);
                     gc.setDVBComposite(reg);
                } 
                catch (ClassNotFoundException e) {
                    System.err.println(e.getMessage()+"Nie znaleziono klasy");
			e.printStackTrace();
                }
		
		scena.add(menu);
		scena.setVisible(true);
            
	}

	public void pauseXlet() {
		// TODO Auto-generated method stub

	}

	public void startXlet() throws XletStateChangeException {
		scena.show();
	}

}

Pojawia się pytanie: czy faktycznie błąd jest gdzieś w kodzie, czy to może wina emulatora?

0

Pokaż cały StackTrace i sprawdź, czy menu daje się wyświetlić, tj czy rozmiar się mieści na ekranie, czy wszystkie jego elementy istnieją i mają ustawioną widzialność. Znajdź jakiś przykład i sprawdź, czy ustawiłaś wszystko, co tam ustawili.

0

Wiesz co, dogrzebałam się w tak zwanym "między czasie" dokładnej specyfikacji XletView i okazało się, że emulator nie ma zaimplementowanych żadnych metod związanych z obróbką grafiki, mają tylko obsługę podstawowych komponentów typu buttony czy wyświetlenie tekstu na ekranie... To dlatego moje wywołanie metody getGraphics() zwracało null'a - bo co miało zwracać jak obsługa tego nie została zaimplemetnowana? :/ Szkoda tylko, że nie mam jak testować programu, bo wychodzi na to, że nie ma żadnego innego emulatora do mhp, a przystawki dla developerów w domu nie posiadam :(

Ale dzięki za chęć pomocy :)

0

public Graphics getGraphics()
Creates a graphics context for this component. This method will return null if this component is currently not displayable.

W Twoim przypadku komponent nie jest displayable (jest jakieś sensowne tłumaczenie tego?). Być może wystarczy przenieść ten kawałek kodu za linie

scena.add(menu);
scena.setVisible(true);

Jeżeli nie pomoże to powinieneś spróbować zarejestrować HierarchyListenera, albo AncestorListenera (i poczekać na zdarzenie ancestorAdded).

1 użytkowników online, w tym zalogowanych: 0, gości: 1