Rysowanie na BufferedImage na panelu docelowym

0

Witam.

Mam od kilku dni problem odnośnie pewnej kwestii. Poniżej kod:

package TGTA;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TGTA extends JFrame implements MouseMotionListener, ActionListener
{
	private static final long serialVersionUID = 1L;
	public int Wejscie[];
	public int Wyjscie[];
	public int x, y;
	public JButton wczytaj;
	public JPanel panel;
	public JPanel panelRysowania;
	public SiecNeuronowa siec;
	public BufferedImage obszarRysowania;
	public TGTA() throws Exception
	{
		utworzOkno(640,480);
		utworzPanel();
		utworzPoleRysowania(300,300);
		utworzSiec();
		utworzPrzyciski();
	}
	
	public void utworzOkno(int x, int y)
	{
		Dimension rozmiar_ekranu = Toolkit.getDefaultToolkit().getScreenSize();
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setLocation(rozmiar_ekranu.width/4,rozmiar_ekranu.height/4);
		this.setTitle("Projekt IO");
		this.setSize(x,y);
		this.setResizable(false);
		this.setLayout(null);
	}
	
	public void utworzPoleRysowania(int x, int y)
	{
		panelRysowania = new JPanel();
		panelRysowania.setBounds(0, 0, x, y);
		obszarRysowania = new BufferedImage(x, y, BufferedImage.TYPE_INT_ARGB);
		Graphics2D obszar = obszarRysowania.createGraphics();
		obszar.setColor(Color.GREEN);
		obszar.fillRect(0, 0, 100, 100);
		obszar.setBackground(Color.WHITE);
		panelRysowania.paint(obszar);
		panel.add(panelRysowania);
	}
	
	public void utworzPanel()
	{
		panel = (JPanel) getContentPane();
		panel.setLayout(null);
	}
	
	public void utworzPrzyciski()
	{
		wczytaj = new JButton("wczytaj");
		wczytaj.setBounds(400, 400, 100, 30);
		wczytaj.addActionListener(this);
		panel.add(wczytaj);
	}
	
	public void pobierzDaneDlaSieci()
	{
		/*int szerokoscPanelu = zawartoscPolaRysowania.getWidth();
		int wysokoscPanelu = zawartoscPolaRysowania.getHeight();
		Wejscie = new int[szerokoscPanelu*wysokoscPanelu];
		for (int wiersz = 0; wiersz < wysokoscPanelu; wiersz++)
		{
			for (int kolumna = 0; kolumna < szerokoscPanelu; kolumna++)
		    {
				Wejscie[wiersz*kolumna] = zawartoscPolaRysowania.getRGB(kolumna, wiersz);
			}			
		}
		*/
	}
	

	
	/*public static int[] wczytajPiksele(BufferedImage zawartoscPanelu)
	{
		int szerokoscPanelu = zawartoscPanelu.getWidth();
		int wysokoscPanelu = zawartoscPanelu.getHeight();
		int[] tablicaPikseli = new int[szerokoscPanelu*wysokoscPanelu];

		for (int wiersz = 0; wiersz < wysokoscPanelu; wiersz++)
		{
			for (int kolumna = 0; kolumna < szerokoscPanelu; kolumna++)
		    	{
		        	tablicaPikseli[wiersz*kolumna] = zawartoscPanelu.getRGB(kolumna, wiersz);
		    	}
		}
		return tablicaPikseli;
	}
	*/
	public void utworzSiec() throws Exception
	{
		siec = new SiecNeuronowa(90000, 8, 10, 1, new KrzywaLogistyczna());		
	}
	
	public void ustawDaneSieci()
	{
		
	}
	
	public void rozpocznijNauczanieSieci() throws Exception
	{
		siec.LosujWagi(0.0, 1.0);
		//siec.UczSiec(Wyjscie, Wejscie, 0.1);
	}
	
	public void mouseDragged(MouseEvent arg0)
	{
		Object obiekt = arg0.getSource();
		/*if (obiekt == )
		{
			x = 
		}
		*/
	}

	public void mouseMoved(MouseEvent arg0)
	{
		
	}
	
	public void actionPerformed(ActionEvent arg0)
	{
		Object obiekt = arg0.getSource();
		if (obiekt == wczytaj)
		{
			pobierzDaneDlaSieci();
		}
	}
	
	public static void main(String[] args) throws Exception
	{
		TGTA tgta = new TGTA();
		tgta.setVisible(true);
	}
}

Ogólnie jest to prosty projekt z sieci MLP wraz z EBP. Sieć sama działa prawidłowo bo testowałem na prostym przykładzie. Chcę mieć możliwość rysowania na BufferedImage. Znalazłem w sieci, że w ten sposób który jest w metodzie utworzPoleRysowania pozwala na bezpośrednie rysowanie w BufferedImage. Problem w tym, że nie potrafię uczynić tego widocznym i rysować na tym myszą. Męczę się już kilka dni nad tym, a chciałbym mieć to za sobą bo bardzo jestem ciekaw jak się będzie sprawować sieć przy bieżących ustawionych parametrach. Bardzo proszę o pomoc lub skierowanie na odpowiedni temat/treść (szukałem, ale chyba słabo mi poszło).

Pozdrawiam.

0
                 panelRysowania = new JPanel();
                panelRysowania.setBounds(0, 0, x, y);
                obszarRysowania = new BufferedImage(x, y, BufferedImage.TYPE_INT_ARGB);
                Graphics2D obszar = obszarRysowania.createGraphics();
                obszar.setColor(Color.GREEN);
                obszar.fillRect(0, 0, 100, 100);
                obszar.setBackground(Color.WHITE);
                panelRysowania.paint(obszar);
                panel.add(panelRysowania);

Oj oj oj namieszałeś.

  1. panelRysowania.paint(obszar); rysowanie - robisz to źle :F

  2. Aby narysować tam obrazek musisz zrobić tak:
    new JPanel(){

panelRysowania paint(Graphics g){
g.drawImage(obrazek,null,null);//rysuje obrazek na panelu
};
}
i teraz za każdym razem kiedy zrobisz
panelRysowania.repaint() (automatycznie ci to robi jak zmieniasz pozycje okna albo cos w tym stylu, jak chcesz zrobić tak aby tylko na twoje zawołanie było to dajesz panelRysowania.setIgnoreRepaint(true) )
obrazek się odświeży

Mam nadzieję że czaisz teraz :P

0

Szczerze mówiąc jak narysować coś nie używając myszy i obiektu klasy BufferedImage potrafię, ale rada jak najbardziej cenna bo nie wiedziałem w jaki sposób działa metoda repaint za co dziękuję. Na obszarze który tworzę muszę narysować coś np. jakiś symbol, dokonać konwersji na BufferedImage, a następnie dokonać podział obrazu na siatkę lub pobrać z tego obrazu piksele. Muszę podać uzyskane dane na sieć by móc dokonać jej uczenia i użyć jej do rozpoznawania znaków na bieżąco. Chyba nie wyrobię się z tym wszystkim w terminie więc proszę osobę potrafiącą wykonać zagadnienie do 10.03.2013 wraz z dokumentacją za opłatą proszę o zgłoszenie się pod numer 665252449 lub na PW. Wyjawię wszystkie szczegóły w razie kontaktu.

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