Dlaczego program nie rysuje w BufferedImage

0

Program na tym etapie ma rysować kreski w BufferedImage. Nie rozumiem dlaczego linie nie zostają na rysunku. Poza tym jak powiększam okno to wielkość panelu na którym jest BufferedImage nie zwiększa się. W którym miejscu popełniam błąd?

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;

public class Malarz extends JFrame implements ActionListener, MouseListener, MouseMotionListener
{

	PanelDoRysowania p =new PanelDoRysowania();
    Point startPoint, endPoint, prePoint;
    BufferedImage bi;
    Graphics2D g2;

   public Malarz() throws IOException
    {
        Toolkit zestaw = Toolkit.getDefaultToolkit();
        Dimension rozmiarEkranu = zestaw.getScreenSize();
        int szerEkranu = rozmiarEkranu.width;
        int wysEkranu = rozmiarEkranu.height;
        setTitle("Malarz");
        setSize(szerEkranu/2,wysEkranu/2);
        setLocation(szerEkranu/4,wysEkranu/4);
        setResizable(true);
        BufferedImage ikona = ImageIO.read(new File("im.JPG"));
        setIconImage(ikona);
        
        add(doToolBar(),BorderLayout.NORTH);
        add(p,BorderLayout.CENTER);
        setJMenuBar(doMenu());
        
       addMouseListener(this);
       addMouseMotionListener(this);
       
       setVisible(true);
       p.setVisible(true);
       
       bi= new BufferedImage(p.getWidth(),p.getHeight(),BufferedImage.TYPE_INT_RGB);
       g2=bi.createGraphics();
		g2.setColor(Color.WHITE);
		g2.fillRect(0,0,p.getWidth(),p.getHeight()); 
     
    }


    public JMenuBar doMenu()
    {
        JMenuBar mb = new JMenuBar();

	//do zaimplementowania

        return mb;
    }


    public JToolBar doToolBar()
    {
        JToolBar bar = new JToolBar("Kształty");
      
        JButton b1 = new JButton(new ImageIcon("im2.JPG"));
        bar.add(b1);
        b1.setToolTipText("linia");
        b1.addActionListener(this);
        JButton b2 = new JButton(new ImageIcon("im2.JPG"));
        bar.add(b2);
        b2.setToolTipText("linia");
        b2.addActionListener(this);
        JButton b3 = new JButton(new ImageIcon("im2.JPG"));
        bar.add(b3);
        b3.setToolTipText("linia");
        b3.addActionListener(this);
        JButton b4 = new JButton(new ImageIcon("im2.JPG"));
        bar.add(b4);
        b4.setToolTipText("linia");
        b4.addActionListener(this);
        JButton b5 = new JButton(new ImageIcon("im2.JPG"));
        bar.add(b5);
        b5.setToolTipText("linia");
        b5.addActionListener(this);      

        return bar;
    }

    private class PanelDoRysowania extends JPanel
	{		 
 			PanelDoRysowania(){
			 super();
			 
		 }
		 
		 
    	public void paintComponent(Graphics g)
 		{
    		g.drawImage(bi, 0, 0, null);

 		}

		  
	}

    public void mouseClicked(MouseEvent e){}

	public void mousePressed(MouseEvent e){
		startPoint = new Point(e.getPoint());
		prePoint= new Point(startPoint);

		}

	public void mouseReleased(MouseEvent e){
		endPoint = new Point(e.getPoint());
		bi.createGraphics();
		repaint();

	}

	public void mouseEntered(MouseEvent e){}

	public void mouseExited(MouseEvent e){}

	public void mouseDragged(MouseEvent e){
		
			Graphics2D g2 = (Graphics2D)getGraphics();
			g2.setXORMode(Color.BLACK);
			g2.setColor(g2.getBackground());
			g2.drawLine(startPoint.x, startPoint.y, prePoint.x,prePoint.y);
			g2.setXORMode(g2.getBackground());
			g2.setColor(Color.BLACK);
			g2.drawLine(startPoint.x, startPoint.y, e.getX(), e.getY());
			prePoint=e.getPoint();

	}

