2009-04-22 25 views
24

Estoy tratando de hacer un editor de pintura con Java en el que tengo una barra de herramientas con los objetos que me gustaría pegar en el lienzo. Estoy usando componentes Swing para hacer la GUI, pero cuando busqué la manera de hacer el lienzo, solo encontré el lienzo de clase de AWT.¿Cómo hacer un lienzo con Swing?

¿Hay alguna manera de hacer algo similar a un lienzo con Swing? (por ejemplo, JPanel?) He leído que usar el lienzo de clase de AWT con una GUI hecha con swing no funcionará correctamente, ¿es cierto?

Respuesta

14

Probablemente querrá hacer una subclase de JPanel e implementar su propia forma de pintar los componentes que desea dibujar en el panel.

El enfoque básico probablemente estará en la línea de asignar un MouseListener a la subclase de JPanel, luego implementar la funcionalidad de pintura.

La idea básica puede ser algo a lo largo de la línea:

class MyCanvas extends JPanel implements MouseListener 
{ 
    Image img;  // Contains the image to draw on MyCanvas 

    public MyCanvas() 
    { 
     // Initialize img here. 
     this.addMouseListener(this); 
    } 

    public void paintComponent(Graphics g) 
    { 
     // Draws the image to the canvas 
     g.drawImage(img, 0, 0, null); 
    } 

    public void mouseClicked(MouseEvent e) 
    { 
     int x = e.getX(); 
     int y = e.getY(); 

     Graphics g = img.getGraphics(); 
     g.fillOval(x, y, 3, 3); 
     g.dispose(); 
    } 

    // ... other MouseListener methods ... // 
} 

El ejemplo anterior es incompleta (y no probado - que sin duda no se compilará), pero da una idea acerca de cómo poner en práctica una clase MyCanvas en la que un usuario puede hacer clic y dibujar círculos.

El objeto img se utiliza para contener la imagen del lienzo. El método paintComponent se usa para pintar el objeto img en el lienzo. En el método mouseClicked, se recupera el objeto Graphics asociado con img con el fin de fillOval en la imagen.

Como uno de los requisitos es pegar imágenes en el lienzo, puede ser una buena idea guardar algunas Image que desea pegar en el lienzo. Tal vez algo en la línea de:

Image[] myImages; // Used to store images to paint to screen. 

A continuación, en la rutina de pintar la imagen en img almacenada en MyCanvas:

g.drawImage(myImage[INDEX_OF_DESIRED_IMAGE], 0, 0, null); 

Al utilizar el método del objeto GraphicsdrawImage, otros Image s puede dibujarse en Image s.


En cuanto a la pregunta sobre AWT y Swing, sí, es cierto que usted no quiere mezclar los componentes del AWT y Swing, ya que difieren en la forma en que hacen que los componentes GUI. AWT se basa en componentes pesados, lo que significa que son ventanas nativas para pintar la GUI, mientras que Swing se basa en componentes ligeros, lo que significa que la GUI es dibujada por Java sin usar componentes nativos.

Una buena guía sobre la diferencia de AWT y Swing se proporciona en el artículo Painting in AWT and Swing de Sun.

+0

URL han cambiado desde 2009. Encontrado ubicación real del artículo en http://www.oracle.com/technetwork/java/painting-140037.html – Javier

43

Para hacer un 'Lienzo' personalizado en el swing usualmente se escribe una subclase de JPanel. Luego, debe sobrescribir el método protected paintComponent(Graphics g) de JPanel.

En el método de pintura, puede llamar a métodos en el objeto Graphics para dibujar realmente en JPanel.

Como siempre, los Tutoriales de Java tienen un great reference sobre esto para que comience.

+0

muy útil! No sabía que un JPanel podría ser tan multiverso. :-) –

12

Simplemente subclase JComponent.

JPanel es una clase inapropiada. A menudo se sugiere ya que parece tener setOpaque(true) invocado automáticamente. En realidad, es el PL & F el que hace eso, y si realmente sucede o no depende de la implementación y del proveedor.

Canvas es un componente de peso pesado. Es decir que está controlado por el sistema de ventanas subyacente. El resultado es que normalmente se dibujará sobre la parte superior de los componentes de Swing, sin importar el orden Z o el recorte (colocarlo en un panel de desplazamiento dará un comportamiento extraño).

2

Es posible que desee mirar la API de Minueto. Es una aplicación de gráficos muy simple de usar, y puede combinar el evento de Java escuchando con ella para proporcionar su capacidad de dibujo.

http://minueto.cs.mcgill.ca/

Cuestiones relacionadas