无法使用 super.paintComponent(g) 使 JPanel 在 JFrame 中显示。 Java 中的空 JFrame

Can't manage to make JPanel show in the JFrame using super.paintComponent(g). Empty JFrame in Java

所以在下面我们有我的代码,它应该使用经度和纬度在地图上绘制出你去过的地方。启动时,它会尝试通过遍历每个值的循环来查找最大值和最小值 long/lati。 之后它初始化数组,然后循环遍历存储在列表中的所有 TrackPoints。 最后它应该画一条线但是当代码用 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);
    }
    
}

您的位置面板没有首选尺寸。您要将其添加到默认布局为 FlowLayout 的 JPanel,这不会展开内容。

一个修复,使用将填充内容的布局。

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

另一种方法是直接将其添加到 JFrame 中,该 JFrame 具有带 BorderLayout 的内容窗格(另一种布局将扩展您的组件以填充 space。)。