Куда я могу поместить код обработки событий мыши, чтобы он не мешал, но все еще мог манипулировать объектами? - PullRequest
3 голосов
/ 16 февраля 2012

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

Основной класс моего проекта расширяет JFrame и при построении добавляет к себе объект класса, который расширяет JPanel. Это JPanel охватывает все окно, и именно это я использую, чтобы рисовать вещи на экране. Затем у меня есть класс с именем Scene, который ничего не расширяет, но хранит все ссылки на текущие объекты на экране и отвечает за их компиляцию и передачу обратно в JPanel. Я не хотел помещать полный код события мыши в JPanel, потому что это было бы очень грязно, поэтому я решил создать еще один класс с именем MEs и позволить каждой сцене иметь один. Я думал, что таким образом каждый mes объект может легко получить доступ к объектам в каждой сцене. Итак, мой код выглядит так:

class DPanel extends JPanel {
    Scene scCurrent;

    public DPanel() {
        scCurrent = new Scene();
        addMouseMotionListener(new MouseAdapter() { 
            public void mouseMoved(MouseEvent me) { scCurrent.mes.moved(me); } 
        });
...
    }

...

но, конечно, inside scCurrent.mes.moved() Я даже не знаю, как изменить курсор. Он не распознает setCursor() там. Как я могу изменить курсор и получить доступ к объектам, которые находятся выше по дереву, как для переключения сцены? Или есть какое-то другое место, где я мог бы убрать свой код обработки событий мыши, который не будет расширять мою JPanel?

1 Ответ

4 голосов
/ 16 февраля 2012

Вы пытаетесь отделить управляющий код от кода представления (GUI), и это хорошая вещь .Решение состоит в том, чтобы предоставить открытые методы кода представления, которые позволяют внешнему коду изменять его состояние, и дать классам элементов управления ссылку на представление, чтобы элементы управления (т. Е. MouseListeners, MouseMotionListeners, ActionListeneres) могли вызывать эти методы по соответствующей ссылке.и измените состояния представления.

Редактировать 1
Может быть проще просто показать вам пример:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;

public class ViewControl {

   private static void createAndShowGui() {
      View view = new View();
      Control control = new Control(view);
      view.addMouseAdapter(control);

      JFrame frame = new JFrame("ViewControl");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(view);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

@SuppressWarnings("serial")
class View extends JPanel {
   private static final int PREF_W = 400;
   private static final int PREF_H = PREF_W;
   private List<Point> points = new ArrayList<Point>();

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (points.size() > 1) {
         for (int i = 0; i < points.size() - 1; i++) {
            int x1 = points.get(i).x;
            int y1 = points.get(i).y;
            int x2 = points.get(i + 1).x;
            int y2 = points.get(i + 1).y;

            g.drawLine(x1, y1, x2, y2);
         }
      }
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   public void addMouseAdapter(MouseAdapter adapter) {
      // addMouseListener(adapter);
      addMouseMotionListener(adapter);
   }

   public void addPoint(Point p) {
      points.add(p);
      repaint();
   }
}

class Control extends MouseAdapter {
   private View view;

   public Control(View view) {
      this.view = view;
   }

   @Override
   public void mouseDragged(MouseEvent e) {
      view.addPoint(e.getPoint());
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...