Problem z uruchomieniem metody rysującej.

0

Witam !!

Poniżej przedstawiam kod:

import java.awt.*;
import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class obslugaObrazu extends JFrame {

private Image tlo;
private Image sciana;
private boolean obrazkiWgrane;

//private GraphicsDevice device; // co tutaj sie dzieje ? - czy to odwołanie do obiektu klasy GraphicsDevice?

JFrame window = new JFrame();

DisplayMode displayMode = new DisplayMode(1024, 768, 16,DisplayMode.REFRESH_RATE_UNKNOWN);
//REFRESH daje to ze nie wywala wyjątku i sam dostraja

GraphicsEnvironment environment =
    GraphicsEnvironment.getLocalGraphicsEnvironment();
    
GraphicsDevice device = environment.getDefaultScreenDevice();


public void inicjujObraz(){

window.setUndecorated(true);
window.setResizable(false);


device.setFullScreenWindow(window);

// change the display mode
device.setDisplayMode(displayMode);

}

public void zamknijObraz() {

        Window window = device.getFullScreenWindow();
        if (window != null) {
            window.dispose();
        }
        device.setFullScreenWindow(null);// przelancza na tryb ktory byl wczesniej
    }


private Image loadImage(String fileName) {
        return new ImageIcon(fileName).getImage(); // tworzy obiekty z pobranych obrazów
    }


public void wczytajObrazki() {

       tlo = loadImage("space.jpg"); //obiekt tlo

    sciana = loadImage("brick.png");//obiekt sciana
    
        Image robbo1 = loadImage("robbo1.png");
        Image robbo2 = loadImage("robbo2.png");
        Image robbo3 = loadImage("robbo3.png");

        obrazkiWgrane = true;

        repaint();
    }

public void rysujCalosc(Graphics g){

          
            g.drawImage(tlo, 0, 0,null);

          Tablica zmiennaTablicy = new Tablica(); //czy tutaj trzeba tworzyć obiekt ?? lub jak zrobić odwolanie 
          
          zmiennaTablicy.stworzTablice();
          
   
          for (int y=0 ; y<24 ; y++){
          for (int x=0 ; x<32; x++){
          
                if(zmiennaTablicy.pobierzElementTablicy(x,y)=='a')

                g.drawImage(sciana, x*32,y*32,null);
          
          }
    }

}


}

Do ostatniej metody w powyższym kodzie wszystko szło "w miarę dobrze". Istota problemu prawdopodobnie tkwi w moim niezrozumieniu programowania obiektowego. Założeniem jest by klasa obsługaObrazu miała metody:
inicjalizacjaObrazu() -> uruchomienie wyświetlenie pustej grafiki, zamkniecieObrazu() - wylaczenie grafiki i calego programu, rysujCalosc() - rysuje wszsytko z tablicy, i rysujZmiany() - rysuje wybrane.
Wyobrażam sobie ze to powinno działać tak, że metoda main znajdujaca sie w innym pliku wywołuje je w sposób następuący :

import java.io.*;
import java.awt.*;
import javax.swing.ImageIcon;
import javax.swing.JFrame;

class Main
{

  public static void main(String args[])
  {

Tablica tablica = new Tablica();
  
tablica.stworzTablice();
System.out.println(tablica.pobierzElementTablicy(0,0));//tutaj sprawdzam czy czyta dobrze

tablica.updateTablice(0,0,'d');

System.out.println(tablica.pobierzElementTablicy(0,0));//czy zrobilo update

obslugaObrazu xxx = new obslugaObrazu();
  
xxx.inicjujObraz();
  xxx.wczytajObrazki();


  xxx.rysujWszystko();//tutaj kompilator zglasza błąd "cannot find symbol"
 //xxx.zamknijObraz(); 
  }
  
}
 

Pytanie brzmi: jak wywołać metodę rysujWszystko() by zadziałała(narysowała mapę z tablicy). Próbowałem na wiele sposobów w nawiasie z roznymi opcjami. Moze trzeba stworzyć jakieś odwołanie do obiektu. Nie rozumiem tego mechanizmu.

Również, na pewno jest tu sporo "rzeczy" metod czy składni, których nie powinno sie w taki jak ja sposób (eksperymentanlo - ksiązkowo - na czuja googlowy ) formulować i jeśli coś mocno "razi po oczach" proszę również napisać jak to powinno wyglądać.

