1

だから私はJMapViewer(およびStackOverFlow)が初めてです。私が現在やろうとしているのは、背景が地域の地図であるネットワークのリアルタイムのグラフィカル表現を開発することです。これまでのところ順調に進んでいますが、1 つの問題が私を悩ませています。MapMarkerCircle を作成して名前を設定すると、新しい行を作成して、その下に情報を表示したいと考えています。

試してみまし"\n"たが、これはうまくいきません。私はそれをhtml形式で囲み<br>、行を分割するために使用しようとしましたが、繰り返しますが、全体が文字列であるかのように印刷されます。

誰かが以前にこの問題に遭遇したことがある場合は、助けていただければ幸いです。

問題が発生している小さなコードを次に示します。「RateCircle」は「MapMarkerCircle」を拡張することに注意してください。

Coordinate dataPoint= new Coordinate((pmpLinks[i].getRecieverSite().getLat()+pmpLinks[i].getTransmitter().getLat())/2, (pmpLinks[i].getRecieverSite().getLon()+pmpLinks[i].getTransmitter().getLon())/2);                   
String rateStringName="<html>"+inRateAsString+"<br>kb/s</html>";

pmpCanopyRatePoints[i]=new RateCircle(allPMPrateLayer[i],rateStringName, dataPoint);                    
map().addMapMarker(pmpCanopyRatePoints[i]);
4

2 に答える 2

1

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);
    }
}
于 2016-07-08T11:11:45.943 に答える