繁体   English   中英

如何在不删除Java AWT中其他椭圆形的情况下删除椭圆形?

[英]How to remove an oval without removing other ovals in java AWT?

我正在解决有关AWT的Java问题。 当您单击鼠标右键时。 它将创建一个椭圆形。 如果单击左按钮,它将删除您单击的椭圆。 我已经实现了椭圆的创建,但是找不到任何有关在AWT中删除形状的内置函数。 我的代码如下:

package chapter16;

import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Points extends JFrame{
    public Points(){
        add(new NewPanel4());
    }
    public static void main(String[] args){
        Points frame = new Points();
    frame.setSize(200, 200);
    frame.setTitle("Add and Remove Points");
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}
class NewPanel4 extends JPanel{
    private boolean Add = false;//add points
    private int x,y;//the x,y coordinate
    public NewPanel4(){
        addMouseListener(new MouseAdapter(){
            public void mouseClicked(MouseEvent e){
                if(e.getButton()== MouseEvent.BUTTON3){
                    Add = true;
                    x = e.getX();
                    y = e.getY();
                    repaint();
                }
                else if(e.getButton() == MouseEvent.BUTTON1){
                    Add = false;
                }
            }
        });


    }

    protected void paintComponent(Graphics g){
        //super.paintComponent(g);
        //Add oval if Add is true
        if (Add == true){
            g.fillOval(x, y, 10, 10);
        }
        //remove oval if Add is false
        else if(Add == false){
            //code to remove ovals
        }
    }
}
}

我已经重构了您的代码,以使用集合来存储椭圆。 希望对您有帮助。 这和安德鲁建议的一样。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Points extends JFrame {

    public Points() {
        add(new NewPanel4());
    }

    public static void main(String[] args) {
        Points frame = new Points();
        frame.setSize(200, 200);
        frame.setTitle("Add and Remove Points");
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    class NewPanel4 extends JPanel {

        private List<Point> points = new ArrayList<>();

        public NewPanel4() {
            addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    if (e.getButton() == MouseEvent.BUTTON3) {
                        Point center = new Point(e.getX(), e.getY());
                        points.add(center);
                        repaint();
                    } else if (e.getButton() == MouseEvent.BUTTON1) {
                        removeOval(new Point(e.getX(), e.getY()));
                        repaint();
                    }
                }
            });
        }

        private void removeOval(Point selectedPoint) {
            for (Iterator<Point> iterator = points.iterator(); iterator.hasNext();) {
                Point center = iterator.next();
                if (isInsideOval(selectedPoint, center)) {
                    iterator.remove();
                    break;
                }
            }
        }

        private boolean isInsideOval(Point point, Point center) {
            int r = 5;
            int dx = point.x - center.x;
            int dy = point.y - center.y;
            return (dx * dx + dy * dy <= r * r);
        }

        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2D = (Graphics2D) g;
            g2D.setRenderingHint(
                    RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            super.paintComponent(g);
            g2D.setColor(Color.BLUE);
            for (Point point : points) {
                g2D.fillOval(point.x- (10 / 2) , point.y- (10 / 2), 10, 10);
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM