1

乗数に基づいて折れ線グラフの軸の値を動的にフォーマットする方法を見つけようとしています。

次のように、X 軸と Y 軸の両方に LogAxis を使用しています。

  final LogAxis rangeAxis = new LogAxis(valueAxisLabel);
  rangeAxis.setStandardTickUnits(LogAxis.createLogTickUnits(Locale.ENGLISH));
  rangeAxis.setRange(0.01, 10.0);  //10 mOhms to 10 Ohms
  plot.setRangeAxis(rangeAxis);

  final LogAxis domainAxis = new LogAxis(frequencyAxisLabel);
  domainAxis.setStandardTickUnits(LogAxis.createLogTickUnits(Locale.ENGLISH));
  domainAxis.setRange(100, 10000000); //100Hz to 10MHz
  plot.setDomainAxis(domainAxis);

現在、Y 軸に次の値があります:
0.01、0.1、1、10 しかし、10mOhm、100mOhm、1Ohm、10Ohm
として表示したい

X軸には
100、1,000、10,000、100,000、1,000,000、10,000,000 がありますが、100Hz、1kHz、10kHz、100kHz、1MHz、10MHz
を見たいです

軸で使用されているをオーバーライドできることは知っていますが、このような値に基づいて動的にオーバーライドさNumberFormatれる場所をオーバーライドする方法が見つかりませんでした。NumberFormatこれは可能ですか?これを行うには延長NumberFormatする必要がありますか?

編集:受け入れられた回答NumberFormatに従って、次のように拡張しました(実装は完全ではなく、上司の簡単なデモ目的でハッキングされていることに注意してください)

public class UnitNumberFormat extends NumberFormat
{
   /**
    * 
    */
   private static final long serialVersionUID = -8544764432101798895L;

   private UnitValue unitValue;


   public UnitNumberFormat(UnitValue unitValue)
   {
      super();
      this.unitValue = unitValue;
   }


   /*
    * (non-Javadoc)
    * @see java.text.NumberFormat#format(double, java.lang.StringBuffer,
    * java.text.FieldPosition)
    */
   @Override
   public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos)
   {
      StringBuffer formattedValue = new StringBuffer();
      BigDecimal bd = new BigDecimal(number);
      BigDecimal multiplier = new BigDecimal(1);
      String multiplierString = "";
      if(number < 1 && number > 0)
      {
         multiplier = new BigDecimal(1000);
         multiplierString = "m";
      }
      else if(number < 1000 && number >= 1)
      {
         multiplier = new BigDecimal(1);
         multiplierString = "";
      }
      else if(number < 1000000 && number >= 1000)
      {
         multiplier = new BigDecimal(1. / 1000);
         multiplierString = "k";
      }
      else if(number < 1000000000 && number >= 1000000)
      {
         multiplier = new BigDecimal(1. / 1000000);
         multiplierString = "M";
      }
      else
      {
         throw new NumberFormatException("This formatter doesn't yet support values beyond Mega");
      }

      bd = bd.multiply(multiplier).round(new MathContext(1, RoundingMode.HALF_UP));

      formattedValue.append(bd.toPlainString());
      formattedValue.append(" ");
      formattedValue.append(multiplierString);
      formattedValue.append(this.unitValue.getUnit());

      return formattedValue;
   }


   /*
    * (non-Javadoc)
    * @see java.text.NumberFormat#format(long, java.lang.StringBuffer,
    * java.text.FieldPosition)
    */
   @Override
   public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos)
   {
      return null;
   }


   /*
    * (non-Javadoc)
    * @see java.text.NumberFormat#parse(java.lang.String,
    * java.text.ParsePosition)
    */
   @Override
   public Number parse(String source, ParsePosition parsePosition)
   {
      return null;
   }

}

そしてUnitValue、次のとおりです。

public enum UnitValue {
   HERTZ("Hz"),

   OHMS("Ω"),

   ;

   private final String unit;


   private UnitValue(String unit)
   {
      this.unit = unit;
   }


   /**
    * @return the unit
    */
   public String getUnit()
   {
      return unit;
   }
}
4

1 に答える 1

1

はい、サブクラス化する必要がありますここNumberFormatに例があります

于 2013-04-18T16:17:40.347 に答える