Merhaba arkadaşlar, Paint uygulaması yapmaya çalışıyorum ve şöyle bir problemle karşılaştım;çizim yaparken birden fazla şekil çizemiyorum 2 şekil çizdiğim de önceki şekil direkt siliniyor .Yani 2 şekil (kare, oval, dikdörtgen vs.) bir arada çizilmiyor.

Bildiğim kadarıyla bunu düzeltmenin 2 yöntemi var

  1. BufferedImage üzerine şekli çizip PaintComponent'te ekrana görüntülemek.
  2. Şekilleri ArrayList'e ekleyip listeyi döngü ile PaintComponent'te görüntülemek.

İkinci yöntemi uyguladığımda (fare sürüklemesi bırakılanakadar) iç içe şekiller yazdırılıyor. Bu yüzden BufferedImage yöntemini uygulamak istiyorum ama pek beceremedim.Bu konuda bana yardımcı olabilecek birisi var mı?

Ulaşabildiğim son durum(DrawingArea sınıfından) bir kod parçası :

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (image == null) {
        image = new BufferedImage((int) this.getWidth(), (int) this.getHeight(), BufferedImage.TYPE_INT_ARGB);
        g2 = (Graphics2D) image.getGraphics();
        g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        clear();
    }

    g2.drawImage(image, 0, 0, getWidth(), getHeight(), this);
    g2.dispose();

    g.setColor(initialColor);
    if (shape == Shapers.PENCIL) {
        g.setColor(currentColor);
        g.fillOval(draggedX, draggedY, thickness, thickness);

    } else if (shape == Shapers.OVAL) {
        g.setColor(currentColor);
        g.drawOval(oldX, oldY, draggedX, draggedX);

    } else if (shape == Shapers.FILLEDOVAL) {
        g.setColor(currentColor);
        g.fillOval(oldX, oldY, draggedX, draggedY);

    } else if (shape == Shapers.RECT) {
        g.setColor(currentColor);
        g.drawRect(x, y, width, height);

    } else if (shape == Shapers.FILLEDRECT) {
        g.setColor(currentColor);
        g.fillRect(x, y, width, height);

    } else if (shape == Shapers.LINE) {
        g.setColor(currentColor);
        g.drawLine(oldX, oldY, draggedX, draggedY);
        oldX = draggedX;
        oldY = draggedY;

    } else if (shape == Shapers.ERASER) {
        g.setColor(Color.WHITE);
        g.fillRect(draggedX, draggedY, thickness, thickness);

    } else if (shape == Shapers.TEXT) {
        if (clickedX == true || COUNT == 2) {
            String str = JOptionPane.showInputDialog("Write Your Text Here : ");
            g.setFont(myFont);
            g.setColor(currentColor);
            if (str != null) {
                g.drawString(str, oldX, oldY);
                COUNT = 0;

            } else {
                return;
            }
        }
    } else {
        COUNT = 0;
        return;
    }

}

}

Hertürlü cevap için teşekkür ederim.

Not : Formda yeni olduğum için kural ihlali yapmışsam kusura bakmayın.

soruldu: 23 Eyl, 13:53

Coder%20ACJHP's gravatar image

Coder ACJHP
20839
cevap kabul oranı: 13%

değiştirildi: 23 Eyl, 19:28


Soruma cevap alamadım ama 8 saatlik uğraştan sonra şu şekilde çözebildim :

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    if (image != null) {
        g2D = (Graphics2D) image.getGraphics();
        g2D.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.drawImage(image, 0, 0, AREA_WIDTH, AREA_HEIGHT, null);
    }

    BasicStroke basicStroke = new BasicStroke(thickness);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setStroke(basicStroke);
    g2d.setPaint(currentColor);

    if(g2d != null) {

        if (figures == EnumRope.RECT && rectangle != null) {

                g2d.draw(rectangle);

        }else if(figures == EnumRope.FILLEDRECT && rectangle != null){

                g2d.fill(rectangle);

        }else if (figures == EnumRope.OVAL && ellipse2d != null) {

                g2d.draw(ellipse2d);

        }else if (figures == EnumRope.FILLEDOVAL && ellipse2d != null){

                g2d.fill(ellipse2d);

        }else if (figures == EnumRope.LINE && line2d != null) {

                g2d.draw(line2d);

        }else if(figures == EnumRope.PENCIL && ErasRect != null){

                g2d.fill(ErasRect);

        }else if(figures == EnumRope.ERASER && ErasRect != null){

                g2d.fill(ErasRect);

        }

    }

}

public void clear()
{
    clearArea();
    repaint();
}

