Java задача на использование Swing

199
15 апреля 2022, 09:10

Необходимо написать программу, в которой при нажатии мышки создаётся квадратик синего цвета, при двойном нажатии на синий квадратик цвет меняется на красный, и при двойном нажатии на красный квадратик удаляется. Только начал изучение Swing и пока плохо в этом разбираюсь. В данном коде не меняется цвет с синего на красный, и цвет квадратика выделяется по контуру, а нужно с заливкой.

    public static void main(String[] args)
    {
        EventQueue.invokeLater(() -> {
            JFrame frame = new MouseFrame();
            frame.setTitle("MouseTest");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        });
    }
}
class MouseFrame extends JFrame
{
    public MouseFrame()
    {
        add(new MouseComponent());
        pack();
    }
}
class MouseComponent extends JComponent
{
    private static final int DEFAULT_WIDTH = 900;
    private static final int DEFAULT_HEIGHT = 600;
    private static final int SIDELENGTH = 10;
    private ArrayList<Rectangle2D> squares;
    private Rectangle2D current; // the square containing the mouse cursor
    Graphics2D g2;
    public MouseComponent()
    {
        squares = new ArrayList<>();
        current = null;
        addMouseListener(new MouseHandler());
        addMouseMotionListener(new MouseMotionHandler());
    }
    public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }
    public void paintComponent(Graphics g)
    {
        g2 = (Graphics2D) g;
        // draw all squares
        for (Rectangle2D r : squares) {
            g2.setColor(Color.BLUE);
            g2.draw(r);
        }
    }
    /**
     * Finds the first square containing a point.
     * @param p a point
     * @return the first square that contains p
     */
    public Rectangle2D find(Point2D p)
    {
        for (Rectangle2D r : squares)
        {
            if (r.contains(p)) return r;
        }
        return null;
    }
    /**
     * Adds a square to the collection.
     * @param p the center of the square
     */
    public void add(Point2D p)
    {
        double x = p.getX();
        double y = p.getY();
        current = new Rectangle2D.Double(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH,
                SIDELENGTH);
        squares.add(current);
        repaint();
    }
    /**
     * Removes a square from the collection.
     * @param s the square to remove
     */
    public void remove(Rectangle2D s)
    {
        if (s == null) return;
        if (s == current) current = null;
        squares.remove(s);
        repaint();
    }
    private class MouseHandler extends MouseAdapter
    {
        public void mousePressed(MouseEvent event)
        {
            // add a new square if the cursor isn't inside a square
            current = find(event.getPoint());
            if (current == null) add(event.getPoint());
        }
        public void mouseClicked(MouseEvent event)
        {
            // remove the current square if double clicked
            current = find(event.getPoint());
            if (current != null && event.getClickCount() >= 2 ){
                remove(current);
            }
        }
    }
    private class MouseMotionHandler implements MouseMotionListener
    {
        public void mouseMoved(MouseEvent event)
        {
            // set the mouse cursor to cross hairs if it is inside
            // a rectangle
            if (find(event.getPoint()) == null) setCursor(Cursor.getDefaultCursor());
            else setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
        }
        public void mouseDragged(MouseEvent event)
        {
            if (current != null)
            {
                int x = event.getX();
                int y = event.getY();
                // drag the current rectangle to center it at (x, y)
                current.setFrame(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH, SIDELENGTH);
                repaint();
            }
        }
    }
}```
Answer 1

Заполненный прямоугольник - это метод fill(). А вот с определением цвета придется немного усложнить код. Поскольку Rectangle2D не содержит цвет в себе, его придется хранить в каком-нибудь собственном классе, как вариант, унаследоваться от Rectangle2D. Потом в MouseHandler-e добавить нужные условия... Как-то так

READ ALSO
Как исправить ошибку парсинга

Как исправить ошибку парсинга

написал код пытаюсь парсить firebase realtime NotificationFragmentjava

134
Не могу найти ошибку в формуле. Код Java, он на c# тоже работает(если переделать ввод и вывод)

Не могу найти ошибку в формуле. Код Java, он на c# тоже работает(если переделать ввод и вывод)

я делаю приложение, выводящее спираль(в целях образования)Но спираль выводится с редкими придатками, в местах отклоняющихся на на количество...

128
Превратить строку в n-массивов символов

Превратить строку в n-массивов символов

Как из содержимого массива String[] subStr;, где i = n создать n массивов, уже заполненные содержимым из nНапример i = 3, создать соответственно 3 новых...

94
Как защитить коммерческий Java продукт?

Как защитить коммерческий Java продукт?

Подскажите как можно защитить свой Java продукт от финансовых потерь? В основном беспокоят пиратство и плагиат исходного кодаЯ так понял всякие...

100