	public void mouseMoved(MouseEvent e){}

    
    
    @Override
    public void actionPerformed(ActionEvent e)
    {
       switch (Integer.parseInt(e.getActionCommand()))
        {

	//do zaimplementowania

        }
    }

 
  

    public static void main(String[] args) throws IOException
    {
        Malarz m = new Malarz();
        m.setVisible(true);
        m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }


	
	
}
0
  1. Panel, na którym jest BufferedImage się powiększa, nie powiększa się sam BufferedImage.
  2. Który fragment kodu rysuje Twoim zdaniem kreski na BufferedImage? Ten, który jest w mouseDragged() rysuje na panelu, potem repaint() odrysowuje BufferedImage i przykrywa kreskę.
    Wg mnie koncepcja programu jest błędna.
0

BufferImage przy definicji pobiera rozmiar panelu, ale w takim razie trzeba by było go znowu jakoś definiować przy powiększaniu okna?
A co do rysowania to skoro nie w metodzie mouseDragged() to gdzie indziej mam umieścić kod?
Koncepcje zaczerpnęłam z tej strony: http://math.uni.lodz.pl/~kowalcr/Java1/08.Grafika/08.Grafika.txt. Nie rozumiem czemu miała by być błędna. Na pewno nie jest jakaś wielce zaawansowana, ale ja dopiero zaczęłam programować w Javie.

0

Musiałbyś skorzystać z ComponentListenera i po zmianie rozmiaru okna tworzyć nowy bi i przerysować do niego stary bi (ewentualnie powiększając/pomniejszając narysowane elementy).
Rysować możesz w metodzie mouseDragged(), ale rysować musisz równocześnie na panelu i w obiekcie bi. Ty rysujesz tylko na panelu.

0

Zmieniono metodę mouseDragged i nic. Szczerze mówiąc nie wiem co robię. Na pewno coś nie tak bo nie działa. Czy może w metodzie mouseRealised coś jest nie tak?

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;

public class Malarz extends JFrame implements ActionListener, MouseListener, MouseMotionListener
{

	PanelDoRysowania p =new PanelDoRysowania();
    Point startPoint, endPoint, prePoint;
    BufferedImage bi;
    Graphics2D g2im;

   public Malarz() throws IOException
    {
        Toolkit zestaw = Toolkit.getDefaultToolkit();
        Dimension rozmiarEkranu = zestaw.getScreenSize();
        int szerEkranu = rozmiarEkranu.width;
        int wysEkranu = rozmiarEkranu.height;
        setTitle("Malarz");
        setSize(szerEkranu/2,wysEkranu/2);
        setLocation(szerEkranu/4,wysEkranu/4);
        setResizable(true);
        BufferedImage ikona = ImageIO.read(new File("im.JPG"));
        setIconImage(ikona);
        
        add(doToolBar(),BorderLayout.NORTH);
        add(p,BorderLayout.CENTER);
        setJMenuBar(doMenu());
        
       addMouseListener(this);
       addMouseMotionListener(this);
       
       setVisible(true);
       p.setVisible(true);
       
       bi= new BufferedImage(p.getWidth(),p.getHeight(),BufferedImage.TYPE_INT_RGB);
       g2im=bi.createGraphics();
		g2im.setColor(Color.WHITE);
		g2im.fillRect(0,0,p.getWidth(),p.getHeight()); 
     
    }


    public JMenuBar doMenu()
    {
        JMenuBar mb = new JMenuBar();

	//do zaimplementowania

        return mb;
    }


