Okienko JFRAME i zmienianie jego zawartosci

0

Witam,
Potrzebuje wyświetlić zmieniający się tekst w standardowym okienku. Można w jakikolwiek sposób wysłać do metody paintComponent, obiekt typu String, który ma zostać narysowany? Nie mogę tworzyć tego obiektu w klasie "Panel" ponieważ jest on tworzony co jedna sekundę w klasie, która implementuje ActionListener (Timer). A z kolei do funkcji paintComponent nie wiem jak przekazać obiekt z zewnątrz. Jest to możliwe? Prosze o pomoc

class Panel extends JPanel
 {  
    public void paintComponent(Graphics g)
    {  

       super.paintComponent(g);

       g.drawString(tekst, 
          WIADOMOSC_X, WIADOMOSC_Y);
    }

    public static final int WIADOMOSC_X = 75;
    public static final int WIADOMOSC_Y = 100;
 }
0

Można np. tak:

class Panel extends JPanel
 {
    private JakasKlasa parent; 
    Panel(JakasKlasa parent)
    {
        this.parent=parent;
    }
    public void paintComponent(Graphics g)
    { 

       super.paintComponent(g);

       g.drawString(parent.getKomunikat(),
          WIADOMOSC_X, WIADOMOSC_Y);
    }

    public static final int WIADOMOSC_X = 75;
    public static final int WIADOMOSC_Y = 100;
 }
0
bogdans napisał(a)

Można np. tak:


class Panel extends JPanel
{
private JakasKlasa parent; 
Panel(JakasKlasa parent)
{
this.parent=parent;
}
public void paintComponent(Graphics g)
{ 
   super.paintComponent(g);

   g.drawString(parent.getKomunikat(),
      WIADOMOSC_X, WIADOMOSC_Y);
}

public static final int WIADOMOSC_X = 75;
public static final int WIADOMOSC_Y = 100;

}


Dzięki, ale kod:

g.drawString( ObrazWyspy.calosc,
WIADOMOSC_X, WIADOMOSC_Y);

Zwraca błąd:

non-static variable calosc cannot be referenced from a static context


Czyli w ogóle chyba nie jest możliwe to co chce zrobić przy użyciu JPanel.
Mozecie zasugerować jakieś klasy które nie będą bardzo trudne do wykorzystania dla początkującego, a które pozwolą mi wyświetlać w równych odstępach czasy kwadratowa tablice typu String na ekranie? Proszę o pomoc.
0
class Panel extends JPanel {  
    private String text = null;
    public void paintComponent(Graphics g) {  
        super.paintComponent(g);
        if(text != null)
            g.drawString(text,  WIADOMOSC_X, WIADOMOSC_Y);
    }

    public static final int WIADOMOSC_X = 75;
    public static final int WIADOMOSC_Y = 100;

    public String setText(String text) {
        this.text = text;
    }
}

W swoim listenerze po prostu wywołujesz metode setText, i repaint. Na obiekcie klasy Panel.

0

Co to jest ObrazWyspy nazwa klasy, czy nazwa zmiennej obiektowej ? Wielka litera na początku sugeruje że nazwa klasy, jeśli tak, to kod jest błędny. W moim przykładzie parent było nazwą zmiennej.

0

Błąd jest bo pole calosc w klasie ObrazWyspy nie jest statyczne. Ale jak zrozumiałem, intancja obiektu ObrazWyspy nie może się znajdować w klasie Panel.

Proponowałbym zatem by w mistycznej klasie ObrazWyspy zawrzeć metodę:

public String getCalosc() {
    return calosc;
}

I jeżeli owe obiekty klasy ObrazWyspy, tworzone są każdorazowo w ramach działania ActionListener'a, proponowałbym by rozwiązać to w następujący sposób:

...
private Panel panel;
...

public void actionPerformed(ActionEvent e) {
    //obsługa zdarzenia
    ObrazWyspy ow= //costam
    panel.setText(ow.getCalos());
    panel.repaint();    
}

Dodatkowo chciałbym zauważyć, że istnieje już klasa o nazwie Panel (java.awt.Panel) ;/

0

Dziekuje Panowie za odpowiedzi.

Jacobus2k, skorzystałem z Twoich porad ale dalej mam pewien problem. Nie wiem czy do końca rozumiem błąd

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at ObrazWyspy.actionPerformed(Wyspa.java:322)

w lini
panel.setText(calosc);
i później masa wyjątków. Ale po rożnych testach doszedłem ze String text w metodzie rysowania ma zawsze wartość zero. Nie wiem dlaczego, poznieważa drukuje zmienna całość w Listenerze i sie drukuje elegancko, wiec coś musi być nie tak z tym przekazaniem tego Stringa, tylko co?
Mój kod wyglada tak:

class ObrazWyspy implements ActionListener
{
  public void actionPerformed(ActionEvent zdarzenie)
  {

if (first_time){
//ustawienia początkowe
first_time = false; 
}

  //obsługa zdarzenia
calosc=wys1.pobierzWyspe();
panel.setText(calosc);
panel.repaint(); 
wys1.zmienPolozenie();

}
private Panel panel;
private  String calosc;
private Wysepka wys1;
private boolean first_time = true; 
}

class Panel extends JPanel { 

    public void paintComponent(Graphics g) { 

            super.paintComponent(g);
                if(text !=null){
                g.drawString(text,  WIADOMOSC_X, WIADOMOSC_Y);
                }
        }

        public void setText(String text) {
                this.text = text;
        }
public static final int WIADOMOSC_X = 75;
public static final int WIADOMOSC_Y = 100;
private String text = null;    
}
0

To co chce drukować wygląda np tak (jest generowane losowo ustawienie początkowe):

  Kk   KmSk                                          
   Sk               Sm      Sk            Sk            
Kk                                                         
   SkKm   Sm                        KkSm               
                                                      Km   

   SkSm                                                   
                                 Km                        
                                             Km   Sm      
                        Sk            Km                  
   Sk                        Km                        Km
Sm      KkKm                                          Km
                           Km                              
         Km            Sk               Km      Kk      

      Kk                                                   

                              Sk                        Sm
Sk                              Sk      Sk               
               Kk                                          

Moze cos jest nie tak dlatego ze jest spacja zazwyczaj na pcozatku i traktuje to jako null. Juz nic nie wiem :(

0

A masz gdzieś (w tym opuszczonym) wiersz

panel=new Panel();

?

0
bogdans napisał(a)

A masz gdzieś (w tym opuszczonym) wiersz

panel=new Panel();

?

Ehh, cały czas zapominam o najpotrzebniejszych rzeczach. Dzieki bardzo, już sie kompiluje ale w okienku dalej mam pusty, szary ekran.
Gdy w actionPerformed zrobię:

System.out.println(calosc);

to wyswietla mi sie w konsoli cyklicznie ta moja "wyspa"
gdy natomiast wstawie do public void paintComponent

System.out.println(text);

Pojawia sie w konsoli "null" i to tylko jeden raz. Więc obawiam się, że

panel.setText(calosc);
panel.repaint();

nie działają tak jak powinny.
panel.repaint();- nie powinno to odpalać metody paintComponent? Skoro tak to dlaczego okno jest cały czas puste a w konsoli "null" pojawia sie tylko raz? Calosc jak chce wydrukowac w actionPerformed działa prawidłowo.

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