Zapamietywanie narysowanego obrazu

0

mam napisac program ktory umozliwia rysowanie po JPanelu. i wszystko dziala oprocz zapamietywanie obrazu w momencie np. zmiany wielkosci okna. jak maksymalizuje to wtedy wszystkie punkty gina.
oto kod:

public class Paint extends JFrame implements MouseListener {
	JPanel paintField = new JPanel();
	public Paint() {
		super("Paint");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.paintField.setBackground(Color.WHITE);
		this.paintField.addMouseListener(this);
		JPanel pnl = new JPanel();
		pnl.setLayout(new BorderLayout(3,3));
		pnl.add(this.paintField, BorderLayout.CENTER);
		getContentPane().add(pnl);
	}
         public void mouseClicked(MouseEvent me) {
		this.paintField.getGraphics().drawLine(me.getX(), me.getY(), me.getX(), me.getY());
	}
	public static void main(String[] args) {
		Paint pnt = new Paint();
		pnt.pack();
		pnt.setSize(800,600);
		pnt.setVisible(true);
	}
}

usunalem czesc kodu. natomiast jak przeslaniam metode paint() dla JPanela i w mouseClicked daje this.paintField.paint(this.paintField.getGraphics()); gdzie paint ma kod:

public void paint(Graphics g) {
		super.paint(g);
		g.drawLine(this.x, this.y, this.x, this.y);
	}

oczywiscie wczesniej przekazuje wspolrzedne (mam klase ktora dziedziczy po JPanel) to mam tylko ostatni punkt, ale za to on nie znika po zmianie wymiarow okna.
prosilbym po podpowiedzenie mi jak to zrobic zeby laczylo w sobie te dwa rozwiazania, czyli zeby pamietalo wszystkie punkty po zmianie rozmiaru okna (badz ukryci)
z gory dziekuje

0

mysle ze problem moze byc w tym ze nie masz:

	addWindowListener(new WindowAdapter() { // wcisniecie 'krzyzyka'
			public void windowActivated(WindowEvent e) {
				jakiś_tam_panel.repaint();
			} 
			public void 	windowStateChanged(WindowEvent e) {
				jakiś_tam_panel.repaint();
			}
		});

no i za kazdym razem jak sie okienko zmienia wywoalny zostanie repaint i sie wyrysuja paint'em wszystkie p-ty (których wspolrzedne masz na pewno gdzies zapamietane)

pzdr.

0

niezbyt rozumiem :O mam gdzies przechowywac wszystkie wspolrzedne punktow? np na stosie. niby mozna ale rozwiazanie troche karkolomne bo jak bede miec pole 800 na 600 czyli 480K pikseli i jeszcze beda w kilkunastu roznych kolorach to przykazdym zmianie stanu okna przeciez to bedzie trwalo. nie ma jakiegos latwiejszego sposobu? dam caly kod moze ktos bedzie miec jakis pomysl:

public class Paint extends JFrame {
	private DrawBoard paintField;	
	public Paint() {
		super("Paint");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		
		this.paintField = new DrawBoard();
		this.paintField.setBackground(Color.WHITE);
		Mouse ml = new Mouse(this.paintField);
		this.paintField.addMouseListener(ml);
		Window wl = new Window(this.paintField);
		this.addWindowFocusListener(wl);
		this.addWindowListener(wl);
		this.addWindowStateListener(wl);
		JPanel pnl = new JPanel();
		pnl.setLayout(new BorderLayout(3,3));
		pnl.add(this.paintField, BorderLayout.CENTER);	
		getContentPane().add(pnl);
	}
	public static void main(String[] args) {
		Paint pnt = new Paint();
		pnt.pack();
		pnt.setSize(800,600);
		pnt.setVisible(true);
	}
}
public class Mouse extends MouseAdapter {		
	private DrawBoard drawBoard;	
	public Mouse(DrawBoard db) {
		this.drawBoard = db;
	}	
	public void mouseClicked(MouseEvent me) {
		this.drawBoard.setX(me.getX());
		this.drawBoard.setY(me.getY());
		this.drawBoard.paint(this.drawBoard.getGraphics());
		//this.drawBoard.getGraphics().drawLine(me.getX(), me.getY(), me.getX(), me.getY());
	}
}
public class Window extends WindowAdapter {	
	private DrawBoard drawBoard;	
	public Window(DrawBoard db) {
		this.drawBoard = db;
	}	
	public void windowOpened(WindowEvent we) {
		this.drawBoard.repaint();
	}	
	public void windowClosing(WindowEvent we) {
		this.drawBoard.repaint();
	}
	public void windowClosed(WindowEvent we) {
		this.drawBoard.repaint();
	}	
	public void windowIconified(WindowEvent we) {
		this.drawBoard.repaint();
	}
	public void windowDeiconified(WindowEvent we) {
		this.drawBoard.repaint();
	}	
	public void windowActivated(WindowEvent we) {
		this.drawBoard.repaint();
	}	
	public void windowDeactivated(WindowEvent we) {
		this.drawBoard.repaint();
	}
	public void windowStateChanged(WindowEvent we) {
		this.drawBoard.repaint();
	}
	public void windowGainedFocus(WindowEvent we) {
		this.drawBoard.repaint();
	}	
	public void windowLostFocus(WindowEvent we) {
		this.drawBoard.repaint();
	}
}
public class DrawBoard extends JPanel {
	private int x = -1;
	private int y = -1;
	public void paint(Graphics g) {
		super.paint(g);
		g.drawLine(this.x, this.y, this.x, this.y);
		
	}	
	public void setX(int x) {
		this.x = x;
	}	
	public void setY(int y) {
		this.y = y;
	}
}

