paint (Graphics g) i panel

0

Witam,
z góry dodam że moją przygodę z Javą dopiero co zaczynam, dlatego jeżeli pytanie jest banalne to proszę się nie śmiać ;-P

aktualnie robię mały aplet mam funkcje

public void paint (Graphics g) {
Image image = getImage(getCodeBase(), "czesc.jpg");
g.drawImage(image, 0, 0, 100, 100, this);
}

dalej mam funkcje init

public void init(){
this.setSize(new Dimenson(600,600));
setLayout (new GridLayout(2,2));
Panel panel1 = new Panel();
itd...
}

i tu moje pytanie, jak moge spawić żeby wyświetlić ten obrazek z funkcji paint w tym panelu?

0

Przy takiej konstrukcji nie możesz. Napisz własną klasę

class Panelik extends Panel
{
    private Image image;
    public Panelik(Image image)
    {
        this.image=image;
    }
    public void paint(Graphics g)
    {
          //Image image = getImage(getCodeBase(), "czesc.jpg");  //NIGDY nie twórz obrazka w metodzie paint
          if(image!==null)
              g.drawImage(image, 0, 0, 100, 100, this);
    }
}

W metodzie init() umieść takie coś

   Image image = getImage(getCodeBase(), "czesc.jpg");
   Panelik panel1 = new Panelik(image);
0

Dzięki, pomogło :)

Ale mam następne wątpliwości... Rozbudowałem troche ten aplet, pododawałem przyciski etc. postanowiłem również dodać Choice'a. Chce teraz żeby wybierając dane pole z Choice'a pokazywał mi we wcześniej wspomnianym panelu konkretny obrazek. Podejrzewam że trzeba użyć ItemListener'a. Pobieram sobie tam w funkcje numer indeksu wybranej pozycji i porównuje w if.

   public void itemStateChanged(ItemEvent e) {
	   Object source= e.getSource();
	   Choice c=(Choice)source;
       Panel panel1=(Panel)source;
	   int nazwa=c.getSelectedIndex();
	   if(nazwa==0)
	   {
		   // tu chciałem wywołać to jak w init() ale to chyba głupi pomysł, zreszta nie działa...   :-/ 
	   }
	   if(nazwa==1)
	   {
		   
	   }

}

Może ma ktoś pomysł co z tym fantem, jak to można rozpracować ?

0

Musisz:

  1. W klasie Panelik dodać setter do zmiennej image.
public void setImage(Image image){
    this.image = image;
}
  1. W itemStateChanged za pomocą settera ustawić odpowiedni obrazek, a następnie wywołać na panelu metodę repaint().
panel.setImage(...);
panel.repaint();
0

coś mi nie poszło... dorzuciłem setImage do klasy Panelik, wywołuje sobie obrazki i lipa :/

public void itemStateChanged(ItemEvent e) {
Object source= e.getSource();
Choice c=(Choice)source;
Image obrazek1= getImage(getCodeBase(),"obr1.jpg");
Image obrazek2= getImage(getCodeBase(),"obr2.jpg");
Panelik panel1 = null;

	   int nazwa=c.getSelectedIndex();
	   if(nazwa==0)
	   {
		   panel1.setImage(obrazek1);                      // tu mi pokazuje błąd przy wyborze z listy
		      panel02.repaint(); 
	   }
	   if(nazwa==1)
	   {
		   panel1.setImage(obrazek2);
		      panel02.repaint();
	   }

}

0
               Image obrazek1= getImage(getCodeBase(),"obr1.jpg");
               Image obrazek2= getImage(getCodeBase(),"obr2.jpg");
               Panelik panel1 = null;
               
               int nazwa=c.getSelectedIndex();
               if(nazwa==0)
               {
                       panel1.setImage(obrazek1);                      // tu mi pokazuje błąd przy wyborze z listy
                          panel02.repaint();
               }

Wtf?

  1. ustawiasz panel1 na null, a potem wywołujesz metodę na rzecz panel1,
  2. po kiego grzyba tworzysz obrazki w metodzie itemStateChanged(), one powinny być utworzone jeden raz w metodzie init()
0
bo napisał(a)

Wtf?

  1. ustawiasz panel1 na null, a potem wywołujesz metodę na rzecz panel1,
  2. po kiego grzyba tworzysz obrazki w metodzie itemStateChanged(), one powinny być utworzone jeden raz w metodzie init()

Add2. Nie wiem, głupi błąd [glowa]

