无法使用 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。)。
所以在下面我们有我的代码,它应该使用经度和纬度在地图上绘制出你去过的地方。启动时,它会尝试通过遍历每个值的循环来查找最大值和最小值 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。)。