Добавление слушателя мыши с помощью JPanel к JFrame, содержащему карту Земли (Java) - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь добавить слушателя мыши JPanel в мой JFrame. Когда я добавляю слушателя, карта исчезает, но она работает правильно (показывает карту Земли), когда я удаляю код для слушателя. Цель слушателя - напечатать координаты, добавить координаты на карту и вычислить расстояние между двумя точками. Координаты снабжены текстовым файлом, в котором содержится почти 2 миллиона координат. Это не показывает никаких ошибок. У меня есть другой класс для рисования карты и вычисления расстояния, и они работают правильно. Без кода слушателя мыши для рисования карта работает правильно, а со слушателем мыши карта исчезает, но слушатель работает так, как должно быть. Заранее всем спасибо за помощь.

Это код в основном классе:

public static void main(String[] args) throws FileNotFoundException {
        Map<Integer, Integer> mapC = new TreeMap<>();

        JFrame frame = new JFrame("Earth Map");
        JPanel panel = new JPanel();

        panel.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e){
                if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 1) {
                    int lon = e.getX();
                    int lat = e.getY();

                    if(mapC.get(lon) == null){
                        mapC.put(lon, lat);
                    }
                    for (Map.Entry<Integer, Integer> entry : mapC.entrySet()) {
                        System.out.println("Coordinate clicked: " + entry.getKey() + "," + entry.getValue().toString());
                    }
                    if(mapC.size() > 1 && mapC.size() == 2){
                        MapCoordinate obj = new MapCoordinate();
                        int count = 0;
                        int lon1 = 0, lon2 = 0, lat1 = 0, lat2 = 0;
                        for (Map.Entry<Integer, Integer> entry : mapC.entrySet()) {
                            if(count == 0){
                                lon1 = entry.getKey();
                                lat1 = entry.getValue();
                                count++;
                            }else if(count == 1){
                                lon2 = entry.getKey();
                                lat2 = entry.getValue();
                            }
                        }
                        obj.distance(lat1, lat2, lon1, lon2);
                    }else{
                        System.out.println("Click to another coordinate or click right to delete last clicked coordinate");
                    }
                }else if(SwingUtilities.isRightMouseButton(e) && e.getClickCount() == 1){
                    if(mapC.size() >= 1){
                        int lastK = (int) mapC.keySet().toArray()[mapC.size() - 1];
                        int lastV = (int) mapC.values().toArray()[mapC.size() - 1];
                        System.out.println("You deleted last clicked coordinate: " + lastK + "," + lastV);
                        mapC.remove(lastK);
                    }else{
                        System.out.println("Perform a left click to add some coordinates, there is no coordinates to delete.");
                    }
                }
            }
        });

        frame.getContentPane().setPreferredSize(new Dimension(600, 600));
        DrawEarth draw = new DrawEarth("src//assignment//earth.txt");
        frame.add(draw);
        frame.add(panel);
        frame.pack();

        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int height = screenSize.height;
        int width = screenSize.width;
        frame.setSize(width / 2, height / 2);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

Это код, расширяющий JComponent (DrawEarth - конструктор):

 protected Earth e;
    public Map<Integer, Integer> mapC = new TreeMap<>();

    public DrawEarth(String filename) throws FileNotFoundException {
        e = new Earth();
        e.readDataArray("src//assignment//earth.txt");
    }

    @Override
    public void paintComponent(Graphics g) {
        Graphics2D dr = (Graphics2D) g;

        for (int i = 0; i < e.arrayOfEarth.length; i++) {

            double longitude = e.arrayOfEarth[i][0];
            double latitude = e.arrayOfEarth[i][1];
            double altitude = e.arrayOfEarth[i][2];

            if (altitude <= -4000) {
                dr.setColor(new Color(32, 3, 252));
            } else if (altitude > -4000 && altitude < -3000) {
                dr.setColor(new Color(3, 40, 252));
            } else if (altitude > -3000 && altitude < -2000) {
                dr.setColor(new Color(3, 80, 252));
            } else if (altitude > -2000 && altitude < -1000) {
                dr.setColor(new Color(3, 150, 252));
            } else if (altitude > -1000 && altitude < 0) {
                dr.setColor(new Color(3, 200, 252));
            } else if (altitude > 0 && altitude < 200) {
                dr.setColor(new Color(2, 230, 48));
            } else if (altitude > 200 && altitude < 300) {
                dr.setColor(new Color(0, 130, 30));
            } else if (altitude > 300 && altitude < 2000) {
                dr.setColor(new Color(194, 147, 60));
            } else if (altitude > 2000 && altitude < 3000) {
                dr.setColor(new Color(101, 67, 33));
            } else if (altitude > 3000 && altitude < 4000) {
                dr.setColor(new Color(255, 255, 255));
            } else if (altitude > 4000) {
                dr.setColor(new Color(180, 177, 167));
            }

            dr.fillRect((int) longitude + 50, ((int) latitude * -1) + 100, 1, 1);

            int seaLevel = (int) e.shiftLevel;
            String label = "The Earth after sea levels rose by " + seaLevel + " metres";

            if (seaLevel != 0) {
                dr.drawString(label, 110, 220);
            }

        }
    }

Я не предоставил код для расчета расстояния между координатами, так как он работает правильно.

...