#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 (другой макет, который расширит ваш компонент, чтобы заполнить пространство.).