Не удается заставить JPanel отображаться в JFrame с помощью super.paintComponent(g). Пустой JFrame в Java

#java #swing #jframe #jpanel #paintcomponent

#java #swing #jframe #jpanel #paintcomponent

Вопрос:

Итак, внизу у нас есть мой код, который должен отображать место, где вы были, на карте, используя долготу и широту. При запуске он пытается найти максимальную и минимальную длину / ширину с циклом, который проходит через каждое значение. После этого он инициализирует массивы, а затем выполняет цикл по всем точкам отслеживания, сохраненным в списке. Наконец, предполагается, что он рисует строку, но когда коды выполняются с помощью main, JFrame пуст. Я пробовал несколько вещей, но все еще пустой фрейм. Я все еще новичок в этом, так что прошу прощения за причиненные неудобства.

 
import java.awt.Color;
import java.awt.Graphics;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;

import csv.CSVReader;
import csv.TrackPoint;
import gui.Login;

public class Position extends JPanel {
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    CSVReader activity = new CSVReader();
    
    private List<TrackPoint> trackPoints;
    
    double minLat;
    double minLon;
    double maxLat;
    double maxLon;
    
    public void paintComponent(Graphics g) {
        this.trackPoints = activity.getTrackpointList();
        
        super.paintComponent(g);
        findMaxMinLongLat();
        // Initialize arrays
        int[] xArray = new int[activity.trackPoints.size()];
        int[] yArray = new int[activity.trackPoints.size()];
        // Loop through all TrackPoints stored in the list

        int i = 0;
        for (TrackPoint tp : trackPoints) {
            xArray[i] = getXPixValue(tp);
            yArray[i] = getYPixValue(tp);
            i  ;
        }
        g.setColor(Color.BLUE);
        g.drawPolyline(xArray, yArray, xArray.length);
        
    }

    private void findMaxMinLongLat() {
        // just to start with some value:
        minLat = activity.trackPoints.get(0).getLatitude();
        minLon = activity.trackPoints.get(0).getLongitude();
        maxLat = activity.trackPoints.get(0).getLatitude();
        maxLat = activity.trackPoints.get(0).getLongitude();
        // Finds min and max:
        for (TrackPoint tp : trackPoints) {
            double lon = tp.getLongitude();
            double lat = tp.getLatitude();
            if (lon > maxLon)
                maxLon = lon;
            else if (lon < minLon)
                minLon = lon;
            if (lat > maxLat)
                maxLat = lat;
            else if (lat < minLat)
                minLat = lat;
        }
    }

    private int getXPixValue(TrackPoint tp) {
        int xPix = (int) (((tp.getLongitude() - minLon) / (maxLon - minLon)) * getWidth());
        return xPix;
    }

    private int getYPixValue(TrackPoint tp) {
        int yPix = (int) (((tp.getLatitude() - minLat) / (maxLat - minLat)) * getHeight());
        yPix = getHeight() - yPix; // To adjust for y-axis going "downwards" in graphics
        return yPix;
    }
    
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        frame.setSize(300,200);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        panel.add(new Position());
        frame.add(panel);
        
        frame.setVisible(true);
    }
    
}
 

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

1. Какого размера должна быть панель позиционирования? Вероятно, вы можете свести это к компилируемому примеру и просто использовать некоторые поддельные данные для вашего массива.

Ответ №1:

Ваша панель позиционирования не имеет предпочтительного размера. Вы добавляете его в JPanel, который имеет макет FlowLayout по умолчанию, который не будет расширять содержимое.

Одно из исправлений: используйте макет, который будет заполнять содержимое.

 panel.setLayout( new BoxLayout(panel, BoxLayout.PAGE_AXIS) );
 

Другой способ — добавить его непосредственно в JFrame, в котором есть панель содержимого с BorderLayout (другой макет, который расширит ваш компонент, чтобы заполнить пространство.).