¿Por qué no puedo dibujar una elipse con este código?
Frecuentes
Visto 2,891 equipos
4
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í?
1 Respuestas
8
Su programa sí 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
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas java swing paint or haz tu propia pregunta.
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) yend
en la esquina opuesta, y use ese rectángulo como el cuadro delimitador de la elipse. Lo cambié para usarsetFrameFromDiagonal
. Espero que ahora esté más claro. - finlandés