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

时间:2021-02-17 11:57:38

标签: java swing jframe jpanel paintcomponent

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

相关问题