¿Por qué no puedo dibujar una elipse con este código?

package test;

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class test_bmp extends JPanel implements MouseListener,MouseMotionListener,ActionListener
{
 static BufferedImage image;
 Color color;
 Point start=new Point();
 Point end =new Point();
 JButton elipse=new JButton("Elipse");
 JButton rectangle=new JButton("Rectangle");
 JButton line=new JButton("Line");
 String selected;
 public test_bmp()
    {
  color = Color.black; 
  setBorder(BorderFactory.createLineBorder(Color.black));   
  addMouseListener(this);
  addMouseMotionListener(this);
    }
 public void paintComponent(Graphics g) 
 {
  //super.paintComponent(g);
  g.drawImage(image, 0, 0, this);
  Graphics2D g2 = (Graphics2D)g;
  g2.setPaint(Color.black);
  if(selected=="elipse")
        {
         g2.drawOval(start.x, start.y, (end.x-start.x),(end.y-start.y));
         System.out.println("Start : "+start.x+","+start.y);
         System.out.println("End   : "+end.x+","+end.y);
        }
        if(selected=="line")
         g2.drawLine(start.x,start.y,end.x,end.y);
 }
 //Draw on Buffered image
 public void draw()
    {
        Graphics2D g2 = image.createGraphics();
        g2.setPaint(color);
      System.out.println("draw");
        if(selected=="line")
         g2.drawLine(start.x, start.y, end.x, end.y);
        if(selected=="elipse")
        {
         g2.drawOval(start.x, start.y, (end.x-start.x),(end.y-start.y));
            System.out.println("Start : "+start.x+","+start.y);
         System.out.println("End   : "+end.x+","+end.y);
        }
        repaint();
        g2.dispose();
        }  
 public JPanel addButtons()
 {
  JPanel buttonpanel=new JPanel();
  buttonpanel.setBackground(color.lightGray);
  buttonpanel.setLayout(new BoxLayout(buttonpanel,BoxLayout.Y_AXIS));
  elipse.addActionListener(this);
  rectangle.addActionListener(this);
  line.addActionListener(this);
  buttonpanel.add(elipse);
  buttonpanel.add(Box.createRigidArea(new Dimension(15,15)));
  buttonpanel.add(rectangle);
  buttonpanel.add(Box.createRigidArea(new Dimension(15,15)));
  buttonpanel.add(line);
  return buttonpanel;
 }
 public static void main(String args[]) 
 {
   test_bmp application=new test_bmp();
   //Main window
   JFrame frame=new JFrame("Whiteboard");   
   frame.setLayout(new BorderLayout());
   frame.add(application.addButtons(),BorderLayout.WEST);
   frame.add(application);
   //size of the window
   frame.setSize(600,400);
   frame.setLocation(0,0);
   frame.setVisible(true);
   int w = frame.getWidth();
      int h = frame.getHeight();
      image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
      Graphics2D g2 = image.createGraphics();
      g2.setPaint(Color.white);
      g2.fillRect(0,0,w,h);
      g2.dispose();
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
 @Override
 public void mouseClicked(MouseEvent arg0) {
  // TODO Auto-generated method stub
 }
 @Override
 public void mouseEntered(MouseEvent arg0) {
  // TODO Auto-generated method stub
 }
 @Override
 public void mouseExited(MouseEvent arg0) {
  // TODO Auto-generated method stub
 }
 @Override
 public void mousePressed(MouseEvent event) 
 {
  start = event.getPoint();
 }
 @Override
 public void mouseReleased(MouseEvent event) 
 {
  end = event.getPoint();
  draw();
 }
 @Override
 public void mouseDragged(MouseEvent e) 
 {
  end=e.getPoint();
  repaint();
 }
 @Override
 public void mouseMoved(MouseEvent arg0) {
  // TODO Auto-generated method stub

 }
 @Override
 public void actionPerformed(ActionEvent e) 
 {
  if(e.getSource()==elipse)
   selected="elipse";
  if(e.getSource()==line)
   selected="line";
  draw();

 }
}

Necesito crear una aplicación de pintura. Cuando dibujo una elipse arrastrando el mouse de izquierda a derecha, no muestra nada. ¿Por qué? ¿Debería usar alguna otra función aquí?

preguntado el 25 de marzo de 10 a las 06:03

1 Respuestas

Su programa dibuje una elipse cuando arrastre el mouse hacia abajo y hacia la derecha. Es arrastrar hacia arriba y / o hacia la izquierda que no funciona, porque Graphics.drawOval no funciona con un ancho o alto negativo.

Intente agregar un método como este:

private Shape createEllipse() {
    Ellipse2D e = new Ellipse2D.Double();
    e.setFrameFromDiagonal(start, end);
    return e;
}

Entonces llámalo desde draw y paintComponent Me gusta esto:

if(selected=="elipse") {
    g2.draw(createEllipse());
}

Además, probablemente no necesite la llamada para draw() al final de actionPerformed. Si cambia entre el modo de línea y elipse, dibujará una elipse con las mismas coordenadas que la línea más reciente o viceversa.

Y un problema de estilo de codificación: el uso de cadenas literales para selected es confuso (aunque funciona). En su lugar, definiría una enumeración.

respondido 25 mar '10, 14:03

Gracias, funciona bien, pero no puedo entender la lógica aquí. alguna explicación? - rápido

El propósito de ese método es construir un rectángulo con start en una esquina (puede ser cualquiera de las 4 esquinas) y end en la esquina opuesta, y use ese rectángulo como el cuadro delimitador de la elipse. Lo cambié para usar setFrameFromDiagonal. Espero que ahora esté más claro. - finlandés

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.