Dzieki z góry za pomoc!

0

rysujCalosc(Graphics g) to jest to samo co rysujWszystko(), bo takie funkcji nie znalałzem w twoim kodzie. Przysłoń metodę z paint(Graphics g) dla obslugaObrazu, wstaw kod z rysujCalosc do tej metody i nastpenie xxx.repain() i powinno być ok.

0

nie rozumiem co znaczy "Przysłoń metodę". Jak mozesz podaj zmodyfikowany kod.

0
public class obslugaObrazu extends JFrame {

private Image tlo;
private Image sciana;
private boolean obrazkiWgrane;

//private GraphicsDevice device; // co tutaj sie dzieje ? - czy to odwołanie do obiektu klasy GraphicsDevice?

JFrame window = new JFrame();

DisplayMode displayMode = new DisplayMode(1024, 768, 16,DisplayMode.REFRESH_RATE_UNKNOWN);
//REFRESH daje to ze nie wywala wyjątku i sam dostraja

GraphicsEnvironment environment =
    GraphicsEnvironment.getLocalGraphicsEnvironment();
    
GraphicsDevice device = environment.getDefaultScreenDevice();


public void inicjujObraz(){

window.setUndecorated(true);
window.setResizable(false);


device.setFullScreenWindow(window);

// change the display mode
device.setDisplayMode(displayMode);

}

public void zamknijObraz() {

        Window window = device.getFullScreenWindow();
        if (window != null) {
            window.dispose();
        }
        device.setFullScreenWindow(null);// przelancza na tryb ktory byl wczesniej
    }


private Image loadImage(String fileName) {
        return new ImageIcon(fileName).getImage(); // tworzy obiekty z pobranych obrazów
    }


public void wczytajObrazki() {

       tlo = loadImage("space.jpg"); //obiekt tlo

    sciana = loadImage("brick.png");//obiekt sciana
    
        Image robbo1 = loadImage("robbo1.png");
        Image robbo2 = loadImage("robbo2.png");
        Image robbo3 = loadImage("robbo3.png");

        obrazkiWgrane = true;

        repaint();
    }

   public void paintComponent(Graphics g) {
      super.paintComponent(g);
      //Graphics2D g2 = (Graphics2D)g; // bedziesz miał wiecej możliwości
          
            g.drawImage(tlo, 0, 0,null);

          Tablica zmiennaTablicy = new Tablica(); //czy tutaj trzeba tworzyć obiekt ?? lub jak zrobić odwolanie 
          
          zmiennaTablicy.stworzTablice();
          
   
          for (int y=0 ; y<24 ; y++){
          for (int x=0 ; x<32; x++){
          
                if(zmiennaTablicy.pobierzElementTablicy(x,y)=='a')

                g.drawImage(sciana, x*32,y*32,null);
          
          }
    }

}

class Main
{

  public static void main(String args[])
  {

Tablica tablica = new Tablica();
  
tablica.stworzTablice();
System.out.println(tablica.pobierzElementTablicy(0,0));//tutaj sprawdzam czy czyta dobrze

tablica.updateTablice(0,0,'d');

System.out.println(tablica.pobierzElementTablicy(0,0));//czy zrobilo update

obslugaObrazu xxx = new obslugaObrazu();
  
xxx.inicjujObraz();
  xxx.wczytajObrazki();


  xxx.repaint(); // !!! zamiast twojej metody
 //xxx.zamknijObraz(); 
  }
  
}

I powinno być ok.
Zawsze możesz rysować na panelu. Robisz swoją włąsną class obslugaObrazu extends JPanel i umieszczasz ten panel na formie.

0

niestety wywala nastpujący błąd.

C:\Program Files\Java\jdk1.5.0_08\bin\.\obslugaObrazu.java:69: cannot find symbo
l
symbol  : method paintComponent(java.awt.Graphics)
location: class javax.swing.JFrame
      super.paintComponent(g);
           ^
1 error
0

Acha bo twoj obraz to z JFrame sie wywodzi i dlatego są problemy. Najlepiej rysuje na panelu ktory nastepnie dodasz do swojego Frame, ktory odpowiada za fullscreen.

0

hym, możesz podać przykład na możliwie prostym kodzie który wczytuje obrazki a inna klasa czyta z niego, bo czytanie dokumentacji na moim poziomie to jedynie przeglądanie pakietów i metod które i tak nie wiem jak użyć (jeszcze).

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