Add1. Nie do końca kumam sugestie, teraz lepiej ?

 
        public void itemStateChanged(ItemEvent e) {
    	   Object source= e.getSource();
    	   Choice c=(Choice)source;
      	   Panelik panel1 = null;
    	   int nazwa=c.getSelectedIndex();
    	   
    	  if(panel1==null){ 
    	   if(nazwa==0)
    	   {
    		   panel1.setImage(obrazek1);
    		      panel1.repaint();
    	   }
    	   if(nazwa==1)
    	   {
    		   panel1.setImage(obrazek2);
    		      panel1.repaint();
    	   }
}

Jak mogę sie teraz odwołać do obrazka1 ?? Przez: Image obrazek1=(Image)source;
niebardzo...

0

Po co jest ten wiersz

Panelik panel1 = null;

?????????????????????

0

Myslalem że musze "pokazać skad ten panel1" tak żeby moc odwolac sie do niego w tym
if(nazwa==0)
{
panel1.setImage(obrazek1);
panel1.repaint();
}

0
        public void itemStateChanged(ItemEvent e) {
               Object source= e.getSource();
               Choice c=(Choice)source;
               int nazwa=c.getSelectedIndex();
              
               if(nazwa==0)
               {
                       panel1.setImage(obrazek1);
                        panel1.repaint();
               }
               if(nazwa==1)
               {
                       panel1.setImage(obrazek2);
                       panel1.repaint();
               }

Instrukcja

Panelik panel1 = null;

tworzyła w funkcji itemStateChanged zmienną lokalną nazywającą się tak samo jak pole w klasie, zatem ta zmienna przesłaniała pole. Nie można wywoływać metod na rzecz obiektów null.

0
bo napisał(a)

tworzyła w funkcji itemStateChanged zmienną lokalną nazywającą się tak samo jak pole w klasie, zatem ta zmienna przesłaniała pole. Nie można wywoływać metod na rzecz obiektów null.

Cenna informacja. Wiec jeżeli jeszcze masz resztki cierpliwości dla mnie, jeszcze jedno pytanie... Mam ten itemState,

  public void itemStateChanged(ItemEvent e) {
               Object source= e.getSource();
               Choice c=(Choice)source;
               int nazwa=c.getSelectedIndex();
             
               if(nazwa==0)
               {
                       panel1.setImage(obrazek1);
                        panel1.repaint();
               }
               if(nazwa==1)
               {
                       panel1.setImage(obrazek2);
                       panel1.repaint();
               }

ale pokazuje mi tak gdyby "nie znał" panelu1 i obrazka. W klasie Panelik mam ta metode setImage, w init'e wywołuje sobie
Panelik panel1 = new Panelik (obrazek). Wydaje mi sie ze powinno grać tyle że nie gra. Zupełnie nie wiem czego jeszcze brakuje. Czegoś musi skoro "nie zna" tego panelu i obrazka w itemState, tylko czego ?

0

Mój błąd, w init() tylko

panel1=Panelik(image)

a dodatkowo pole w klasie

    private Panelik panel1;
0

Pozmieniałem i niestety lipa. Zamieszczę jeszcze te funkcje, klase Panelik może coś jeszcze jest nie tak. Jeżeli nie to już nie wiem sam i musze dać sobie spokój z tym.


init(){
...
panel1= Panelik(image);  // tu nie wie co to panel1 i przy  tej deklaracji wcześniejszej 
                                       //Panelik panel1 = new Panelik(image); tu już nie bruździ tylko w itemState
...
}

  public void itemStateChanged(ItemEvent e) {
	// TODO Auto-generated method stub
    	   Object source= e.getSource();
    	   Choice c=(Choice)source;
    	   int nazwa=c.getSelectedIndex();
    	    
    	   if(nazwa==0)
    	   {
    		   panel1.setImage(obrazek1);          // tu nie zna obrazek 1 i panel1
    		      panel1.repaint();                       
    	 ...
}

 class Panelik extends Panel{
    	   private Image image;
    	   private Panelik panel1;
    	   public Panelik(Image image){
    		   this.image=image;
    	   }
    	   public void paint (Graphics g){
    		   if(image!=null){
    			   g.drawImage(image,0,0,100,150, this);
    		   }
    	   }
    	   public void setImage(Image image){
    		   this.image=image;
    	   }
       }
0

Ty rozumiesz swój kod, czy też piszesz instrukcje w losowej kolejności?
Wiersz

    private Panelik panel1;

ma być w głównej klasie, a nie w klasie Panelik.

0

W sumie racje bo i po co taka deklaracja w "Paneliku"... :-|

Teraz gra, eclipse nie pokazuje błędów, jednak kompilator już tak: NullPointerException w linijce
panel1.setImage(obrazek);

0

Jesteś pewien, że to kompilator pokazuje błąd? Albo panel1 jest null (bo zabrakło panel1 = new Panelik(...));,
albo obrazek jest null, bo zabrakło obrazek=getImage(...,nazwaPliku); lub nie istnieje wskazany plik.

0

Działa :-) BO, wielkie dzięki za pomoc i wytrwałość ;-P . Należy Ci się duże piwo.

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