Рисовать, перемещать фигуры в Java Swing

#java #swing #user-interface #move #shapes

#java #качать #пользовательский интерфейс #переместить #фигуры

Вопрос:

Я делаю проект, касающийся перемещения фигур, нарисованных в a JPanel , но если я реализую a mouselistener в своем классе, как я могу это сделать, если у меня нарисовано несколько фигур? В моем примере я нарисовал два прямоугольника. Это мой код:

 import javax.swing.BoxLayout;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JPanel;

public class NewClass1 extends JFrame{
        JPanel panel2;
        
    public NewClass1(){
        JPanel container = new JPanel();
        container.setLayout(new BoxLayout(container, BoxLayout.X_AXIS));
         panel2 = new jPanel2();

        container.add(panel2);
        
        add(container);
        setSize(300, 300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        new NewClass1();
    }
    
    class jPanel2 extends JPanel {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawRect(0, 0, 20, 20);
        g.drawRect(21, 21, 20, 20);
    }}
}
  

Комментарии:

1. Сохраняйте свои фигуры в List каком-то виде, затем вы выполняете базовое обнаружение попадания

Ответ №1:

java.awt.Rectangle Класс доступен для хранения логических прямоугольников.

Я переработал ваш код и внес следующие изменения.

  1. Я запустил приложение Swing с помощью вызова SwingUtilities invokeLater метода. Этот метод гарантирует, что компоненты Swing создаются и выполняются в потоке отправки событий.

  2. Я создал и добавил два прямоугольника в List оф Rectangles .

  3. JFrame Методы должны вызываться в определенном порядке. Это порядок, который я использую для большинства своих приложений Swing.

  4. Я дал чертежу JPanel предпочтительный размер, а не JFrame . Вы хотите знать, насколько велика ваша область рисования. Размер JFrame не имеет отношения к рисованию.

     import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Rectangle;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class ShapesExample extends JFrame {
    
        private static final long serialVersionUID = 1L;
    
        private List<Rectangle> rectangles;
    
        public ShapesExample() {
            rectangles = new ArrayList<>();
            rectangles.add(new Rectangle(10, 10, 20, 20));
            rectangles.add(new Rectangle(41, 41, 20, 20));
            
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setTitle("Shapes Example");
    
            add(new DrawingPanel());
            
            pack();
            setLocationByPlatform(true);
            setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new ShapesExample();
                }
            });
        }
    
        class DrawingPanel extends JPanel {
    
            private static final long serialVersionUID = 1L;
            
            public DrawingPanel() {
                this.setPreferredSize(new Dimension(300, 300));
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
    
                g.setColor(Color.RED);
                for (Rectangle rectangle : rectangles) {
                    g.drawRect(rectangle.x, rectangle.y, 
                            rectangle.width, rectangle.height);
                }
            }
        }
    }