• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java - W Panelu nie wyświetlają się grafiki.

Aruba Cloud - Virtual Private Server VPS
0 głosów
290 wizyt
pytanie zadane 7 sierpnia 2016 w Java przez Michał Nieruchalski Nowicjusz (180 p.)

Piszę prostą grę kółko i krzyżyk. Wymyśliłem że grafikę będzie obsługiwała klasa dziedzicząca po JPanel, do programu wczytałem pliki jako obiekt BufferedImage. Podczas wywoływania metody PaintComponent wykonuję się metoda DrawImage. Następnie chcę dodać 9 obiektów typu Pole do nowego JPanelu i tu pojawia się problem, gdy do obietku JFrame dodam mój Panel obiekty typu Pole nie wyświetlają grafiki a jedynie coś (przesyłam zdjęcię)

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
class TicTacToe
{
	JPanel Plansza;
	JFrame ramka;
	BufferedImage nic;
	BufferedImage kolko;
	BufferedImage krzyzyk;
	BufferedImage mkolko;
	BufferedImage mkrzyzyk;
	Pole pola;
	
			class Pole extends JPanel
		{
			String stan;
			public void paintComponent(Graphics g)
			{
				//instrukcje warunkowe sprawdzające stan pola // w zaleznosci od stanu będą rysowane inne zdjecia
				Graphics2D g2d = (Graphics2D) g;
				g2d.drawImage(nic, 0, 0, this);
			}
		}
		
		//Klasa jest wewnętrzna poniewaz musi ona korzystać ze składowych wystepujacych w klasie TicTacToe
	
	
	public static void main(String[] args)
	{
		TicTacToe kik = new TicTacToe();
		kik.przygotuj_zdjecia();
		kik.do_dziela();
	}
	public void przygotuj_zdjecia()
	{
		
		Plansza = new JPanel();
		
		File Fnic = new File("nic.bmp");
		try
		{
			nic = ImageIO.read(Fnic);
		}
		catch(IOException x){;}
		
		File Fkolko = new File("o.bmp");
		try
		{
			kolko = ImageIO.read(Fkolko);
		}
		catch(IOException x){;}
		
		File Fkrzyzyk = new File("x.bmp");
		try
		{
			krzyzyk = ImageIO.read(Fkrzyzyk);
		}
		catch(IOException x){;}
		
		File Fmkolko = new File("osmall");
		try
		{
			mkolko = ImageIO.read(Fmkolko);
		}
		catch(IOException x){;}
		
		File Fmkrzyzyk = new File("xsmall");
		try
		{
			mkrzyzyk = ImageIO.read(Fmkrzyzyk);
		}
		catch(IOException x){;}
		
	}
	public void do_dziela()
	{
		
		Plansza.add(new Pole());
		
		ramka = new JFrame("TicTacToe");
		ramka.setSize(500,500);
		ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		ramka.getContentPane().add(Plansza);
		ramka.setVisible(true);
	}
}

1 odpowiedź

0 głosów
odpowiedź 17 sierpnia 2016 przez Damian Radowiecki Użytkownik (920 p.)

Przesyłam poprawiony kod, który u mnie działa:

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import javax.imageio.*;
import javax.swing.*;
class TicTacToe
{
    JPanel Plansza;
    JFrame ramka;
    Image nic;
    BufferedImage kolko;
    BufferedImage krzyzyk;
    BufferedImage mkolko;
    BufferedImage mkrzyzyk;
    Pole pola;

            class Pole extends JPanel
        {
            String stan;
            public void paintComponent(Graphics g)
            {
                //instrukcje warunkowe sprawdzające stan pola // w zaleznosci od stanu będą rysowane inne zdjecia
                Graphics2D g2d = (Graphics2D) g;
                g2d.drawImage(nic, 0, 0, this);
            }
        }

        //Klasa jest wewnętrzna poniewaz musi ona korzystać ze składowych wystepujacych w klasie TicTacToe


    public static void main(String[] args)
    {
        TicTacToe kik = new TicTacToe();
        kik.przygotuj_zdjecia();
        kik.do_dziela();
    }
    public void przygotuj_zdjecia()
    {

        Plansza = new JPanel();
        //Ustawienie innego Layoutu niż doomyślny (FlowLayout) pomaga
        Plansza.setLayout(new BorderLayout());
        /*
        File Fnic = new File("nic.bmp");
        try
        {
            nic = ImageIO.read(Fnic);
        }
        catch(IOException x){;}
        */
        //Miałem także tutaj problemy z uzyskaniem obrazka, u mnie zadziałała opcja wykorzystująca obiekt URL:
        try
        {
            URL Fnic = new URL("file:///C:/pictures/picture.jpg");
            nic = ImageIO.read(Fnic);
        }
        catch(IOException x){
            x.printStackTrace();
        }
//A i co do klauzuli catch to warto przynajmniej wypisać w niej stos wywowłań (jak niżej), przynajmniej wiesz, że coś nie działa. I wiesz gdzie szukać.

        File Fkolko = new File("o.bmp");
        try
        {
            kolko = ImageIO.read(Fkolko);
        }
        catch(IOException x){;}

        File Fkrzyzyk = new File("x.bmp");
        try
        {
            krzyzyk = ImageIO.read(Fkrzyzyk);
        }
        catch(IOException x){;}

        File Fmkolko = new File("osmall");
        try
        {
            mkolko = ImageIO.read(Fmkolko);
        }
        catch(IOException x){;}

        File Fmkrzyzyk = new File("xsmall");
        try
        {
            mkrzyzyk = ImageIO.read(Fmkrzyzyk);
        }
        catch(IOException x){;}

    }
    public void do_dziela()
    {

        Plansza.add(new Pole());

        ramka = new JFrame("TicTacToe");
        ramka.setSize(500,500);
        ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ramka.getContentPane().add(Plansza);
        ramka.setVisible(true);
    }
}

W komentarzach zawarłem wskazówki.

Pozdrawiam :)

Podobne pytania

0 głosów
0 odpowiedzi 151 wizyt
pytanie zadane 27 maja 2017 w HTML i CSS przez Julian Król Nowicjusz (170 p.)
0 głosów
6 odpowiedzi 672 wizyt
pytanie zadane 19 lipca 2018 w C i C++ przez bubu91 Nowicjusz (160 p.)
+1 głos
5 odpowiedzi 365 wizyt
pytanie zadane 8 sierpnia 2016 w C i C++ przez wojtekw0703 Użytkownik (960 p.)

93,335 zapytań

142,330 odpowiedzi

322,411 komentarzy

62,670 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...