MapMarkerCircle::paint
を呼び出します。これは、制御文字またはマークアップに特別な意味を与えないMapMarkerCircle::paintText
を呼び出します。この例Graphics::drawString
から始めて、以下の実装は最初の線の下に 2 番目の線を描画します。paintText()
例を更新して、マーカーの名前と値を関連付ける方法を提案しました。a を使用し、 a をパラメーターとしてコンストラクターMap<String, Integer>
に渡します。Map.Entry<String, Integer>
RateCircle

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Point;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JFrame;
import org.openstreetmap.gui.jmapviewer.Coordinate;
import org.openstreetmap.gui.jmapviewer.JMapViewer;
import org.openstreetmap.gui.jmapviewer.MapMarkerCircle;
import org.openstreetmap.gui.jmapviewer.Style;
/**
* @see https://stackoverflow.com/a/38265252/230513
* @see https://stackoverflow.com/a/33857113/230513
*/
public class RateCircleTest {
private void display() {
JFrame f = new JFrame("London");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMapViewer map = new JMapViewer() {
@Override
public Dimension getPreferredSize() {
return new Dimension(320, 240);
}
};
Coordinate london = new Coordinate(51.5072, -0.1275);
map.setDisplayPosition(london, 16);
Map<String, Integer> rates = new HashMap<>();
rates.put("London", 42);
for (Map.Entry<String, Integer> entry : rates.entrySet()) {
map.addMapMarker(new RateCircle(entry, london));
}
f.add(map);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
private static class RateCircle extends MapMarkerCircle {
private static final int R = 12;
private Map.Entry<String, Integer> entry;
public RateCircle(Map.Entry<String, Integer> entry, Coordinate coord) {
super(null, "", coord, R, STYLE.FIXED, getDefaultStyle());
this.entry = entry;
Style style = getStyle();
style.setBackColor(Color.cyan);
style.setColor(Color.red);
}
@Override
public void paintText(Graphics g, Point position) {
super.paintText(g, position);
g.drawString(entry.getKey(), position.x + R + 2, position.y + R);
g.drawString(entry.getValue() + " kb/s", position.x + R + 2,
position.y + R + g.getFontMetrics().getHeight());
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new RateCircleTest()::display);
}
}