public void clearArea() {
    image = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
}
public void addRectangle(Rectangle rectangle, Color color, int tickness)
{
    //  Draw the Rectangle onto the BufferedImage
    BasicStroke basicStroke = new BasicStroke(tickness);
    Graphics2D g2d = (Graphics2D)image.getGraphics();
    g2d.setStroke(basicStroke);
    g2d.setColor( currentColor );
    if(figures==EnumRope.FILLEDRECT){
        g2d.fill( rectangle );
    }else {
        g2d.draw( rectangle );
    }
        repaint();
}
public void addEllipse(Ellipse2D.Float ellipse2D, Color color, int tickness)
{
    //  Draw the Oval(circle) onto the BufferedImage
    BasicStroke basicStroke = new BasicStroke(tickness);
    Graphics2D g2d = (Graphics2D)image.getGraphics();
    g2d.setStroke(basicStroke);
    g2d.setColor( currentColor );
    if(figures == EnumRope.FILLEDOVAL) {
        g2d.fill( ellipse2D );
    }else {
        g2d.draw( ellipse2D );
    }
        repaint();
}
public void addLine(Line2D.Float line2D, Color color, int tickness)
{
    //  Draw the Line onto the BufferedImage
    BasicStroke basicStroke = new BasicStroke(tickness);
    Graphics2D g2d = (Graphics2D)image.getGraphics();
    g2d.setStroke(basicStroke);
    g2d.setColor( currentColor );
    g2d.draw( line2D );
    repaint();
}
public void addEraser(Rectangle2D.Float erasRect, Color color, int tickness)
{
    BasicStroke basicStroke = new BasicStroke(tickness);
    Graphics2D g2d = (Graphics2D)image.getGraphics();
    g2d.setStroke(basicStroke);
    g2d.setColor(Color.WHITE);
    g2d.fill(erasRect);
    repaint();
}
public void addPencil(Rectangle2D.Float erasRect, Color color, int tickness)
{
    BasicStroke basicStroke = new BasicStroke(tickness);
    Graphics2D g2d = (Graphics2D)image.getGraphics();
    g2d.setStroke(basicStroke);
    g2d.setColor(currentColor);
    g2d.fill(erasRect);
    repaint();
}

class MyMouseListener extends MouseInputAdapter{

private Point startpoint;

@Override
public void mousePressed(MouseEvent e) 
{
    startpoint = e.getPoint();
    rectangle = new Rectangle();
    oldX = e.getX();
    oldY = e.getY();
    repaint();

if(figures == EnumRope.TEXT){

        text = JOptionPane.showInputDialog("Write Your Text Here : ");
        g2D.setFont(myFont);
        g2D.setColor(currentColor);
        g2D.drawString(text, oldX, oldY);
        repaint();

    }
}

@Override
public void mouseDragged(MouseEvent e) {
    currentX = e.getX();
    currentY = e.getY();
    int x = Math.min(startpoint.x, e.getX());
    int y = Math.min(startpoint.y, e.getY());
    int width = Math.abs(startpoint.x - e.getX());
    int height = Math.abs(startpoint.y - e.getY());

    rectangle.setBounds(x, y, width, height);
    repaint();
    ellipse2d = new Ellipse2D.Float(x, y, width, height);
    repaint();
    line2d = new Line2D.Float(oldX, oldY, currentX, currentY);
    repaint();
    ErasRect = new Rectangle2D.Float(currentX, currentY, thickness, thickness);
    repaint();

// WE NEED ADD THIS TWO SHAPE HERE BECAUSE SHAPE DARWING WITH MOUSEDRAG !

        if (figures == EnumRope.ERASER) {
            addEraser(ErasRect, Color.WHITE, thickness);
            ErasRect = null;
        }else if (figures == EnumRope.PENCIL) {
            addPencil(ErasRect, currentColor, thickness);
            ErasRect = null;
        }
}

@Override // GETTING RELEASED COORDINATE TO DRAW LINE.
public void mouseReleased(MouseEvent e) {

 if (figures == EnumRope.OVAL) {
        addEllipse(ellipse2d, currentColor, thickness);
        ellipse2d = null;
    } else if (figures == EnumRope.FILLEDOVAL) {
        addEllipse(ellipse2d, currentColor, thickness);
        ellipse2d = null;
    } else if (figures == EnumRope.RECT) {
        addRectangle(rectangle, currentColor, thickness);
        rectangle = null;
    } else if (figures == EnumRope.FILLEDRECT) {
        addRectangle(rectangle, currentColor, thickness);
        rectangle = null;
    } else if (figures == EnumRope.LINE) {
        addLine(line2d, currentColor, thickness);
        line2d = null;
    }

    }
}

Eminim ki bu sorunla karşılaşan ne ilk ne de son kişi ben değilim, umarım bu kod örneği başkalarınada yarar. Herkse teşekkürler.

permanent link

cevaplandı: 25 Eyl, 20:09

Coder%20ACJHP's gravatar image

Coder ACJHP
20839
cevap kabul oranı: 13%

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×15
×1
×1

Soruldu: 23 Eyl, 13:53

Görüntüleme: 101 kez

Son güncelleme: 25 Eyl, 20:09

powered by BitNami OSQA