w tej wersji moze miec na JPanelu tylko jeden punkt. jezeli w metodzie mouseClicked usuniemy trzy pierwsze linijki i usuniemy komentarz to mozna umiescic kilka puntkow jednoczesnie ale jest problem z zapamientaniem ich przy minimalizacji czy innych czynnosciach zwiazanych z oknem

0

ano niestety powinnas miec zapamietane gdzies te wszystkie p-ty...i potem je w jakiejs petli ordysowywac...przy kazdej zmianie okna...

0

przeanalizuj to....

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class Kolokwium2 extends JFrame{
    MyPanel moj = new MyPanel();
    JButton button = new JButton("Wczytaj");
    Vector punkty=new Vector();
    File plik;
    public Kolokwium2(){
        JMenuBar menuBar = new JMenuBar();
        JMenu menuFile = new JMenu();
        JMenuItem menuFileExit = new JMenuItem();
        menuFile.setText("Plik");
        menuFileExit.setText("Zakończ");
        setSize(new Dimension(600,400));
        setTitle(":-)");
        Container c = getContentPane();
        c.add(moj);
        c.add(button, BorderLayout.SOUTH);
        this.addWindowListener (
                   new WindowAdapter() {
                       public void windowClosing(WindowEvent e) {
                            Kolokwium2.this.zamknijOkno();  }
                   });
        button.addActionListener(
        new ActionListener(){
            public void actionPerformed(ActionEvent x){
                JFileChooser filechooser = new JFileChooser();
                int wynik=filechooser.showOpenDialog(filechooser);
                if(wynik==JFileChooser.APPROVE_OPTION){
                    plik=filechooser.getSelectedFile();
                }
               try{
               BufferedReader in = new BufferedReader(new FileReader(plik));
               String linia=in.readLine();
               String[] lista=linia.split(",");
               for(int i=0;i<lista.length;i++){
                   punkty.add(Integer.parseInt(lista[i]));
               }
               repaint();
              }catch(Exception exe){   }
            }
        });
        menuFileExit.addActionListener(                 //wcisniecie Plik->Zakończ
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    Kolokwium2.this.zamknijOkno(); }
            });

        menuFile.add(menuFileExit);
        menuBar.add(menuFile);
        setJMenuBar(menuBar);
    }
    void zamknijOkno(){
        System.exit(0);
    }



    class MyPanel extends JPanel{
          int pozX;
          int pozY;
          boolean flaga=false;
          public MyPanel(){
          this.addMouseListener(
               new MouseAdapter(){
                   public void mouseClicked(MouseEvent e){
                       pozX=e.getX();
                       pozY=e.getY();
                       punkty.add(pozX);
                       punkty.add(pozY);
                       repaint();
                   }
                   public void mouseEntered(MouseEvent e){
                               flaga=true;
                               repaint();
                   }
                   public void mouseExited(MouseEvent e){
                               flaga=false;
                               repaint();
                   }
               });
          }
          public void paint(Graphics g){
              super.paint(g);
              if(punkty.size()>=4){
                  if(!flaga){
                  g.setColor(Color.red);
                  }else{
                      g.setColor(Color.green);
                  }

              for(int i=0;i<punkty.size()-3;i=i+2){
                  System.out.println(punkty.get(i)+" - "+punkty.get(i+1)+" - "+punkty.get(i+2)+" - "+punkty.get(i+3));
                  g.drawLine((Integer)punkty.get(i),(Integer)punkty.get(i+1),(Integer)punkty.get(i+2),(Integer)punkty.get(i+3));
              }
            }
          }
    }

    public static void main(String[] args){
        Kolokwium2 kolo2 = new Kolokwium2();
        kolo2.show();
    }
}

pzdr.

0

czyli ta petle musze umiescic w metodzie paint, tak czy sie mysle?

0

yeap :-)

0

zrobilem i nawet dziala [green] ale srednio mi sie taki sposob podoba :/
dzieki za pomoc :)

0
Pigula napisał(a)

zrobilem i nawet dziala [green] ale srednio mi sie taki sposob podoba :/

Niestety nie masz wielkiego wyboru. Bezwzględnie musisz zapamiętać dane o rysowaniu. Masz kilka możliwości zaczynając od punktów a kończąc na figurach.

0
Luuki napisał(a)

Niestety nie masz wielkiego wyboru. Bezwzględnie musisz zapamiętać dane o rysowaniu. Masz kilka możliwości zaczynając od punktów a kończąc na figurach.

albo mozna uzyc BufferedImage i juz nie trzeba uzywac WindowListenera :) no i nie trzeba nigdzie zapamietywac wspolrzednych [!!!]

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