Nie widzę co rysuję

0

Witam. Mam pewien problem. Mam do napisanie do szkoły Painta na wyższą ocenę :)
Otóż: Problem polega na tym że nie widzę co rysuję. Tzn w zwykłej linii jest ok ale przy prostej linii i prostokącie już tak nie jest. Chodzi mi o to że jak jeszcze nie puszcze klawisza myszki to żeby ten prostokąt / linia prosta była widoczna. Jest dopiero widoczna linia prosta / prostokąt po puszczeniu klawisza myszki.
Fragment kodu:

	public void paint(Graphics g)
	{
		        
		if (obraz == null)
		{
			obraz = createImage(800 , 600);
			g2d = (Graphics2D)obraz.getGraphics();
			clear();
		}
		
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING , RenderingHints.VALUE_ANTIALIAS_ON);
		g.drawImage(obraz , 0 , 0 , null);
	}
	
	public void mouseMoved(MouseEvent e){}
	
	public void mouseDragged(MouseEvent e)
	{
		int b = e.getModifiersEx();
		
		if (b == MouseEvent.BUTTON1_DOWN_MASK)
		{
			if (czyGumka == true) g2d.setStroke(new BasicStroke(15));
			if (czyGumka == false) g2d.setStroke(new BasicStroke(Integer.parseInt(cGruboscLinii.getSelectedItem())));
			
			if (cTypPedzla.getSelectedItem() == "Linia")
			{
				currentX = e.getX();
				currentY = e.getY();
				if (g2d != null) g2d.drawLine(oldX , oldY , currentX , currentY);
				repaint();
				oldX = currentX;
				oldY = currentY;
			}
			
			if (cTypPedzla.getSelectedItem() == "Prostokat")
			{
				end = e.getPoint();
                rect.setFrameFromDiagonal(start, end);
                repaint();
			}
			
			czyZmiany = true;
		}
	}

	public void mouseReleased(MouseEvent e)
	{
		int b = e.getButton();
		
		if (b == MouseEvent.BUTTON1)
		{
			if (cTypPedzla.getSelectedItem() == "Linia")
			{
				oldX = e.getX();
				oldY = e.getY();
			}
			
			if (cTypPedzla.getSelectedItem() == "Linia prosta")
			{
				end = e.getPoint();
				g2d.drawLine(start.x , start.y , end.x , end.y);
				repaint();
			}
			
			if (cTypPedzla.getSelectedItem() == "Prostokat")
			{
				end = e.getPoint();
				rect.setFrameFromDiagonal(start , end);
				g2d.draw(rect);
				repaint();
			}
		}
	}
	
	public void mousePressed(MouseEvent e)
	{
		int b = e.getButton();
		
		if (b == MouseEvent.BUTTON1)
		{
			if (cTypPedzla.getSelectedItem() == "Linia")
			{
				oldX = e.getX();
				oldY = e.getY();
			}
			
			if (cTypPedzla.getSelectedItem() == "Linia prosta")
			{
				start = e.getPoint();
			}
			
			if (cTypPedzla.getSelectedItem() == "Prostokat")
			{
				start = e.getPoint();
			}
		}
	}

Proszę o pomoc :)
Z góry dziękuję :)
EDIT: i mam jeszcze pytanie. Jak zrobić koło. Tzn tak samo że klikam, przeciągam, widzę wtedy, puszczam i sie ładne koło rysuje :)

1

Napisałem kiedyś Painta, w którym widzę co rysuję.

public void mousePressed(MouseEvent evt) 
{
     x = evt.getX();
     y = evt.getY();        
}
public void mouseDragged(MouseEvent evt) 
{
     x2 = evt.getX();
     y2 = evt.getY();
     //opuszczam fragment wykorzystywany tylko podczas rysowania krzywych i dowolnych wielokątów
     repaint();
}
public void mouseReleased(MouseEvent evt) 
{
      x2 = evt.getX();
      y2 = evt.getY();
      Shape shape = null;         
      Stroke stroke = new BasicStroke(currentWidth);
      switch(whatFigure)
      {
           case LINE:
               shape = new Line2D.Double(x,y,x2,y2);
               break;
           case RECTANGLE:
               shape = new Rectangle2D.Double(Math.min(x,x2),Math.min(y,y2),Math.abs(x-x2),Math.abs(y-y2));                    
               break;                
           case ELLIPSE:
               shape = new Ellipse2D.Double(Math.min(x,x2),Math.min(y,y2),Math.abs(x-x2),Math.abs(y-y2));
               break;
          //opuszczam fragment dotyczący rysowania krzywych i dowolnych wielokątów
           default:
               return;                
       }     
       ColoredShape coloredShape = new ColoredShape(shape,kolor,stroke);
       figures.add(coloredShape);         
       repaint();
}
public void paintComponent(Graphics g)
{
      super.paintComponent(g);
      Graphics2D g2d = (Graphics2D)g;
      for(int i=0;i<figures.size();i++)
      {
           ColoredShape figure = figures.get(i); 
           g2d.setColor(figure.getColor());
           g2d.setStroke(figure.getStroke());              
           g2d.draw(figure.getShape());
      } 
      //....
      //poniżej jest fragment odpowiedzialny za rysowanie w locie (widać co się rysuje)
      Stroke stroke = new BasicStroke(currentWidth);
      Shape shape = null;
      g2d.setStroke(stroke);
      g2d.setColor(kolor);
      switch(whatFigure)
      {
           case LINE:
               shape = new Line2D.Double(x,y,x2,y2);
               break;
           case RECTANGLE:
               shape = new Rectangle2D.Double(Math.min(x,x2),Math.min(y,y2),Math.abs(x-x2),Math.abs(y-y2));
               break;
           case ELLIPSE:
               shape = new Ellipse2D.Double(Math.min(x,x2),Math.min(y,y2),Math.abs(x-x2),Math.abs(y-y2));
               break;
        }
        if(shape != null)
       {
             g2d.draw(shape);
       }
}
0

Dzięki za odpowiedz :) Zaraz to obczaje

EDIT: Jakiego typu są zmienne whatFigure i figures ?
Jeszcze raz dzięki za odpowiedź

1
krzysiek95 napisał(a):

Jakiego typu są zmienne whatFigure i figures ?

whatFigure może być enumem w stylu:

public enum Figure {
     LINE,
     RECTANGLE,
     ELLIPSE
}

a figures listą:

    List<Figure> figures = new ArrayList<Figure>();
1

@bakeraw2, prawie zgadłeś, whatFigure jest typu int.

    private final int LINE = 1;
    private final int RECTANGLE = 2;
    private final int ELLIPSE = 3;
    private final int POLYGON = 4;
    private final int CURVE = 5;
    private int whatFigure = LINE;

figures jest typu ArrayList<ColoredFigure>, ColoredFigure jest "pustą" klasa abstrakcyjną utworzona tylko po to by można w jednej kolekcji przechowywać obiekty z klasy ColoredShape

public class ColoredShape extends ColoredFigure 
{
    private Color color;
    private Shape shape;
    private Stroke stroke = null;
    ...

przeznaczonej do pamiętania odcinków, prostokątów, elips i wielokątów, i obiekty z klasy ColoredCurve

public class ColoredCurve extends ColoredFigure
{
    private Color color;
    private ArrayList<Point> points = new ArrayList<Point>();
    private int width = 0;

przeznaczone do pamiętania krzywych.
Przechowuje te dwa typy obiektów w jednej kolekcji, żeby łatwo było napisać funkcję usuwania ostatnio narysowanego obiektu.

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