    public JToolBar doToolBar()
    {
        JToolBar bar = new JToolBar("Kształty");
      
        JButton b1 = new JButton(new ImageIcon("im2.JPG"));
        bar.add(b1);
        b1.setToolTipText("linia");
        b1.addActionListener(this);
        JButton b2 = new JButton(new ImageIcon("im2.JPG"));
        bar.add(b2);
        b2.setToolTipText("linia");
        b2.addActionListener(this);
        JButton b3 = new JButton(new ImageIcon("im2.JPG"));
        bar.add(b3);
        b3.setToolTipText("linia");
        b3.addActionListener(this);
        JButton b4 = new JButton(new ImageIcon("im2.JPG"));
        bar.add(b4);
        b4.setToolTipText("linia");
        b4.addActionListener(this);
        JButton b5 = new JButton(new ImageIcon("im2.JPG"));
        bar.add(b5);
        b5.setToolTipText("linia");
        b5.addActionListener(this);      

        return bar;
    }

    private class PanelDoRysowania extends JPanel
	{		 
 			PanelDoRysowania(){
			 super();
			 
		 }
		 
		 
    	public void paintComponent(Graphics g)
 		{
    		g.drawImage(bi, 0, 0, null);

 		}

		  
	}

    public void mouseClicked(MouseEvent e){}

	public void mousePressed(MouseEvent e){
		startPoint = new Point(e.getPoint());
		prePoint= new Point(startPoint);

		}

	public void mouseReleased(MouseEvent e){
		endPoint = new Point(e.getPoint());
		bi.createGraphics();
		repaint();

	}

	public void mouseEntered(MouseEvent e){}

	public void mouseExited(MouseEvent e){}

	public void mouseDragged(MouseEvent e){
		
			Graphics2D g2 = (Graphics2D)getGraphics();
			g2.setXORMode(Color.BLACK);
			g2.setColor(g2.getBackground());
			g2.drawLine(startPoint.x, startPoint.y, prePoint.x,prePoint.y);
			g2.setXORMode(g2.getBackground());
			g2.setColor(Color.BLACK);
			g2.drawLine(startPoint.x, startPoint.y, e.getX(), e.getY());
			
			g2im.setXORMode(Color.BLACK);
			g2im.setColor(g2im.getBackground());
			g2im.drawLine(startPoint.x, startPoint.y, prePoint.x,prePoint.y);
			g2im.setXORMode(g2im.getBackground());
			g2im.setColor(Color.BLACK);
			g2im.drawLine(startPoint.x, startPoint.y, e.getX(), e.getY());
			
			prePoint=e.getPoint();

	}

	public void mouseMoved(MouseEvent e){}

    
    
    @Override
    public void actionPerformed(ActionEvent e)
    {
       switch (Integer.parseInt(e.getActionCommand()))
        {

	//do zaimplementowania

        }
    }

 
  

    public static void main(String[] args) throws IOException
    {
        Malarz m = new Malarz();
        m.setVisible(true);
        m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }


	
	
}
0

Rysuje, ale chyba kolorem tła.

        public void mouseReleased(MouseEvent e){
                endPoint = new Point(e.getPoint());
                g2im.setColor(Color.BLACK);
                g2im.drawLine(startPoint.x, startPoint.y, e.getX(), e.getY());
                repaint();
        }
        public void mouseDragged(MouseEvent e){
 
                        Graphics2D g2 = (Graphics2D)getGraphics();
                        g2.setXORMode(Color.BLACK);
                        g2.setColor(g2.getBackground());
                        g2.drawLine(startPoint.x, startPoint.y, prePoint.x,prePoint.y);
                        g2.setXORMode(g2.getBackground());
                        g2.setColor(Color.BLACK);
                        g2.drawLine(startPoint.x, startPoint.y, e.getX(), e.getY());
 
                        prePoint=e.getPoint();
 
        }

Musisz jeszcze dodać przeliczenie współrzędnych, zwracane przez e.getX() i e.getY() różnią się od współrzędnych w bi.

0

Dzięki wielkie bogdans.

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