gpt4 book ai didi

java - 如何在java swing应用程序中保留和删除多个图形对象?

转载 作者:行者123 更新时间:2023-11-30 03:04:54 24 4
gpt4 key购买 nike

我有一个图像,我使用其上的预定义位置来创建带有颜色的图形对象。单击鼠标,我尝试在其上用颜色创建一些椭圆形。事实上我没能达到这个目的。因为,当我单击预定义位置时,我可以在其上创建一个椭圆形,但是当我单击另一个预定义位置时,第一个椭圆形消失了。

点击两次椭圆形即可将其删除。

看看这个,

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();
}
}
}

图像面板类

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);
}
}

请问有什么想法吗?

谢谢。

最佳答案

不要使用getGraphics,这不是自定义绘画的工作原理,请参阅 Painting in AWT and SwingPerforming Custom Painting了解更多详情

基本思想是,您需要某种List,在其中添加每个形状。当 mouseClicked 发生时,您会遍历列表并检查鼠标单击是否出现其中一个形状,如果是,则从 List 中删除该形状,如果不是,您可以在单击时创建一个新形状并将其添加到列表中。

然后,您可以在 paintComponent 方法中使用此 List 来物理绘制形状。

此示例扩展了您的 ImagePanel 添加自定义绘画

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();
}

}

}

关于java - 如何在java swing应用程序中保留和删除多个图形对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35035174/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com