tutorial pasos para interfaz grafica español ejemplos crear componente java image swing graphics event-handling

java - pasos - swing containers



¿Cómo mantener y eliminar múltiples objetos gráficos en aplicaciones java swing? (1)

No utilice getGraphics , esta no es la forma en que funciona la pintura personalizada, vea Pintura en AWT y Swing y Realización de Pintura Personalizada para más detalles.

La idea básica es que necesitas algún tipo de List , en la que agregas cada forma. Cuando ocurre el mouseClicked , usted itera a través de la lista y verifica si el mouse hizo clic en una de las formas, si lo hizo, quita la forma de la List , si no, crea una nueva forma en el punto donde se hizo clic y agrégalo a la List .

A continuación, usa esta List dentro del método paintComponent para pintar físicamente las formas.

Este ejemplo amplía su ImagePanel añadiendo en la pintura personalizada

import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Shape; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.Ellipse2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class Test { public static void main(String[] args) { new Test(); } public Test() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new DrawPane("/Volumes/Disk02/Dropbox/MegaTokyo/thumnails/0.jpg")); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class ImagePanel extends JPanel { private Image img; public ImagePanel(String img, String str) { //this(new ImageIcon(img).getImage()); } public ImagePanel(String path) { Image img = new ImageIcon(path).getImage(); this.img = img; try { BufferedImage image = ImageIO.read(new File(path)); int rgb = image.getRGB(66, 52); System.out.println("Colour is: " + rgb); } catch (IOException e) { e.printStackTrace(); } } @Override public Dimension getPreferredSize() { return img == null ? new Dimension(200, 200) : new Dimension(img.getWidth(this), img.getHeight(this)); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(img, 0, 0, null); } } public class DrawPane extends ImagePanel { private List<Shape> shapes; public DrawPane(String img, String str) { super(img, str); init(); } public DrawPane(String path) { super(path); init(); } protected void init() { shapes = new ArrayList<>(25); addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { boolean clicked = false; Iterator<Shape> it = shapes.iterator(); while (it.hasNext()) { Shape shape = it.next(); if (shape.contains(e.getPoint())) { it.remove(); clicked = true; break; } } if (!clicked) { shapes.add(new Ellipse2D.Double(e.getX() - 10, e.getY() - 10, 20, 20)); } repaint(); } }); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); g2d.setColor(Color.RED); for (Shape shape : shapes) { g2d.draw(shape); } g2d.dispose(); } } }

Tengo una imagen y uso posiciones predefinidas para crear objetos gráficos con colores. Con un clic del mouse trato de crear algunos óvalos con colores. En realidad, no podría lograr este objetivo. Porque, cuando hago clic en una posición predefinida, puedo crear un óvalo sobre ella, pero cuando hago clic en otra posición predefinida, el primer óvalo se ha ido.

Un óvalo puede eliminarse haciendo clic dos veces.

Mira esto,

public class PrintDialog extends javax.swing.JDialog{ private int count = 0; private int count_1 = 0; /** * Creates new form PrintFeetDialog */ public PrintDialog(java.awt.Frame parent, boolean modal) { super(parent, modal); initComponents(); ImagePanel panel = new ImagePanel("Areas.jpg"); this.getContentPane().add(panel); this.setResizable(false); this.setLocationRelativeTo(panel); this.pack(); } private void formMouseClicked(java.awt.event.MouseEvent evt) { // TODO add your handling code here: System.out.println("Print y - " + evt.getY()); System.out.println("Print x - " + evt.getX()); if ((evt.getX() >= 68 && evt.getX() <= 84) && (evt.getY() >= 44 && evt.getY() <= 72)) { Graphics g = getGraphics(); count++; if (count == 1) { g.setColor(Color.red); g.fillOval(66, 52, 20, 20); // repaint(); } else if (count > 1) { g.setColor(new Color(-3692899)); g.fillOval(66, 52, 20, 20); repaint(); count = 0; } g.dispose(); } if ((evt.getX() >= 137 && evt.getX() <= 157) && (evt.getY() >= 50 && evt.getY() <= 75)) { Graphics g1 = getGraphics(); count_1++; if (count_1 == 1) { g1.setColor(Color.RED); g1.fillOval(137, 54, 20, 20); } else if (count_1 > 1) { g1.setColor(new Color(-3692899)); g1.fillOval(66, 52, 20, 20); repaint(); count_1 = 0; } g1.dispose(); } } }

clase de panel de imagen

public class ImagePanel extends JPanel{ private Image img; public ImagePanel(String img, String str) { //this(new ImageIcon(img).getImage()); } public ImagePanel(String path) { Image img = new ImageIcon(path).getImage(); this.img = img; Dimension size = new Dimension(img.getWidth(null), img.getHeight(null)); setPreferredSize(size); setMinimumSize(size); setMaximumSize(size); setSize(size); setLayout(null); try { BufferedImage image = ImageIO.read(new File(path)); int rgb = image.getRGB(66, 52); System.out.println("Colour is: "+rgb); } catch(IOException e) { e.printStackTrace(); } } public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(img, 0, 0, null); } }

¿Tienes alguna idea, por favor?

Gracias .