Rysowanie w oknie

0

Piszę namiastkę prostego programu graficznego, którego zadaniem jest rysowanie elips i prostokątów. Problem w tym, że program nie działa :P Nie wiem czemu. Sprawdzałem czy reaguje na wciskanie myszy - i okazało się, że tak. Nie mniej jednak, program nie działa. Podam kod:

//Paint.java
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
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 javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class Paint extends JFrame implements MouseListener, ActionListener, MouseMotionListener {
	
	private JPanel pPanel;
	private JButton bElipsa, bProstokat, bR, bG, bB;
	private boolean nbFigura;
	private int nKolor;
	private Figura [] fig;
	private int x1, y1, x2, y2;
	private boolean czyRysowac;
	private Graph gGrafika;
	
	public Paint() {
		inicjalizuj();
		setSize(1024, 600);
		setLocationRelativeTo(null);
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}

	@Override
	public void mousePressed(MouseEvent me) {
		x1 = me.getX();
		y1 = me.getY();
		
		if (!czyRysowac)
			gGrafika.set1(x1, y1);
		
		rozpocznijRysowanie();
	}

	@Override
	public void mouseReleased(MouseEvent me) {
		zakonczRysowanie();
	}

	@Override
	public void mouseClicked(MouseEvent me) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseEntered(MouseEvent me) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent me) {
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public void mouseDragged(MouseEvent me) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseMoved(MouseEvent me) {
		x2 = me.getX();
		y2 = me.getY();
		gGrafika.set2(x2, y2);
		
		if (czyRysowac)
			gGrafika.repaint();
	}
	
	public void inicjalizuj() {
		pPanel = new JPanel();
		bElipsa = new JButton("Elipsa");
		bElipsa.addActionListener(this);
		bProstokat = new JButton("Prostokąt");
		bProstokat.addActionListener(this);
		bR = new JButton("Czerwony");
		bR.addActionListener(this);
		bG = new JButton("Zielony");
		bG.addActionListener(this);
		bB = new JButton("Niebieski");
		bB.addActionListener(this);
		fig = new Figura[0];
		czyRysowac = false;
		
		pPanel.setSize(224, 600);
		pPanel.setLayout(new GridLayout(5, 1, 0, 120));
		pPanel.add(bElipsa, BorderLayout.NORTH);
		pPanel.add(bProstokat,BorderLayout.NORTH);
		pPanel.add(bR, BorderLayout.SOUTH);
		pPanel.add(bG, BorderLayout.SOUTH);
		pPanel.add(bB, BorderLayout.SOUTH);
		
		add(pPanel, BorderLayout.WEST);
		
		gGrafika = new Graph();
		gGrafika.addMouseListener(this);
		gGrafika.addMouseMotionListener(this);
		add(gGrafika, BorderLayout.CENTER);
	}

	@Override
	public void actionPerformed(ActionEvent ae) {
		String str = ae.getActionCommand();
		
		if (str.equals("Elipsa"))
			nbFigura = false;
		
		if (str.equals("Prostokąt"))
			nbFigura = true;
		
		if (str.equals("Czerwony"))
			nKolor = 1;
		
		if (str.equals("Zielony"))
			nKolor = 2;
		
		if (str.equals("Niebieski"))
			nKolor = 3;
	}
	
	public int minimum(int n1, int n2) {
		return n1 < n2 ? n1 : n2;
	}
	
	public int modulo(int n) {
		if (n < 0)
			return -n;
		
		return n;
	}
	
	public void rozpocznijRysowanie() {
		x2 = x1;
		y2 = y1;
		czyRysowac = true;
	}
	
	public void zakonczRysowanie() {
		int len = fig.length;
		Figura fig2 [] = new Figura[len + 1];
		
		for (int i = 0; i < len - 1; i++)
			fig2[i] = fig[i];
		
		fig2[len] = new Figura(minimum(x1, x2), minimum(y1, y2), modulo(x1 - x2), modulo(y1 - y2), nbFigura, nKolor);
		fig = fig2;
		
		gGrafika.setFF(fig);
		
		czyRysowac = false;
	}
	
	public static void main(String [] args) {
		new Paint();
	}
}
//Figura.java
public class Figura {
	
	private int x, y, szer, wys;
	private boolean type; // false - elipsa, true - prostokąt
	private int color; // 1 - red, 2 - green - 3 blue;
	
	public Figura(int nx, int ny, int nszer, int nwys, boolean ntype, int ncolor) {
		x = nx;
		y = ny;
		szer = nszer;
		wys = nwys;
		type = ntype;
		color = ncolor;
	}
	
	public Figura() {
	}
	
	public void setAll(int nx, int ny, int nszer, int nwys, boolean ntype, int ncolor) {
		x = nx;
		y = ny;
		szer = nszer;
		wys = nwys;
		type = ntype;
		color = ncolor;
	}
	
	public int getX() {
		return x;
	}
	
	public int getY() {
		return y;
	}
	
	public int getSzer() {
		return szer;
	}
	
	public int getWys() {
		return wys;
	}
	
	public boolean getType(){
		return type;
	}
	
	public int getColor() {
		return color;
	}

}
//Graph.java
import java.awt.Graphics;

import javax.swing.JPanel;


public class Graph extends JPanel {
	private Figura [] f;
	private int x1, x2, y1, y2;
	private boolean nbFigura;
	private int nKolor;
	
	public Graph() {
		f = new Figura[0];
	}
	
	public void set1(int x, int y) {
		x1 = x;
		y1 = y;
	}
	
	public void set2(int x, int y) {
		x2 = x;
		y2 = y;
	}
	
	public void setFT(boolean bF) {
		nbFigura = bF;
	}
	
	public void setK(int kolor) {
		nKolor = kolor;
	}
	
	public void setFF(Figura [] ff) {
		f = ff;
	}
	
	@Override
	public void paint(Graphics g) {
		for (int i = 0; i < f.length; i++)
			g.drawOval(f[i].getX(), f[i].getY(), f[i].getSzer(), f[i].getWys());
		
		g.drawOval(minimum(x1, x2), minimum(y1, y2), modulo(x1 - x2), modulo(y1 - y2));
	}
	
	public int minimum(int n1, int n2) {
		return n1 < n2 ? n1 : n2;
	}
	
	public int modulo(int n) {
		if (n < 0)
			return -n;
		
		return n;
	}
	
	
}

Czy mógłby ktoś zerknąć czemu nie działa? Przyznaję, że nie potrafię grzebać w kodzie, jeżeli uczę się sam z internetem, a nie z książki.
Pozdrawiam

0

Poprawiłem program i teraz daje się ryzować elipsy, ale po narysowaniu dwóch wywala error:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at Graph.paint(Graph.java:45)
	at javax.swing.JComponent.paintToOffscreen(Unknown Source)
	at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
	at javax.swing.RepaintManager.paint(Unknown Source)
	at javax.swing.JComponent._paintImmediately(Unknown Source)
	at javax.swing.JComponent.paintImmediately(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
	at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source) 

P.S.
Już znalazłem błąd. W pętli zliczałem 'i' do len -1, a powinienem do len.

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