2016-07-08 23 views
1

所以我是JMapViewer(和StackOverFlow)的新手。我目前試圖做的是開發一個網絡的實時圖形表示,其中背景是該地區的地圖。到目前爲止,它一直進展順利,但是有一個問題困擾着我。當我創建MapMarkerCircle並設置名稱時,我想創建一個新行,以在其下面顯示信息。我試過"\n",但這不行。我試着用HTML格式 和<br>來打破這一行,但它再次打印整個東西,就像它是一個字符串一樣。MapMarkerCircle中的新行,JMapViewer

如果有人遇到過這個問題,我會非常感謝任何幫助。

這是一小部分問題出現的代碼。請注意,「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]); 

回答

0

您可以使用System.lineSeparator():

String rateStringName = inRateAsString + System.lineSeparator() + "kb/s"; 
+1

心中已經試過了,但它似乎仍然做同樣的事情,只是它打印在同一行上 – swilson1995

1

MapMarkerCircle::paint電話MapMarkerCircle::paintText,這就要求Graphics::drawString,其中相符沒有任何特殊含義的控制字符或標記。從example開始,下面的paintText()的實施在第一行下面繪製了第二行。

我已更新示例以提示關聯標記名稱和值的方法。它使用Map<String, Integer>,將Map.Entry<String, Integer>作爲參數傳遞給RateCircle構造函數。

image

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); 
    } 
} 
+1

謝謝你,我會給這個一展身手,讓你知道如何我繼續! – swilson1995