Я пытаюсь построить небольшую программу на Java OOP, которая будет отображать овал, который меняет свою позицию на координаты щелчка мышью. Однако, поскольку я новичок, я не знаю, как это закончить.

Кто-нибудь знает, что не так в моей программе?

public class OvalWindow {

 JFrame window;
 int windowWidth = 500;
 int windowHeight = 500;

 OvalPanel panel;

   public void run() {
      //Set a window
      window = new JFrame("Oval moving");
      window.setVisible(true);
      window.setSize(windowWidth, windowHeight);
      window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    

      //Create a panel and add it to the window
      panel = new OvalPanel();
      window.setContentPane(panel);

      //Change the location on mouse input
      panel.addMouseListener(new OvalMouseClick(panel));


   }

  public static void main(String[] args) {
    OvalWindow oWndow = new OvalWindow();
    oWndow.run();
  }

}

Файл: Oval.java Создать овальный класс

 public class Oval {

        private int diameter;
        private int x;
        private int y;
        private Color color;

        public Oval(int x, int y, int diameter, Color color) {
            this.x = x;
            this.y = y;
            this.diameter = diameter;
            this.color = color;
        }

        public int getX() {
            return x;
        }
        public int getY() {
            return y;
        }
        public int getDiameter() {
            return diameter;
        }
        public Color getColor() {
            return color;
        }

        /*
         * Draw the oval 
         */
        public void draw(Graphics g) {
            g.fillOval(x, y, diameter, diameter);
            g.setColor(color);

        }
}

Файл: OvalPanel.java Этот класс добавляет объекты овалы на экран. Также задается начальная позиция овала

    public class OvalPanel extends JPanel{
     Oval oval;

     public void addOval(Oval oval) {
     oval = new Oval(100, 100, 50, Color.BLACK);
     this.repaint();

    }
    public void paintComponent(Graphics g){
        oval.draw(g);
    }


  }

Файл: OvalMouseClick.java Этот класс добавляет новый овал на экран, в той же позиции, что и координаты, на которые щелкает мышь.

    public class OvalMouseClick extends MouseAdapter{
        OvalPanel panel;

        public OvalMouseClick(OvalPanel panel) {
            this.panel = panel;
        }


        @Override
        public void mouseClicked(MouseEvent e) {
            panel.addOval(new Oval(e.getX(), e.getY(), 50, Color.BLUE));

        }

    }
1
Cristea 20 Авг 2018 в 19:34

3 ответа

Лучший ответ

В случае, если кто-то ищет ответ. Вот мое решение:

Я изменил файл: OvalWindow.java

        public class OvalWindow {

            JFrame window;
            OvalPanel panel;

            int windowWidth = 500;
            int windowHeight = 500;

            /**
             * Run the program
             */
            public void run() {
                // Set a window
                window = new JFrame("Oval moving");
                window.setVisible(true);
                window.setSize(windowWidth, windowHeight);
                window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                // Create a panel and add it to the window
                panel = new OvalPanel();
                window.add(panel, BorderLayout.CENTER);

                panel.addMouseListener(new MouseAdapter() {
                    public void mouseClicked(MouseEvent e) {
                        panel.moveToCoord(e);
                    }
                });

            }

            public static void main(String[] args) {
                OvalWindow oWndow = new OvalWindow();
                oWndow.run();
            }

        }

Я также значительно изменил файл: OvalPanel.java

        public class OvalPanel extends JPanel {
            Oval oval;
            int x = 50;
            int y = 10;
            int diameter = 50;
            Color color = Color.BLUE;

            public void moveToCoord(MouseEvent e) {
                x = e.getX() - diameter / 2;
                y = e.getY() - diameter / 2;
                repaint();

            }

            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                oval = new Oval(x, y, diameter, color);
                oval.draw(g);

            }

        }

На файл: Oval.java было только небольшое изменение:

 public void draw(Graphics g) {
    g.setColor(color);
    g.fillOval(x, y, diameter, diameter);

}

Файл: OvalMouseClick.java был удален.

0
Cristea 21 Авг 2018 в 16:15

Напишите собственный метод paintComponent(), чтобы ваш OvalPanel действительно что-то отображал. Если вы добавите к нему компоненты, они будут отображаться автоматически, но ваш Oval класс не является компонентом (в смысле пользовательского интерфейса), поэтому вам необходимо явно написать код для их отображения.

@Override
public void paintComponent(Graphics g) {
    for(Oval o : ovals)
        o.draw(g);
}

Я также рекомендую прочитать след Swing по адресу https://docs.oracle.com/javase/tutorial / uiswing / потому что вы не можете просто "угадать", как все работает. Качели сложны, и вам нужно понять, что они делают. Тогда вы поймете, что draw(Graphics g) и paintComponent(Graphics g) - это больше, чем похожие методы с другим именем.

0
Kayaman 20 Авг 2018 в 17:56

Просто позвольте классу «OvalMouseClick» реализовать интерфейс MouseListener. Если вы хотите что-то сделать, когда мышь двигается, просто позвольте классу также реализовать интерфейс «MouseMotionListener». Для MouseWheel вы можете использовать интерфейс «MouseWheelListener».

-1
Dominik 20 Авг 2018 в 17:24
51935078