001/* 002 * Copyright (c) 2009 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016package org.opengion.hayabusa.io; 017 018import static org.opengion.fukurou.system.HybsConst.CR ; // 6.1.0.0 (2014/12/26) 019import org.opengion.fukurou.util.StringUtil; 020import org.opengion.fukurou.util.ColorMap; // 6.0.2.1 (2014/09/26) 021import org.opengion.hayabusa.common.HybsSystemException; 022import org.opengion.hayabusa.db.DBTableModel; 023import static org.opengion.fukurou.system.HybsConst.BUFFER_MIDDLE; // 6.1.0.0 (2014/12/26) refactoring 024 025import java.util.List; 026import java.util.ArrayList; 027import java.util.Arrays; 028import java.awt.Color; 029import java.sql.Connection; 030import java.sql.SQLException; 031import java.text.NumberFormat; 032import java.text.DecimalFormat; // 5.5.2.1 (2012/05/07) 033import java.text.DecimalFormatSymbols; // 5.5.2.1 (2012/05/07) 034import java.text.FieldPosition; // 5.5.2.1 (2012/05/07) 035 036import org.jfree.data.general.Dataset; 037import org.jfree.data.general.DefaultValueDataset; 038import org.jfree.data.general.ValueDataset; 039import org.jfree.chart.plot.ValueMarker; 040import org.jfree.chart.axis.NumberAxis; 041import org.jfree.chart.axis.NumberTickUnit; 042import org.jfree.chart.renderer.category.CategoryItemRenderer; 043import org.jfree.chart.renderer.category.BarRenderer; 044import org.jfree.chart.renderer.category.LineAndShapeRenderer; 045import org.jfree.chart.labels.CategoryItemLabelGenerator; 046import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; 047import org.jfree.chart.labels.ItemLabelPosition; // 6.0.2.1 (2014/09/26) 048import org.jfree.chart.labels.ItemLabelAnchor; // 6.0.2.1 (2014/09/26) 049import org.jfree.chart.urls.CategoryURLGenerator; 050import org.jfree.ui.RectangleInsets; 051import org.jfree.ui.TextAnchor; 052 053import org.jfree.chart.plot.MeterPlot; // 5.7.8.0 (2014/07/04) 054import org.jfree.chart.plot.ThermometerPlot; // 5.7.8.0 (2014/07/04) 055import org.jfree.chart.plot.CompassPlot; // 5.7.8.0 (2014/07/04) 056import org.jfree.chart.plot.Plot; // 5.7.8.0 (2014/07/04) 057import java.awt.BasicStroke; // 5.7.8.0 (2014/07/04) 058import org.jfree.data.Range; // 5.7.8.0 (2014/07/04) 059import org.jfree.chart.plot.MeterInterval; // 5.7.8.0 (2014/07/04) 060import org.jfree.chart.plot.DialShape; // 5.7.8.0 (2014/07/04) 061 062/** 063 * ChartDataset は、Dataset および、JFreeChart の個別属性を管理しているデータ管理クラスです。 064 * JFreeChart のグラフ合成機能のための、個別のグラフ描画属性を管理しています。 065 * 内部的に、引数の文字列を JFreeChart の各オブジェクトへの変換なども行っています。 066 * 067 * @version 0.9.0 2007/06/21 068 * @author Kazuhiko Hasegawa 069 * @since JDK1.1, 070 */ 071public class ChartDataset { 072 073 private Dataset dataset ; // Dataset オブジェクト 074 private String query ; // 実行クエリー 075 private String chartType ; // チャートの種類 076 private String needleType ; // Needleの種類 077 private boolean baseLegend = true; // シリーズ単位の凡例 の表示可否 078 private String valueLabel ; 079 private double[] markValues ; // doubleの配列 080 private Color[] markColors = new Color[] { Color.RED }; // Colorの配列 081 private Color[] markOverColors ; // 4.0.3.0 (2008/01/07) マーカーラインの超過色 082 private boolean useMarkAnchor = true; // 4.1.1.0 (2008/02/04) 設定値をラベル表示するかどうか 083 private int dynamicOCNo = -1; // 4.1.1.0 (2008/02/04) 動的なマーカーラインの基準シリーズ番号 084 private int dynamicOCadrs = -1; // 4.1.1.0 (2008/02/21) 動的なマーカーラインの基準番号 085 private String lowerBound ; // double 086 private String upperBound ; // double 087 private String tickSize ; // double 4.0.3.0 (2008/01/07) 088 private boolean useGradient ; 089 private boolean shapesVisible = true; 090 private Color[] shapeColors ; // 4.0.3.0 (2008/01/07) データ毎にShapeを切り替える時の色指定 091 private String shapeScale ; // 4.1.1.0 (2008/02/04) 基本形 Shape の表示倍率(double) 092 private boolean useDottedLine ; 093 private Color[] seriesColors ; // シリーズに対応した色指定 094 private String[] seriesLabels ; // 6.0.2.0 (2014/09/19) シリーズに対応したラベル名指定 095 private boolean isLabelsVisible = true; // 4.0.2.0 (2007/12/20) (縦軸)のラベルを表示するかどうか 096 private boolean isMarksVisible = true; // 4.0.2.0 (2007/12/20) (縦軸)のマーカーを表示するかどうか 097 private boolean isItemValVisible ; // 4.1.1.0 (2008/02/04) データの値(itemText)を表示するかどうか 098 private boolean isItemLastVisible ; // 4.1.2.0 (2008/03/12) データの値(itemText)で最後のみ表示するかどうか 099 private boolean useItemLabelSep = true; // 4.1.2.0 (2008/03/12) データの値(itemText)の表示に桁区切り文字を使用するかどうか 100 private String barWidth ; // 4.0.3.0 (2008/01/07) バー幅(double) 101 private String maxBarWidth ; // 4.0.2.0 (2007/12/20) バー幅の最大値(0.0~1.0) 102 private String itemMargin ; // 4.0.2.0 (2007/12/20) バーアイテムのマージン(0.0~1.0) 103 private String visibleLimit ; // 4.0.3.0 (2008/01/07) 表示下限値(これ以下のデータは未表示) 104 private String valueInset ; // 4.0.3.0 (2008/01/07) 縦軸表示領域INSET値 105 private double domainMargin ; // 4.1.1.0 (2008/02/14) グラフの書き出し位置の調整比率 106 107 private String timeFormatType ; // 5.5.2.1 (2012/05/07) 時刻の表示方法(E1/E2/E3/H1/H2/H3) 108 private boolean useVerticalLabels ; // 5.5.2.1 (2012/05/07) ラベルの表示向き(横書き:false/縦書き:true) 109 private boolean useCategoryColor ; // 6.0.2.2 (2014/10/03) カテゴリのカラー名指定[true/false] 110 111 /** 112 * デフォルトコンストラクター 113 * 114 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 115 */ 116 public ChartDataset() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 117 118 /** 119 * Connection と query 文字列から、Dataset オブジェクトを作成します。 120 * 121 * setChartType( String ) で指定されたチャートタイプに応じて、Datasetオブジェクト 122 * を構築します。 123 * Dataset クラスは、"org.jfree.data.jdbc.JDBCXXXXDataset" の XXXX の箇所を 124 * ChartFactory クラスのチャートタイプ変換表に基づいて求めます。 125 * 現状は、Category , Pie , XY の3種類と、Value が指定可能です。 126 * ※ Value は、conn や sql を使用していません。値は、markValues を使用しています。 127 * これは、現状の暫定方法であり、今後は変わる可能性があります。 128 * 129 * @og.rev 4.0.0.0 (2007/11/28) new Double(double) ⇒ Double.valueOf(double) 変更 130 * @og.rev 6.0.2.0 (2014/09/19) シリーズのラベル名配列追加 131 * @og.rev 6.0.2.2 (2014/10/03) カテゴリのカラー名指定 useCategoryColor 追加 132 * 133 * @param conn Datasetの取得先のコネクション 134 * @param sql 取得するクエリー文字列 135 * @throws SQLException データベース実行エラーが発生した場合 136 */ 137 public void makeDataset( final Connection conn,final String sql ) throws SQLException { 138 dataset = ChartFactory.newDataset( conn,sql,chartType,seriesLabels,useCategoryColor ); 139 query = sql ; 140 141 // 暫定的対応。本当は、SQL を実行してその値をセットすべき 142 if( dataset instanceof DefaultValueDataset ) { 143 if( markValues != null && markValues.length > 0 ) { 144 ((DefaultValueDataset)dataset).setValue( Double.valueOf( markValues[0] ) ); 145 } 146 else { 147 final String errMsg = "markValues が指定されていません。"; 148 throw new HybsSystemException( errMsg ); 149 } 150 } 151 } 152 153 /** 154 * DBTableModelオブジェクトから、Dataset オブジェクトを作成します。 155 * 156 * setChartType( String ) で指定されたチャートタイプに応じて、Datasetオブジェクト 157 * を構築します。 158 * 159 * 現状は、Category , Pie , XY の3種類と、Value が指定可能です。 160 * ※ Value は、DBTableModel を使用していません。値は、markValues を使用しています。 161 * これは、現状の暫定方法であり、今後は変わる可能性があります。 162 * 163 * @og.rev 5.3.0.0 (2010/12/01) 新規追加 164 * @og.rev 6.0.2.0 (2014/09/19) シリーズのラベル名配列追加 165 * @og.rev 6.0.2.2 (2014/10/03) カテゴリのカラー名指定 useCategoryColor 追加 166 * 167 * @param table Datasetの取得先のテーブルモデル 168 */ 169 public void makeDataset( final DBTableModel table ) { 170 dataset = ChartFactory.newDataset( table,chartType,seriesLabels,useCategoryColor ); 171 172 // 暫定的対応。本当は、SQL を実行してその値をセットすべき 173 if( dataset instanceof DefaultValueDataset ) { 174 if( markValues != null && markValues.length > 0 ) { 175 ((DefaultValueDataset)dataset).setValue( Double.valueOf( markValues[0] ) ); 176 } 177 else { 178 final String errMsg = "markValues が指定されていません。"; 179 throw new HybsSystemException( errMsg ); 180 } 181 } 182 } 183 184 /** 185 * NumberAxis オブジェクトを作成します。 186 * 187 * NumberAxis オブジェクトは、Value(縦軸)の属性を設定する為に使用される 188 * オブジェクトです。 189 * これに、各種属性を設定して、値を返します。 190 * 属性としては、isLineVisible、isLabelsVisible、isMarksVisible、 191 * range(lowerBound、upperBound) です。 192 * 193 * @og.rev 4.0.2.0 (2007/12/20) 新規追加 194 * @og.rev 4.0.3.0 (2008/01/07) 縦軸レンジを個別設定、チック幅指定 195 * @og.rev 4.1.1.0 (2008/02/04) HybsNumberAxis 採用 196 * @og.rev 4.1.1.0 (2008/02/04) setAxisLineVisible を、isMarksVisible 値で設定する。 197 * @og.rev 5.5.2.1 (2012/05/07) timeFormatType 、useVerticalLabels 属性を追加する。 198 * @og.rev 6.0.3.0 (2014/11/13) lowerBound だけ設定すると、upperBound がおかしくなる。 199 * @og.rev 6.2.0.0 (2015/02/27) グラフの重ね合わせ時に、縦軸表示が崩れる対応(暫定) 200 * 201 * @return 縦軸の属性(NumberAxisオブジェクト) 202 */ 203 protected NumberAxis makeNumberAxis() { 204 final NumberAxis axis = new HybsNumberAxis( valueLabel ); 205 206 // 縦軸レンジ幅の軸設定 207 if( lowerBound != null ) { 208 final double lower = Double.parseDouble( lowerBound ); 209 axis.setLowerBound( lower ); 210 } 211 212 // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..; 213 if( upperBound == null ) { 214 // 6.2.0.0 (2015/02/27) グラフの重ね合わせ時に、縦軸表示が崩れる対応(暫定) 215 // 6.0.3.0 (2014/11/13) lowerBound だけ設定すると、upperBound がおかしくなる。 216 if( dataset instanceof HybsCategoryDataset ) { 217 final Range range = ((HybsCategoryDataset)dataset).getRange(); 218 if( range != null ) { 219 final double upper = range.getUpperBound() * 1.1; // UpperBoundの 10% 大き目の値にする。 220 axis.setUpperBound( upper ); 221 } 222 } 223 } 224 else { 225 axis.setUpperBound( Double.parseDouble( upperBound ) ); 226 } 227 228 if( tickSize != null ) { 229 axis.setTickUnit( new NumberTickUnit( Double.parseDouble( tickSize ) ) ); 230 } 231 232 axis.setTickLabelsVisible( isLabelsVisible ); 233 axis.setTickMarksVisible ( isMarksVisible ); 234 axis.setAxisLineVisible ( isMarksVisible ); // 4.1.1.0 (2008/02/04) 235 236 if( valueInset != null ) { 237 final double rightInset = Double.parseDouble( valueInset ); 238 final RectangleInsets base = axis.getTickLabelInsets(); 239 final RectangleInsets inset = new RectangleInsets( 240 base.getUnitType(), // UnitType unitType 241 base.getTop(), // double top 242 base.getLeft(), // double left 243 base.getBottom(), // double bottom 244 base.getRight() + rightInset // double right 245 ); 246 axis.setTickLabelInsets( inset ) ; 247 } 248 249 // 5.5.2.1 (2012/05/07) 時刻の表示方法(E1/E2/E3/H1/H2/H3) 250 if( timeFormatType != null ) { 251 axis.setNumberFormatOverride( new HybsTimeFormat( timeFormatType ) ); 252 } 253 254 // 5.5.2.1 (2012/05/07) ラベルの表示向き(横書き:false/縦書き:true) 255 if( useVerticalLabels ) { 256 axis.setVerticalTickLabels( true ); // 処理的には冗長。 257 } 258 259 return axis; 260 } 261 262 /** 263 * 検索を行う クエリー文字列を返します。 264 * 265 * これは、makeDataset( Connection ,String ) メソッドで指定した、 266 * sql 属性の設定値そのものです。 267 * 268 * @return 取得するクエリー文字列 269 */ 270 public String getQuery() { return query; } 271 272 /** 273 * Dataset オブジェクトを取得します。 274 * 275 * makeDataset( Connection,String ) で、予めオブジェクトを構築しておく 276 * 必要があります。 277 * Dataset クラスは、"org.jfree.data.jdbc.JDBCXXXXDataset" の XXXX の箇所を 278 * ChartFactory クラスのチャートタイプ変換表に基づいて求めます。 279 * 現状は、Category , Pie , XY の3種類と、Value が指定可能です。 280 * 281 * @return Datasetオブジェクト 282 * @see #makeDataset( Connection ,String ) 283 */ 284 protected Dataset getDataset() { return dataset; } 285 286 /** 287 * Dataset オブジェクトを作成する時のチャートタイプを指定します。 288 * 289 * チャートタイプ は、外部からチャートを指定するのに便利なように、キー化 290 * されています。このキーに基づいて、ChartFactory クラスの 291 * チャートタイプ変換表に基づいて、レンデラーや、データセットを作成します。 292 * 293 * @param type チャートタイプ 294 */ 295 public void setChartType( final String type ) { 296 if( type != null && type.length() > 0 ) { 297 chartType = type; 298 } 299 } 300 301 /** 302 * Dataset オブジェクトを作成する時のNeedleタイプを指定します。 303 * 304 * Needleタイプ は、MeterPlot,Compassチャートを使用する場合に指定します。 305 * 306 * MeterPlot 307 * org.jfree.chart.plot.DialShape の指定キーワードとして、CHORD,CIRCLE,PIE が指定可能です。 308 * 初期値は、CIRCLE です。 309 * 310 * Compass 311 * org.jfree.chart.needle.MeterNeedle の指定キーワードとして、下記の9種類が指定可能です。 312 * 指定は、Arrow,Line,Long,Pin,Plum,Pointer,Ship,Wind,Arrow,MiddlePin という文字列です。 313 * 初期値は、Pointer です。 314 * 315 * 0 = ArrowNeedle; 316 * 1 = LineNeedle; 317 * 2 = LongNeedle; 318 * 3 = PinNeedle; 319 * 4 = PlumNeedle; 320 * 5 = PointerNeedle; 321 * 6 = ShipNeedle; 322 * 7 = WindNeedle; 323 * 8 = ArrowNeedle; 324 * 9 = MiddlePinNeedle; 325 * 326 * @og.rev 5.7.8.0 (2014/07/04) 新規追加 327 * 328 * @param type Needleタイプ 329 */ 330 public void setNeedleType( final String type ) { 331 if( type != null && type.length() > 0 ) { 332 needleType = type; 333 } 334 } 335 336 /** 337 * Dataset オブジェクトを作成する時のチャートタイプを取得します。 338 * 339 * チャートタイプ は、外部からチャートを指定するのに便利なように、キー化 340 * されています。このキーに基づいて、ChartFactory クラスの 341 * チャートタイプ変換表に基づいて、レンデラーや、データセットを作成します。 342 * 343 * @return チャートタイプ 344 */ 345 protected String getChartType() { return chartType; } 346 347 /** 348 * シリーズ単位の凡例 の表示可否を設定します。 349 * 350 * @param baseLeg シリーズ単位の凡例 の表示可否 351 */ 352 public void setBaseLegend( final boolean baseLeg ) { 353 baseLegend = baseLeg; 354 } 355 356 /** 357 * Renderer 関連の共通インターフェースを返します。 358 * 359 * setChartType( String )で設定された、チャートタイプに応じた、レンデラーを 360 * 返します。 361 * 対応表は、ChartFactory クラスに持っています。 362 * 基本的には、チャートタイプ は、この、レンデラー名称から決定しています。 363 * 364 * @og.rev 4.1.1.0 (2008/02/04) useDynamicOC , isItemValVisible , shapeScale 属性追加 365 * @og.rev 4.1.1.0 (2008/02/04) クリッカブル・マップの設定を移動、serNo 引数追加 366 * @og.rev 4.1.1.0 (2008/02/04) 返す型を CategoryItemRenderer に変更 367 * @og.rev 4.1.1.0 (2008/02/16) HybsStackedBarRenderer に domainMargin を設定 368 * @og.rev 4.1.1.0 (2008/02/19) Shapes の設定をこちらに移動。 369 * @og.rev 4.1.2.0 (2008/03/12) isItemLastVisible の設定 370 * @og.rev 5.9.24.3 (2017/09/29) hybsBarRendのoverColor対応 371 * 372 * @param serNo シリアルNo 373 * @param urlGen CategoryURLGeneratorオブジェクト 374 * 375 * @return レンデラーの共通インターフェース 376 * @see org.jfree.chart.renderer.category.CategoryItemRenderer 377 * @see org.jfree.chart.renderer.xy.XYItemRenderer 378 */ 379 protected CategoryItemRenderer getRenderer( final int serNo , final CategoryURLGenerator urlGen ) { 380 final TypeRenderer typeRen = ChartFactory.getTypeRenderer( chartType ); 381 final CategoryItemRenderer rend = (CategoryItemRenderer)typeRen.getRenderer(); 382 383 // 4.1.1.0 (2008/02/19) LineAndShapeRenderer オブジェクトの場合の設定 384 if( rend instanceof LineAndShapeRenderer ) { 385 final LineAndShapeRenderer lsRend = (LineAndShapeRenderer)rend; 386 387 // シェープ(四角)表示。serNo 内の表示は、個別に行います。 388 lsRend.setBaseShapesVisible( shapesVisible ); 389 if( serNo >= 0 ) { 390 lsRend.setSeriesShapesVisible( serNo,true ); 391 } 392 393 // 4.1.1.0 (2008/02/04) 繰返しshapeの開始番号(初期値:0) 394 final ShapeList shapeList = new ShapeList(); 395 for( int i=0; i<shapeList.size(); i++ ) { 396 lsRend.setSeriesShape( i,shapeList.getShape(i) ); 397 } 398 } 399 400 // 4.0.3.0 (2008/01/07) HybsLineRenderer 特別処理 401 if( rend instanceof HybsLineRenderer ) { 402 final HybsLineRenderer hyRend = (HybsLineRenderer)rend ; 403 if( shapeColors != null ) { 404 hyRend.setShapeColors( shapeColors ); 405 } 406 407 // 4.1.1.0 (2008/02/04) shapeの大きさの倍率(初期値:null) 408 hyRend.setShapeScale( shapeScale ); 409 410 // 縦軸マーカーの超過時Shape色指定(未使用時は null) 411 if( markOverColors != null ) { 412 hyRend.setValueMarkOverColors( getValueMarkOverColors(),dynamicOCNo ); 413 } 414 415 // 表示下限値(これ以下のデータは未表示)の値(double)を指定 416 if( visibleLimit != null ) { 417// hyRend.setVisibleLimit( Double.valueOf( visibleLimit ) ); 418 hyRend.setVisibleLimit( Double.parseDouble( visibleLimit ) ); // 7.3.0.0 (2021/01/06) SpotBugs 疑わしいプリミティブ値のボクシング 419 } 420 } 421 422 // 4.0.2.0 (2007/12/20) BarRenderer オブジェクトの場合にマージン等を設定します。 423 if( rend instanceof BarRenderer ) { 424 final BarRenderer barRend = (BarRenderer)rend ; 425 426 // 棒の間を表示領域を1として小数点以下の数値で幅を設定する(0.0~1.0) 427 if( itemMargin != null ) { 428 final double margin = Double.parseDouble( itemMargin ); 429 barRend.setItemMargin( margin ) ; 430 } 431 432 // 棒の幅を設定す 表示領域を1として小数点以下の数値で幅を設定する(0.0~1.0) 433 if( maxBarWidth != null ) { 434 barRend.setMaximumBarWidth( Double.parseDouble( maxBarWidth ) ) ; 435 } 436 } 437 438 // 5.9.24.3 (2017/09/29) overColor対応 439 if( rend instanceof HybsBarRenderer ) { 440 final HybsBarRenderer barRend = (HybsBarRenderer)rend ; 441 if( markOverColors != null ) { 442 barRend.setValueMarkOverColors( getValueMarkOverColors(),dynamicOCNo ); 443 } 444 } 445 446 // 4.1.1.0 (2008/02/16) HybsStackedBarRenderer オブジェクトの場合に domainMargin を設定します。 447 if( rend instanceof HybsStackedBarRenderer ) { 448 final HybsStackedBarRenderer stBarRend = (HybsStackedBarRenderer)rend ; 449 450 stBarRend.setDomainMargin( domainMargin ) ; 451 } 452 453 // シリーズ単位の凡例 の表示可否 454 rend.setBaseSeriesVisibleInLegend( baseLegend ); 455 456 // 4.1.1.0 (2008/02/04) データの値(itemText)を表示するかどうか 457 if( isItemValVisible ) { 458 // 4.1.2.0 (2008/03/12) 桁区切り文字を使用するかどうか 459 final NumberFormat numForm = NumberFormat.getInstance(); 460 numForm.setGroupingUsed( useItemLabelSep ); 461 462 final CategoryItemLabelGenerator labelGen 463 = new StandardCategoryItemLabelGenerator( 464 StandardCategoryItemLabelGenerator.DEFAULT_LABEL_FORMAT_STRING, 465 numForm 466 ); 467 rend.setBaseItemLabelGenerator( labelGen ); 468 469 if( serNo >= 0 ) { 470 rend.setSeriesItemLabelsVisible( serNo,true ); 471 } 472 else { 473 rend.setBaseItemLabelsVisible( true ); 474 } 475 // 4.1.1.0 (2008/02/04) 動的なマーカーラインを使用する場合、 476 // 指定の番号は閾値なので、表示しません。 477 if( dynamicOCNo >= 0 ) { 478 rend.setSeriesItemLabelsVisible( dynamicOCNo,false ); // 閾値 479 } 480 481 // 4.1.2.0 (2008/03/12) isItemLastVisible の設定 482 if( isItemLastVisible && rend instanceof HybsDrawItem ) { 483 ((HybsDrawItem)rend).setItemLabelLastVisible( true ) ; 484 } 485 486 // 6.0.2.1 (2014/09/26) ItemLabelPosition を、バーの外側の上に表示させます。 487 rend.setBasePositiveItemLabelPosition( 488 new ItemLabelPosition( ItemLabelAnchor.OUTSIDE12,TextAnchor.BOTTOM_CENTER ) , 489 false ); 490 } 491 492 // クリッカブル・マップ 493 if( urlGen != null ) { 494 if( serNo >= 0 ) { 495 rend.setSeriesItemURLGenerator( serNo,urlGen ); 496 } 497 else { 498 rend.setBaseItemURLGenerator( urlGen ); 499 } 500 } 501 502 return rend; 503 } 504 505 /** 506 * 縦軸の表示名称を指定します。 507 * 508 * @param valLbl 縦軸の表示名称 509 */ 510 public void setValueLabel( final String valLbl ) { 511 if( valLbl != null && valLbl.length() > 0 ) { 512 valueLabel = valLbl; 513 } 514 } 515 516 /** 517 * 縦軸の表示名称を取得します。 518 * 519 * @return 縦軸の表示名称 520 */ 521 protected String getValueLabel() { return valueLabel; } 522 523 /** 524 * マーカーラインの設定値配列を指定します。 525 * 526 * 指定の値にマーカーラインを引きます。 527 * 色は、setMarkColor( String ) で指定します。 528 * markColors と、あわせて設定する必要があります。 529 * markColorsが、指定されていない場合は、Color.RED で マーカーされます。 530 * dynamicOCNo を使用する場合は、そのValues の並びの箇所に、 531 * "G" という文字列を設定して下さい。 532 * 例:2000,G 基準1は、2000の直線、基準2は、グラフ という意味。 533 * 534 * @og.rev 4.1.1.0 (2008/02/21) 基準ラインにグラフを使用する場合の位置指定 535 * 536 * @param mkVal マーカーラインの設定値配列(可変長引数) 537 * @see #setMarkColors( String[] ) 538 */ 539 public void setMarkValues( final String... mkVal ) { 540 if( mkVal != null && mkVal.length > 0 ) { // 6.1.1.0 (2015/01/17) 可変長引数でもnullは来る。 541 final int size = mkVal.length; 542 markValues = new double[size]; 543 for( int i=0; i<size; i++ ) { 544 if( "G".equals( mkVal[i] ) ) { 545 dynamicOCadrs = i; 546 markValues[i] = 0.0; 547 } 548 else { 549 markValues[i] = Double.parseDouble( mkVal[i] ); 550 } 551 } 552 } 553 } 554 555 /** 556 * マーカーラインの色を配列指定します。 557 * 558 * マーカーラインとは、縦軸設定のラインの事で、縦軸の設定値(markValues)に 559 * 横方向にラインを付与します。このラインの色を、CSV形式形式で 560 * 指定します。 561 * markValues と、あわせて設定する必要があります。 562 * 個数が異なる場合は、markValues が優先され、無指定の場合は、Color.REDで 563 * 表示されます。 564 * 565 * <pre> 566 * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY , 567 * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) 568 * #XXXXXX形式の16bitRGB表記 でも指定可能です。 569 * </pre> 570 * 571 * @og.rev 6.0.2.1 (2014/09/26) StringUtil → ColorMap 572 * 573 * @param mkCol マーカーラインの色配列(可変長引数) 574 * @see java.awt.Color#BLACK 575 * @see #setMarkValues( String[] ) 576 */ 577 public void setMarkColors( final String... mkCol ) { 578 if( mkCol != null && mkCol.length > 0 ) { // 6.1.1.0 (2015/01/17) 可変長引数でもnullは来る。 579 final int size = mkCol.length; 580 markColors = new Color[size]; 581 for( int i=0; i<size; i++ ) { 582 markColors[i] = ColorMap.getColorInstance( mkCol[i] ); // 6.0.2.1 (2014/09/26) StringUtil → ColorMap 583 } 584 } 585 } 586 587 /** 588 * マーカーライン描画時に、その設定値を表示します。 589 * 590 * マーカーラインの縦軸の設定値(markValues)に、設定値をラベル表示します。 591 * 位置は、TextAnchor.BASELINE_LEFT 固定です。 592 * 初期値は、表示する(true)です。 593 * 594 * @og.rev 4.1.1.0 (2008/02/04) 新規追加 595 * 596 * @param useAnchor true:設定値を表示する。 597 */ 598 public void setUseMarkAnchor( final boolean useAnchor ) { 599 useMarkAnchor = useAnchor ; 600 } 601 602 /** 603 * マーカーラインの超過時のShape色をCSV形式形式で複数指定します。 604 * 605 * HybsLine でのみ使用可能です。 606 * マーカーラインを使用する場合に、そのラインを超えない色、超える色を指定します。 607 * この色の指定は、マーカーラインの色やマーカーラインの設定値の個数+1に 608 * なります。つまり、色1:設定値1:色2:設定値2:色3 となります。 609 * 色1は、設定値1より小さい場合に使用され、色2は、設定値1より大きく、 610 * 設定値2より小さい場合、色3は、設定値2より大きい場合になります。 611 * 612 * 指定文字列は、java.awt.Color クラスのstatic フィールド名で指定します。 613 * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY , 614 * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます。 615 * また、#XXXXXX形式の16bitRGB表記 でも指定可能です。 616 * markValues と、あわせて設定する必要があります。 617 * どちらかが、指定されていない場合は、マーカー表示されません。 618 * <pre> 619 * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY , 620 * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) 621 * #XXXXXX形式の16bitRGB表記 でも指定可能です。 622 * </pre> 623 * 624 * @og.rev 4.0.3.0 (2008/01/07) 新規追加 625 * @og.rev 6.0.2.1 (2014/09/26) StringUtil → ColorMap 626 * 627 * @param ovCol マーカーラインの超過時のShape色配列(可変長引数) 628 * @see java.awt.Color#BLACK 629 */ 630 public void setMarkOverColors( final String... ovCol ) { 631 if( ovCol != null && ovCol.length > 0 ) { // 6.1.1.0 (2015/01/17) 可変長引数でもnullは来る。 632 final int size = ovCol.length; 633 markOverColors = new Color[size]; 634 for( int i=0; i<size; i++ ) { 635 markOverColors[i] = ColorMap.getColorInstance( ovCol[i] ); // 6.0.2.1 (2014/09/26) StringUtil → ColorMap 636 } 637 } 638 } 639 640 /** 641 * マーカーラインの超過時のShape色を規定するオブジェクトを返します。 642 * 643 * HybsLine,HybsBar で使用します。 644 * 設定情報が存在しない場合は、null を返します。 645 * 646 * @og.rev 4.0.3.0 (2008/01/07) 新規追加 647 * @og.rev 4.1.1.0 (2008/02/04) markColors 属性追加 648 * @og.rev 4.1.1.1 (2008/02/25) markValues での "G" 指定を考慮 649 * 650 * @return マーカーラインの超過時のShape色管理オブジェクト 651 */ 652 private ValueMarkOverColors getValueMarkOverColors() { 653 ValueMarkOverColors vmoc = null; 654 655 if( markValues != null && markOverColors != null && 656 markValues.length + 1 == markOverColors.length && 657 markValues.length >= 1 ) { 658 final int dynAdrs = dynamicOCadrs >= 0 ? dynamicOCadrs : 0 ; 659 660 vmoc = new ValueMarkOverColors( 661 markValues, 662 markOverColors, 663 markColors[dynAdrs], 664 dynamicOCadrs 665 ); 666 } 667 668 return vmoc ; 669 } 670 671 /** 672 * 動的なマーカーラインの基準シリーズ番号を設定します(初期値:-1)。 673 * 674 * 動的なマーカーラインを使用する場合は、基準値となるシリーズ番号を指定します。 675 * 676 * マーカーラインの最下位閾値に相当します。これは、グラフ化されますが、 677 * Shape は自動的に削除されます。 678 * この設定を使用する場合、最初のデータには、必ずShapeが付きます。それ以外の 679 * データに、Shape を付けるかどうかは、shapesVisible 属性で指定します。 680 * この線の色は、markColors で指定した、最下位の色になります。また、 681 * markValues で指定した、最下位の値は、使用されません。ただし、色指定の 682 * 関係上、設定しておく必要があります。 683 * また、isValueVisible == true で、設定値の値表示を行う場合も、最下位の 684 * 値は表示しないようにします。 685 * 初期値は、使用しない(-1)です。 686 * 687 * @og.rev 4.1.1.0 (2008/02/04) 新規追加 688 * @og.rev 4.1.1.0 (2008/02/19) setUseDynamicOC ⇒ setDynamicOCNo 689 * 690 * @param ocNo 動的なマーカーラインの基準シリーズ番号 691 */ 692 public void setDynamicOCNo( final int ocNo ) { 693 dynamicOCNo = ocNo; 694 } 695 696 /** 697 * マーカーラインの ValueMarker オブジェクト配列を返します。 698 * 699 * マーカーライン は、markValues(double配列) と markColors(Color配列) 700 * より、ValueMarker オブジェクトを、順次配列化していきます。 701 * useMarkAnchor == true の場合は、設定値(markValues) の Anchor を 702 * 表示します。位置は、TextAnchor.BASELINE_LEFT 固定です。 703 * dynamicOCNo が指定された場合は、最下位の閾値は使用しません。 704 * 705 * @og.rev 4.1.1.0 (2008/02/04) useMarkAnchor 属性追加 706 * @og.rev 4.1.1.0 (2008/02/04) 動的なオーバーカラー useDynamicOC 属性追加 707 * 708 * @return マーカーラインのオブジェクト配列(not null) 709 * @see java.awt.Color#BLACK 710 * @see #setMarkValues( String[] ) 711 * @see #setMarkColors( String[] ) 712 * @see #setUseMarkAnchor( boolean ) 713 */ 714 protected ValueMarker[] getValueMarkers() { 715 final List<ValueMarker> markerList = new ArrayList<>(); 716 final int size = (markValues == null) ? 0 : markValues.length; 717 for( int i=0; i<size; i++ ) { 718 if( i != dynamicOCadrs ) { 719 final ValueMarker marker = new ValueMarker( markValues[i] ); 720 marker.setPaint( markColors[i] ); 721 if( useMarkAnchor ) { 722 marker.setLabel( String.valueOf( markValues[i] ) ); 723 marker.setLabelTextAnchor( TextAnchor.BASELINE_LEFT ); 724 } 725 markerList.add( marker ); 726 } 727 } 728 729 return markerList.toArray( new ValueMarker[markerList.size()] ); 730 } 731 732 /** 733 * チャートの縦軸の最小値をセットします(初期値:自動計算)。 734 * 735 * 何も指定しない場合は、データの最小値から、自動的に計算します。 736 * 737 * @param lowBnd 縦軸の最小値 738 * @see #setUpperBound( String ) 739 */ 740 public void setLowerBound( final String lowBnd ) { 741 if( lowBnd != null && lowBnd.length() > 0 ) { 742 lowerBound = lowBnd; 743 } 744 } 745 746 /** 747 * チャートの縦軸の最大値をセットします(初期値:自動計算)。 748 * 749 * 何も指定しない場合は、データの最大値から、自動的に計算します。 750 * 751 * @param upBnd 縦軸の最大値 752 * @see #setLowerBound( String ) 753 */ 754 public void setUpperBound( final String upBnd ) { 755 if( upBnd != null && upBnd.length() > 0 ) { 756 upperBound = upBnd; 757 } 758 } 759 760 /** 761 * チャートの縦軸の目盛の幅をセットします(初期値:自動計算)。 762 * 763 * 何も指定しない場合は、データの範囲から、自動的に計算します。 764 * 765 * @og.rev 4.0.3.0 (2008/01/07) 新規追加 766 * 767 * @param size 縦軸のチック(目盛)の幅 768 */ 769 public void setTickSize( final String size ) { 770 if( size != null && size.length() > 0 ) { 771 tickSize = size; 772 } 773 } 774 775 /** 776 * バーチャートのグラデーション処理を行うかどうか[true/false]をセットします(初期値:true)。 777 * 778 * 通常のバーチャートは、単一色表示で表されますが、これにグラデーション効果を 779 * 付加するかどうかを指定します。 780 * 通常のバーチャートが、少しきれいに見えます。 781 * 初期値は、true(グラデーション効果を付与する)です。 782 * 783 * @param useGrad グラデーション処理 [true:する/false:しない] 784 */ 785 public void setUseGradient( final boolean useGrad ) { 786 useGradient = useGrad; 787 } 788 789 /** 790 * バーチャートのグラデーション処理を行うかどうかを取得します。 791 * 792 * 通常のバーチャートは、単一色表示で表されますが、これにグラデーション効果を 793 * 付加するかどうかを指定します。 794 * 通常のバーチャートが、少しきれいに見えます。 795 * 初期値は、false(使用しない)です。 796 * 797 * @return グラデーション処理(する:true/しない:false) 798 * @see #setUseGradient( boolean ) 799 */ 800 protected boolean isUseGradient() { return useGradient; } 801 802 /** 803 * ラインチャートのポイントを四角表示するかどうかを指定します(初期値:false)。 804 * 805 * ラインチャートは、通常、線分で表され、各ポイントについても、線分で接続されます。 806 * shapesVisible を true に設定すると、各ポイントが、線上に四角く表示され、 807 * そのポイントの位置を、容易に判断出来るようになります。 808 * 初期値は、マーカーを入れません。 809 * 810 * @param shVisible ポイントを四角表示するかどうか 811 */ 812 public void setShapesVisible( final boolean shVisible ) { 813 shapesVisible = shVisible; 814 } 815 816 /** 817 * ラインチャートのポイントを四角表示するかどうかを取得します。 818 * 819 * ラインチャートは、通常、線分で表され、各ポイントについても、線分で接続されます。 820 * shapesVisible を true に設定すると、各ポイントが、線上に四角く表示され、 821 * そのポイントの位置を、容易に判断出来るようになります。 822 * 初期値は、マーカーを入れません。 823 * 824 * @return ポイントを四角表示するかどうか 825 * @see #setShapesVisible( boolean ) 826 */ 827 protected boolean isShapesVisible() { return shapesVisible; } 828 829 /** 830 * データ毎にShapeを切り替える時の色の繰返しパターンを文字列配列で指定します。 831 * 832 * HybsLine でのみ使用可能です。 833 * これは、データそのものが、繰返し性のある場合に、その繰返し性に対応した 834 * 形状のShape を表示させる場合に使用します。 835 * 繰返しShapeの形状は、JFreeChart のシリーズ毎の繰返し標準形状を使用します。 836 * 現在のバージョンでは、10個までの繰返しに対応可能です。 837 * 繰返し色を、指定した分だけ、順に使用されていきます。 838 * 839 * 指定文字列は、java.awt.Color クラスのstatic フィールド名で指定します。 840 * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY , 841 * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます。 842 * また、#XXXXXX形式の16bitRGB表記 でも指定可能です。 843 * 844 * @og.rev 4.0.3.0 (2008/01/07) 新規追加 845 * @og.rev 6.0.2.1 (2014/09/26) StringUtil → ColorMap 846 * 847 * @param colors データ毎の色の繰返しパターン配列(可変長引数) 848 * @see java.awt.Color#BLACK 849 */ 850 public void setShapeColors( final String... colors ) { 851 if( colors != null && colors.length > 0 ) { // 6.1.1.0 (2015/01/17) 可変長引数でもnullは来る。 852 final int size = colors.length; 853 shapeColors = new Color[size]; 854 for( int i=0; i<size; i++ ) { 855 shapeColors[i] = ColorMap.getColorInstance( colors[i] ); // 6.0.2.1 (2014/09/26) StringUtil → ColorMap 856 } 857 } 858 } 859 860 /** 861 * shapeの大きさを倍率指定で変更します(初期値:null)。 862 * 863 * ラインチャートのShape(各グラフのポイントのマーカー)の大きさは、通常は、 864 * 自動設定されます。 865 * この大きさを、倍率指定で、変更可能です。 866 * 指定は、double 型です。 867 * 初期値は、null は、スケール変更しません(自動設定のままの大きさ) 868 * 869 * @og.rev 4.1.1.0 (2008/02/04) 新規追加 870 * 871 * @param scale shapeの大きさの倍率 872 */ 873 public void setShapeScale( final String scale ) { 874 shapeScale = scale; 875 } 876 877 /** 878 * ラインチャートの線をドットラインにするかどうかを指定します(初期値:false)。 879 * 880 * ラインチャートは、通常、線分で表されます。 881 * これに、点線で表すことで、グラフの違いを、色だけでなく形状でも識別 882 * しやすくすることが可能です。 883 * 初期値は、線分です。 884 * 885 * @param useDotLine ドットラインにするかどうか 886 */ 887 public void setUseDottedLine( final boolean useDotLine ) { 888 useDottedLine = useDotLine; 889 } 890 891 /** 892 * ラインチャートの線をドットラインにするかどうかを取得します。 893 * 894 * ラインチャートは、通常、線分で表されます。 895 * これに、点線で表すことで、グラフの違いを、色だけでなく形状でも識別 896 * しやすくすることが可能です。 897 * 初期値は、線分です。 898 * 899 * @return ドットラインにするかどうか 900 * @see #setUseDottedLine( boolean ) 901 */ 902 protected boolean isUseDottedLine() { return useDottedLine; } 903 904 /** 905 * 複数チャート描画時のチャート色の繰返しパターンを文字列配列で指定します。 906 * 907 * 通常、複数のチャートを同時に表示させる場合は、縦軸が共通であれば、 908 * 1回のSelect分で複数データを取得します。 909 * この、データをシリーズと呼んでおり、これを区別する為に、色を分けます。 910 * 初期値は、JFreeChart が自動で割り振ります。 911 * これを、外部からCVS形式で、CSV形式で色コードを指定します。 912 * 指定データが多い場合は、多い分の色は使用されません。少ない場合は、 913 * 順番に繰り返して使用されます。 914 * 例えば、1色だけ指定した場合は、すべてのシリーズが同じ色で表されます。 915 * 916 * 指定文字列は、java.awt.Color クラスのstatic フィールド名で指定します。 917 * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY , 918 * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます。 919 * また、#XXXXXX形式の16bitRGB表記 でも指定可能です。 920 * 921 * @og.rev 6.0.2.1 (2014/09/26) StringUtil → ColorMap 922 * 923 * @param colors チャート色の繰返しパターン配列(可変長引数) 924 * @see java.awt.Color#BLACK 925 */ 926 public void setSeriesColors( final String... colors ) { 927 if( colors != null && colors.length > 0 ) { // 6.1.1.0 (2015/01/17) 可変長引数でもnullは来る。 928 final int size = colors.length; 929 seriesColors = new Color[size]; 930 for( int i=0; i<size; i++ ) { 931 seriesColors[i] = ColorMap.getColorInstance( colors[i] ); // 6.0.2.1 (2014/09/26) StringUtil → ColorMap 932 } 933 } 934 } 935 936 /** 937 * 複数チャート描画時のチャート色の繰返しパターンをColor配列で指定します。 938 * 939 * @return チャート色の繰返しパターン(Color配列) 940 * @see #setSeriesColors( String[] ) 941 */ 942 protected Color[] getSeriesColors() { 943 return seriesColors ; 944 } 945 946 /** 947 * 複数チャート(series)描画時のラベル名配列を指定します。 948 * 949 * 通常、複数のチャートを同時に表示させる場合は、縦軸が共通であれば、 950 * 1回のSelect分で複数データを取得します。 951 * この、データをシリーズと呼んでおり、これの名称は、Select文のカラム名になります。 952 * 英文であれば問題ないのですが、日本語表示したい場合に、別名(as)に{@XXXX}を 953 * 付けるなどの方法がありますが、firebird では、JDBCのResultSetMetaData#getColumnLabel(int) 954 * の取得で、文字コードがうまく処理されないようなので、外部から与える機能を用意します。 955 * 956 * ここでは、select category,series1,series2,・・・・,seriesN from table の 957 * series1,series2,・・・・,seriesN の部分 を順番に与えます。 958 * 959 * ※ 注意:このメソッドでは、配列はコピーではなく、そのままセットされています。 960 * 副作用があるかもしれませんので、必要であれば、コピーして渡してください。 961 * (現状、参照しかしていませんけど) 962 * 963 * @og.rev 6.0.2.0 (2014/09/19) 新規追加 964 * 965 * @param labels チャートのシリーズのラベル名配列(可変長引数) 966 */ 967 public void setSeriesLabels( final String... labels ) { 968 if( labels != null && labels.length > 0 ) { // 6.1.1.0 (2015/01/17) 可変長引数でもnullは来る。 969 // 6.0.2.5 (2014/10/31) refactoring 970 seriesLabels = labels.clone(); 971 } 972 } 973 974 /** 975 * Value(縦軸)のラベルを表示するかどうかを指定します(初期値:true[表示する])。 976 * 977 * ValueAxis にて設定される、縦軸情報の、ラベルを表示するかどうか指定します。 978 * 初期値は、true(表示する)です。 979 * 980 * @og.rev 4.0.2.0 (2007/12/20) 新規追加 981 * 982 * @param labelsVisible Value(縦軸)のラベルを表示するかどうか 983 */ 984 public void setValueLabelsVisible( final boolean labelsVisible ) { 985 isLabelsVisible = labelsVisible; 986 } 987 988 /** 989 * Value(縦軸)のマーカーを表示するかどうかを指定します(初期値:true[表示する])。 990 * 991 * ValueAxis にて設定される、縦軸情報の、マーカーを表示するかどうか指定します。 992 * 初期値は、true(表示する)です。 993 * 994 * @og.rev 4.0.2.0 (2007/12/20) 新規追加 995 * 996 * @param marksVisible Value(縦軸)のマーカーを表示するかどうか 997 */ 998 public void setValueMarksVisible( final boolean marksVisible ) { 999 isMarksVisible = marksVisible; 1000 } 1001 1002 /** 1003 * データの値(itemText)を表示するかどうか[true/false/last]を指定します(初期値:false[表示しない])。 1004 * 1005 * CategoryItemRenderer 関連のグラフの設定値をグラフ上に表示するかどうかを 1006 * 指定します。 1007 * true に設定した場合、通常の場合は、すべてのシリーズにラベル表示されます。 1008 * false に設定すると、表示されません。 1009 * last を設定すると、各シリーズの最後の値のみ表示されます。 1010 * ChartCreate クラスに、seriesPikup が設定されている場合は、指定のシリーズ 1011 * のみの設定値を表示し、他の値は、表示しません。 1012 * 同様に、dynamicOCNo が指定されている場合(動的なマーカーライン) 1013 * 指定のシリーズは、閾値として使用されるため、設定値は表示されません。 1014 * ラベルの表示位置は、表示する線グラフの傾きに応じてラベルの表示場所を 1015 * 変えます。山形、右坂、谷形、左坂 に応じて、上中、下右、下中、上右 に 1016 * 位置を設定します。右にずらすのは、10 ピクセル固定です。 1017 * 初期値は、false(表示しない)です。 1018 * 1019 * @og.rev 4.1.1.0 (2008/02/04) 新規追加 1020 * @og.rev 4.1.2.0 (2008/03/12) 文字列のまま、受け取りるように変更 1021 * 1022 * @param visible データの値の表示のさせ方 [true/false/last] 1023 * @see ChartCreate#setSeriesPikup( int ) 1024 */ 1025 public void setItemLabelVisible( final String visible ) { 1026 if( "true".equalsIgnoreCase( visible ) ) { 1027 isItemValVisible = true; 1028 } 1029 else if( "last".equalsIgnoreCase( visible ) ) { 1030 isItemValVisible = true; 1031 isItemLastVisible = true; 1032 } 1033 else if( visible != null && !"false".equalsIgnoreCase( visible ) ) { 1034 final String errMsg = "itemLabelVisible は、「true,false,last」から指定してください。[" 1035 + visible + "]"; 1036 throw new HybsSystemException( errMsg ); 1037 } 1038 } 1039 1040 /** 1041 * データの値(itemText)の表示に桁区切り文字を使用するかどうかを指定します。 1042 * 1043 * itemLabelVisible=true 時に、表示されるデータ値ラベルで、 1044 * NumberFormat していますが、3桁区切り文字(123,456,789.0) の 1045 * 区切り記号を表示するかどうかを指定します。 1046 * true を指定すると、表示します。false では、表示しません。 1047 * 初期値は、true(使用する)です。 1048 * 1049 * @og.rev 4.1.2.0 (2008/03/12) 新規追加 1050 * 1051 * @param used 桁区切り文字を使用するかどうか 1052 */ 1053 public void setUseItemLabelSep( final boolean used ) { 1054 useItemLabelSep = used; 1055 } 1056 1057 /** 1058 * 縦軸の表示領域INSET値(double)を指定します。 1059 * 1060 * 縦軸文字表示領域(NumberAxis)の幅の追加値を設定します。 1061 * これは、通常の表示領域の左側にスペースを挿入します。 1062 * あくまで、追加する値なので、文字の長さは含まれません。 1063 * 何も指定しない場合は、設定しません。 1064 * 1065 * @og.rev 4.0.3.0 (2008/01/07) 新規追加 1066 * 1067 * @param inset Value(縦軸)の表示領域INSET値 1068 */ 1069 public void setValueInset( final String inset ) { 1070 valueInset = inset; 1071 } 1072 1073 /** 1074 * BOXチャートのバー幅(double)を指定します。 1075 * 1076 * BOXチャートのバー幅(double)を指定します。 1077 * 設定されるのは、org.jfree.chart.renderer.category.BarRenderer を 1078 * 使用した描画のみです。 1079 * 棒グラフのバー幅指定は、直接、CategoryItemRendererState に設定しています。 1080 * 通常は、barMaxWidth(0.0~1.0)とbarItemMargin(0.0~1.0)を用いて比率で指定します。 1081 * 何も指定しない場合は、設定しません。 1082 * 1083 * @og.rev 4.0.3.0 (2008/01/07) 新規追加 1084 * 1085 * @param width BOXチャートのバー幅(double) 1086 */ 1087 public void setBarWidth( final String width ) { 1088 barWidth = width; 1089 } 1090 1091 /** 1092 * BOXチャートのバー幅(double)を取得します。 1093 * 1094 * 設定されるのは、org.jfree.chart.renderer.category.BarRenderer を 1095 * 使用した描画のみです。 1096 * 棒グラフのバー幅指定は、直接、CategoryItemRendererState に設定しています。 1097 * 通常は、barMaxWidth(0.0~1.0)とbarItemMargin(0.0~1.0)を用いて比率で指定します。 1098 * 何も指定しない場合は、設定しません。 1099 * 1100 * @og.rev 4.0.3.0 (2008/01/07) 新規追加 1101 * 1102 * @return BOXチャートのバー幅(double)の文字列 1103 */ 1104 protected String getBarWidth() { 1105 return barWidth ; 1106 } 1107 1108 /** 1109 * BOXチャートのバー幅の最大値(0.0~1.0)を指定します。 1110 * 1111 * BOXチャートのバー幅の比率の最大値を指定します。 1112 * 表示領域を1として小数点以下の数値で棒の幅を設定します。 1113 * 設定した幅に無理がある時は適当なサイズに調整されます。 1114 * (小さくしたときには棒が線のようになる) 1115 * 設定されるのは、org.jfree.chart.renderer.category.BarRenderer を 1116 * 使用した描画のみです。 1117 * 何も指定しない場合は、設定しません。 1118 * 1119 * @og.rev 4.0.2.0 (2007/12/20) 新規追加 1120 * 1121 * @param barWidth BOXチャートのバー幅の最大値(0.0~1.0) 1122 */ 1123 public void setBarMaxWidth( final String barWidth ) { 1124 maxBarWidth = barWidth; 1125 } 1126 1127 /** 1128 * BOXチャートのバーアイテムのマージン(0.0~1.0)を指定します。 1129 * 1130 * BOXチャートのバーアイテムのマージンの比率を指定します。 1131 * 棒の間を表示領域を1として小数点以下の数値で幅を設定します。 1132 * 無理がある時は適当なサイズに調整されます。 1133 * barMaxWidth より優先されます。 1134 * 設定されるのは、org.jfree.chart.renderer.category.BarRenderer を 1135 * 使用した描画のみです。 1136 * 何も指定しない場合は、設定しません。 1137 * 1138 * @og.rev 4.0.2.0 (2007/12/20) 新規追加 1139 * 1140 * @param margin BOXチャートのバーアイテムのマージン(0.0~1.0) 1141 */ 1142 public void setBarItemMargin( final String margin ) { 1143 itemMargin = margin; 1144 } 1145 1146 /** 1147 * 表示下限値(これ以下のデータは未表示)の値(double)を指定します。 1148 * 1149 * HybsLine でのみ使用可能です。 1150 * この設定値以下のデータは、存在しない扱いとします。 1151 * Lineを引くとき、このデータと、存在しているデータ間にラインは引かれません。 1152 * 何も指定しない場合は、設定しません。 1153 * 1154 * @og.rev 4.0.3.0 (2008/01/07) 新規追加 1155 * 1156 * @param limit 表示下限値(これ以下のデータは未表示) 1157 */ 1158 public void setVisibleLimit( final String limit ) { 1159 visibleLimit = limit; 1160 } 1161 1162 /** 1163 * グラフの書き出し位置の調整比率を指定します。 1164 * 1165 * グラフを描画する場合の、書き出し位置を少しずらします。 1166 * これは、グラフの幅に対して、比率で指定します。 1167 * 0.0(初期値)の場合は、初期描画位置である、CategoryAnchor.Middle と 1168 * 同じ箇所から、書き出されます。 1169 * 1.0 の場合、中心から、グラフ幅の半分が加算され、END位置に寄ります。 1170 * 同様に、-1.0 の場合は、グラフ幅の半分が減算され、START 位置になります。 1171 * つまり、中心から、グラフ幅の半分単位で、前方/後方にずらす事が出来ます。 1172 * 書き出し位置 = 中心(Middle) + (domainMargin)*幅/2 1173 * 初期値は、0.0(真ん中:MIDDLE)です。 1174 * 1175 * @og.rev 4.1.1.0 (2008/02/14) 新規追加 1176 * 1177 * @param margin グラフの書き出し位置の調整比率 1178 */ 1179 public void setDomainMargin( final double margin ) { 1180 domainMargin = margin; 1181 } 1182 1183 /** 1184 * 時刻を表す場合の表現の仕方を指定します(初期値:null)。 1185 * 1186 * HybsNumberAxis にオーバーライドする 時間を表示する DecimalFormat の内部クラスを利用するに当たり、 1187 * 時刻の表示方法を指定します。 1188 * 外部から与える数字は、連続している必要があるため、10進数です。 1189 * たとえば、1700 → 17:00 , 2150 → 21:30 という感じです。 1190 * 2400 を超えると日付違いになります。 1191 * 1192 * 英語表記(:)と日本語表記(時)の区別と、24時間を超える場合の表示方法によって、6種類のパターンが存在します。 1193 * E1:そのまま、24:00 となり、加算されていく。 1194 * E2:そのまま、0:00 に戻る。(日付は無視) 1195 * E3:そのまま、1 00:00 と日付が付与される。 1196 * H1:そのまま、24時00分 となり、加算されていく。 1197 * H2:そのまま、00時00分 に戻る。(日付は無視) 1198 * H3:そのまま、1日 00時00分 と日付が付与される。 1199 * 初期値は、使用しない(-1)です。 1200 * 1201 * @og.rev 5.5.2.1 (2012/05/07) 新規追加 1202 * 1203 * @param type 時刻の表示方法 [E1/E2/E3/H1/H2/H3] 1204 */ 1205 public void setTimeFormatType( final String type ) { 1206 timeFormatType = type; 1207 } 1208 1209 /** 1210 * ラベルの表示向きを縦にするかどうか[true/false]を指定します(初期値:false)。 1211 * 1212 * ChartCreate の rotationLabel は、角度を指定できましたが、NumberAxis では、 1213 * 縦にするかどうかの指定しかできません。 1214 * ここでは、true を指定するとラベルは、縦書きになります。 1215 * 初期値は、false(横書き)です。 1216 * 1217 * @og.rev 5.5.2.1 (2012/05/07) 新規追加 1218 * 1219 * @param useVLavels ラベルの表示向き [false:横書き/:true:縦書き] 1220 */ 1221 public void setUseVerticalLabels( final boolean useVLavels ) { 1222 useVerticalLabels = useVLavels; 1223 } 1224 1225 /** 1226 * カテゴリのカラー名指定があるかどうか[true/false]を指定します(初期値:false)。 1227 * 1228 * select category,series1,series2,series3,・・・,color from ・・・ の様に 1229 * 検索するSelect文の一番最後に、Color文字列を付けて、カテゴリのカラー名の指定を行う事が可能です。 1230 * つまり、useCategoryColor="true" を指定すると、最後のカラムは、Color文字列と認識して、 1231 * データ(シリーズとして)使われなくなります。 1232 * CategoryColor は、HybsColorBar と、HybsColorBar3D のみサポートされている機能ですが、 1233 * グラフ合成(例えば、HybsParetoLineなど)と同時に使用する場合、同じ select文や、DBTableModelを 1234 * 使った処理を行う場合、Color指定のカラムを無視する必要があります。 1235 * そういう場合(つまり、カテゴリカラーを使わない場合)に、共通のSelect文を指定する場合にも、true に 1236 * 設定して、Color文字列を無視するように指定します。 1237 * 1238 * 初期値は、false(指定しない)です。 1239 * 1240 * @og.rev 6.0.2.2 (2014/10/03) 新規追加 1241 * 1242 * @param useCateColor カテゴリのカラー名指定 [false:指定しない/true:指定する] 1243 */ 1244 public void setUseCategoryColor( final boolean useCateColor ) { 1245 useCategoryColor = useCateColor; 1246 } 1247 1248 /** 1249 * データ件数を返します。 1250 * 1251 * org.jfree.data.general.Dataset には、共通に利用できる件数取得のメソッドが定義されていません。 1252 * なので、個々のクラスごとに、取得します。 1253 * ChartFactory に持っているのは、このクラスで、Dataset の実態を作成している関係上、 1254 * 新しいクラスを追加時に、このメソッドの手直しが必要になるからです。 1255 * 1256 * @og.rev 6.9.7.0 (2018/05/14) データ0件の対応。 1257 * 1258 * @return データ件数 1259 */ 1260 public int getRowCount() { 1261 return ChartFactory.getRowCount( dataset ); 1262 } 1263 1264 /** 1265 * MeterPlot に必要な情報を設定します。 1266 * 1267 * これは、ChartDataset(このクラス)に必要な getterメソッドを用意して、 1268 * 利用側のクラス(ChartPlot_Pie) でセットすべきですが、メソッドが増えるので、 1269 * こちらに MeterPlotオブジェクトを渡して、メソッド数を減らそうとしているだけです。 1270 * 1271 * lowerBound は、最小値(low) 1272 * upperBound は、最大値(upp) 1273 * markValues 値,A,B,C 1274 * markOverColors GREEN,BLUE,YELLOW,RED 1275 * low-A⇒GREEN , A-B⇒BLUE , B-C⇒YELLOW , C-upp⇒RED で、MeterIntervalを指定します。 1276 * 1277 * shapeColors に、NeedlePaint,ValuePaint,TickPaint,TickLabelPaint,DialBackgroundPaint,DialOutlinePaint を指定できます。 1278 * 初期値は、BLACK,BLACK,BLACK,BLACK,透明,BLACK です。 1279 * needleType に、DialShape の指定キーワードとして、CHORD,CIRCLE,PIE が指定可能です。 1280 * 指定方法としては、taglib上で、chartType 指定時に、Meter_PIE などと指定します。 1281 * shapeScale は、MeterAngle(メーターの表示角度) を指定できます。 1282 * valueLabel は、MeterInterval の規定値(値,A,B,C) に対応した凡例ラベルです。 1283 * 1284 * @og.rev 5.7.8.0 (2014/07/04) 新規追加 1285 * @og.rev 6.3.6.0 (2015/08/16) System.arraycopy が使える箇所は、置き換えます。 1286 * 1287 * @return 値をセットし終わった、MeterPlotオブジェクト 1288 */ 1289 protected Plot makeMeterPlot() { 1290 final MeterPlot mplot = new MeterPlot(); 1291 1292 // 範囲(上限、下限)指定 1293 final double low= lowerBound == null ? 0.0 : Double.parseDouble( lowerBound ) ; 1294 final double upp= upperBound == null ? 100.0 : Double.parseDouble( upperBound ) ; 1295 mplot.setRange( new Range( low, upp ) ); 1296 1297 // markValues 値,A,B,C 1298 // markOverColors GREEN,BLUE,YELLOW,RED 1299 // low-A⇒GREEN , A-B⇒BLUE , B-C⇒YELLOW , C-upp⇒RED 1300 // 範囲の指定(MeterInterval)は、markValues に、2番目の値が設定された場合に行う。 1301 if( markValues != null && markValues.length > 1 ) { 1302 final int size = markValues.length ; 1303 if( markOverColors != null && size == markOverColors.length ) { 1304 1305 // BasicStroke に、大きな値を指定すると、開始位置がずれてしまう。 1306 final BasicStroke bs = new BasicStroke( 2.0F ); 1307 1308 // valueLabel は、markValues の規定値(A,B,C) に対応した凡例ラベルです。 1309 final String[] lbls = StringUtil.csv2Array( valueLabel ); 1310 final int lblSize = lbls.length ; 1311 int j = 0; // ラベルの配列番号 1312 1313 double st = low; 1314 for( int i=1; i<=size; i++ ) { 1315 final double en = i<size ? markValues[i] : upp ; 1316 final Color co1 = markOverColors[i-1]; 1317 final Color co2 = new Color( co1.getRed() , co1.getGreen() , co1.getBlue() , 128 ); // 透過色(半透明) 1318 final String lbl = j < lblSize ? lbls[j++] : "" ; 1319 mplot.addInterval( new MeterInterval( lbl, new Range( st, en ), co1, bs, co2 ) ); 1320 st = en ; 1321 } 1322 } 1323 else { 1324 final String errMsg = "Meter で、markValues を複数指定する場合は、同じ数のmarkOverColorsの指定が必要です。" 1325 + CR ; 1326 throw new HybsSystemException( errMsg ); 1327 } 1328 } 1329 1330 // TickSize を設定。null ならば、初期値を使うので、設定しない。 1331 if( tickSize != null ) { 1332 mplot.setTickSize( Double.parseDouble( tickSize ) ); 1333 } 1334 1335 // shapeColors に、NeedlePaint,ValuePaint,TickPaint,TickLabelPaint,DialBackgroundPaint,DialOutlinePaint を指定できます。 1336 // NeedlePaint , ValuePaint , TickPaint , TickLabelPaint , DialBackgroundPaint(=透明) , DialOutlinePaint 1337 final Color[] shCols = new Color[] { Color.BLACK , Color.BLACK , Color.BLACK , Color.BLACK , new Color(255, 255, 255, 0), Color.BLACK }; // 初期値 1338 if( shapeColors != null && shapeColors.length > 0 ) { 1339 // 6.3.6.0 (2015/08/16) System.arraycopy が使える箇所は、置き換えます。 1340 System.arraycopy( shapeColors,0,shCols,0,shapeColors.length ); // 6.3.6.0 (2015/08/16) 1341 } 1342 mplot.setNeedlePaint( shCols[0] ); // 針の色 1343 mplot.setValuePaint( shCols[1] ); // 値の色 1344 mplot.setTickPaint( shCols[2] ); // メモリの色 1345 mplot.setTickLabelPaint( shCols[3] ); // メモリの文字の色 1346 mplot.setDialBackgroundPaint( shCols[4] ); // 背景色 1347 mplot.setDialOutlinePaint( shCols[5] ); // セットしても、表示が変わらない。 1348 1349 // needleType 属性で、DialShape を指定できます。 1350 DialShape dshape = DialShape.CIRCLE ; // 初期値 1351 if( needleType != null ) { 1352 if( "CHORD".equalsIgnoreCase( needleType ) ) { dshape = DialShape.CHORD; } 1353 else if( "CIRCLE".equalsIgnoreCase( needleType ) ) { dshape = DialShape.CIRCLE; } // 初期値 1354 else if( "PIE".equalsIgnoreCase( needleType ) ) { dshape = DialShape.PIE; } 1355 } 1356 mplot.setDialShape( dshape ); // CHORD,CIRCLE,PIE 1357 1358 // shapeScale は、MeterAngle(メーターの表示角度) を指定 1359 if( shapeScale != null ) { 1360 mplot.setMeterAngle( Integer.parseInt( shapeScale ) ); 1361 } 1362 1363 // isLabelsVisible 指定 1364 mplot.setTickLabelsVisible( isLabelsVisible ); 1365 1366 // その他決め打ちの値設定 1367 // mplot.setValueFont(new Font("Arial", Font.BOLD, 14)); 1368 // mplot.setTickLabelFont(new Font("Arial", Font.BOLD, 14)); 1369 1370 mplot.setDataset( (ValueDataset)dataset ); 1371 return mplot; 1372 } 1373 1374 /** 1375 * ThermometerPlot に必要な情報を設定します。 1376 * 1377 * markValues 値,A,B 1378 * markOverColors GREEN,YELLOW,RED 1379 * xxx-low⇒GRAY , low-A⇒GREEN , A-B⇒YELLOW , B-upp⇒RED , upp-xxx⇒GRAY で、SubrangePaintを指定します。 1380 * markOverColors を指定しない場合は、ThermometerPlot.NORMAL , WARNING , CRITICAL が順に指定されます。 1381 * これは、GREEN,YELLOW,RED になります。 1382 * 1383 * shapeColors に、ValuePaint,ThermometerPaint(温度計の枠線),MercuryPaint を指定できます。 1384 * 1385 * @og.rev 5.7.8.0 (2014/07/04) 新規追加 1386 * @og.rev 6.3.6.0 (2015/08/16) System.arraycopy が使える箇所は、置き換えます。 1387 * 1388 * @return 値をセットし終わった、元のThermometerPlotオブジェクト 1389 */ 1390 protected Plot makeThermometerPlot() { 1391 final ThermometerPlot tplot = new ThermometerPlot(); 1392 1393 // 範囲(上限、下限)指定 1394 final double low= lowerBound == null ? 0.0 : Double.parseDouble( lowerBound ) ; 1395 final double upp= upperBound == null ? 100.0 : Double.parseDouble( upperBound ) ; 1396 tplot.setRange( low , upp ); 1397 1398 // markValues 値,A,B,C 1399 // markOverColors GREEN,YELLOW,RED 1400 // low-A⇒Red , A-B⇒Yellow , B-C⇒Green , C-upp⇒Blue 1401 // 範囲の指定(MeterInterval)は、markValues に、2番目の値が設定された場合に行う。 1402 if( markValues != null && markValues.length > 1 ) { 1403 final int size = markValues.length ; 1404 1405 // markOverColors が存在して、個数が一致していれば、true 1406 final boolean inCols = markOverColors != null && size == markOverColors.length ; 1407 if( inCols || markOverColors == null || markOverColors.length == 0 ) { 1408 double st = low; 1409 for( int i=1; i<=size; i++ ) { 1410 final double en = i<size ? markValues[i] : upp ; 1411 // 第一引数は、i(順番)ではなく、サブレンジ番号(ThermometerPlot.NORMAL , WARNING , CRITICAL) 1412 tplot.setSubrange( i-1, st, en ); 1413 1414 if( inCols ) { 1415 final Color co1 = markOverColors[i-1]; 1416 tplot.setSubrangePaint( i-1,co1 ); 1417 } 1418 st = en ; 1419 } 1420 } 1421 else { 1422 final String errMsg = "Meter で、markValues を複数指定する場合は、同じ数のmarkOverColorsの指定が必要です。" 1423 + CR ; 1424 throw new HybsSystemException( errMsg ); 1425 } 1426 } 1427 1428 // shapeColors に、ValuePaint,ThermometerPaint(温度計の枠線),MercuryPaint を指定できます。 1429 // ValuePaint , ThermometerPaint , MercuryPaint 1430 final Color[] shCols = new Color[] { Color.BLACK , Color.BLACK , Color.GRAY }; // 初期値 1431 if( shapeColors != null && shapeColors.length > 0 ) { 1432 // 6.3.6.0 (2015/08/16) System.arraycopy が使える箇所は、置き換えます。 1433 System.arraycopy( shapeColors,0,shCols,0,shapeColors.length ); // 6.3.6.0 (2015/08/16) 1434 } 1435 tplot.setValuePaint( shCols[0] ); // 値の色 1436 tplot.setThermometerPaint( shCols[1] ); // 温度計の枠線 1437 tplot.setMercuryPaint( shCols[2] ); // オーバー時の色 1438 1439 // tplot.setValueFont(new Font("Arial", 1, 14)); 1440 1441 tplot.setDataset( (ValueDataset)dataset ); 1442 return tplot; 1443 } 1444 1445 /** 1446 * CompassPlot に必要な情報を設定します。 1447 * 1448 * shapeColors に、Compassの色を指定できます。(内部的には、SeriesPaint にセットしています) 1449 * SeriesPaint,SeriesOutlinePaint,RoseCenterPaint,RoseHighlightPaint,RosePaint を指定します。 1450 * needleType には、MeterNeedle の指定キーワードとして、下記の9種類が指定可能です。 1451 * 指定は、Arrow,Line,Long,Pin,Plum,Pointer,Ship,Wind,Arrow,MiddlePin という文字列です。 1452 * 初期値は、Pointer です。 1453 * 1454 * @og.rev 5.7.8.0 (2014/07/04) 新規追加 1455 * @og.rev 6.3.6.0 (2015/08/16) System.arraycopy が使える箇所は、置き換えます。 1456 * 1457 * @return 値をセットし終わった、元のCompassPlotオブジェクト 1458 */ 1459 protected Plot makeCompassPlot() { 1460 final CompassPlot cplot = new CompassPlot(); 1461 1462 // Series 指定は、0 固定 1463 final int serNo = 0; 1464 1465 // needleType 属性で、SeriesNeedle 番号を指定できます。 1466 int sNeedle = 5 ; // Pointer 1467 if( needleType != null ) { 1468 if( "Arrow".equalsIgnoreCase( needleType ) ) { sNeedle = 0; } // 0 = ArrowNeedle; 1469 else if( "Line".equalsIgnoreCase( needleType ) ) { sNeedle = 1; } // 1 = LineNeedle; 1470 else if( "Long".equalsIgnoreCase( needleType ) ) { sNeedle = 2; } // 2 = LongNeedle; 1471 else if( "Pin".equalsIgnoreCase( needleType ) ) { sNeedle = 3; } // 3 = PinNeedle; 1472 else if( "Plum".equalsIgnoreCase( needleType ) ) { sNeedle = 4; } // 4 = PlumNeedle; 1473 else if( "Pointer".equalsIgnoreCase( needleType ) ) { sNeedle = 5; } // 5 = PointerNeedle; 1474 else if( "Ship".equalsIgnoreCase( needleType ) ) { sNeedle = 6; } // 6 = ShipNeedle; 1475 else if( "Wind".equalsIgnoreCase( needleType ) ) { sNeedle = 7; } // 7 = WindNeedle; 1476 else if( "Arrow".equalsIgnoreCase( needleType ) ) { sNeedle = 8; } // 8 = ArrowNeedle; 1477 else if( "MiddlePin".equalsIgnoreCase( needleType ) ) { sNeedle = 9; } // 9 = MiddlePinNeedle; 1478 } 1479 cplot.setSeriesNeedle( serNo, sNeedle ); 1480 1481 // shapeColors に、SeriesPaint,SeriesOutlinePaint,RoseCenterPaint,RoseHighlightPaint,RosePaint を指定 1482 // SeriesPaint, SeriesOutlinePaint , RoseCenter , RoseHighlight, Rose 1483 final Color[] shCols = new Color[] { Color.RED , Color.BLACK , Color.WHITE , Color.BLACK , Color.YELLOW }; // 初期値 1484 if( shapeColors != null && shapeColors.length > 0 ) { 1485 // 6.3.6.0 (2015/08/16) System.arraycopy が使える箇所は、置き換えます。 1486 System.arraycopy( shapeColors,0,shCols,0,shapeColors.length ); // 6.3.6.0 (2015/08/16) 1487 } 1488 cplot.setSeriesPaint( serNo, shCols[0] ); // 針の色 1489 cplot.setSeriesOutlinePaint( serNo, shCols[1] ); // 針の枠の色 1490 cplot.setRoseCenterPaint( shCols[2] ); // 文字盤の中心の 1491 cplot.setRoseHighlightPaint( shCols[3] ); // 文字盤の文字、枠色 1492 cplot.setRosePaint( shCols[4] ); // 枠の塗りつぶし色 1493 1494 cplot.addDataset( (ValueDataset)dataset ); 1495 1496 return cplot; 1497 } 1498 1499 /** 1500 * HybsNumberAxis にオーバーライドする 時間を表示する DecimalFormat の内部クラスを定義します。 1501 * 1502 * これは、ChartPlot_XY で使用する、HybsNumberAxis に対して、拡張します。 1503 * データが、時刻を表す場合、Date型のオブジェクトを利用して、org.jfree.chart.axis.PeriodAxis 1504 * を利用できればよいのですが、単なる数字で扱っているケースがあり、時刻に内部的に 1505 * 変換するケースで使います。 1506 * 外部から与える数字は、連続している必要があるため、10進数です。 1507 * たとえば、1700 → 17:00 , 2150 → 21:30 という感じです。 1508 * 24時間を超える場合は、 1509 * Type1:そのまま、0:00 に戻る。 1510 * Type2:そのまま、24:00 と、そのまま、加算されていく。 1511 * の2種類が用意されています。 1512 * 1513 * @og.rev 5.5.2.1 (2012/05/07) 新規追加 1514 * 1515 */ 1516 private static final class HybsTimeFormat extends DecimalFormat { 1517 /** For serialization. */ 1518 private static final long serialVersionUID = 201205075512L ; 1519 1520 private final boolean is24repeat ; 1521 private final boolean useDay ; 1522 1523 private final int hsCode ; 1524 1525 /** 1526 * コンストラクター 1527 * 1528 * 引数に、時刻を表す場合の表現の仕方を指定します。 1529 * E1:そのまま、24:00 となり、加算されていく。 1530 * E2:そのまま、0:00 に戻る。(日付は無視) 1531 * E3:そのまま、1 00:00 と日付が付与される。 1532 * H1:そのまま、24時00分 となり、加算されていく。 1533 * H2:そのまま、00時00分 に戻る。(日付は無視) 1534 * H3:そのまま、1日 00時00分 と日付が付与される。 1535 * 1536 * @param inType 時刻の表示方法 [E1/E2/E3/H1/H2/H3] 1537 */ 1538 public HybsTimeFormat( final String inType ) { 1539 super(); 1540 1541 final DecimalFormatSymbols sym = new DecimalFormatSymbols(); 1542 if( "E1".equals( inType ) ) { 1543 applyPattern( "#0.00" ); 1544 sym.setDecimalSeparator( ':' ); 1545 is24repeat = false; useDay = false; 1546 } 1547 else if( "E2".equals( inType ) ) { 1548 applyPattern( "#0.00" ); 1549 sym.setDecimalSeparator( ':' ); 1550 is24repeat = true; useDay = false; 1551 } 1552 else if( "E3".equals( inType ) ) { 1553 applyPattern( "#,#0.00" ); 1554 sym.setDecimalSeparator( ':' ); 1555 sym.setGroupingSeparator( ' ' ); 1556 is24repeat = true; useDay = true; 1557 } 1558 else if( "H1".equals( inType ) ) { 1559 applyPattern( "#0.00分" ); 1560 sym.setDecimalSeparator( '時' ); 1561 is24repeat = false; useDay = false; 1562 } 1563 else if( "H2".equals( inType ) ) { 1564 applyPattern( "#0.00分" ); 1565 sym.setDecimalSeparator( '時' ); 1566 is24repeat = true; useDay = false; 1567 } 1568 else if( "H3".equals( inType ) ) { 1569 applyPattern( "#,#0.00分" ); 1570 sym.setDecimalSeparator( '時' ); 1571 sym.setGroupingSeparator( '日' ); 1572 is24repeat = true; useDay = true; 1573 } 1574 else { 1575 final String errMsg = "timeFormatType は、(E1/E2/E3/H1/H2/H3) から指定してください。timeFormatType=[" + inType + "]" ; 1576 throw new HybsSystemException( errMsg ); 1577 } 1578 setDecimalFormatSymbols( sym ); 1579 1580 hsCode = super.hashCode() + Boolean.valueOf(is24repeat).hashCode() + Boolean.valueOf(useDay).hashCode(); 1581 } 1582 1583 /** 1584 * double をフォーマットして文字列を作成します。 1585 * 1586 * ( DecimalFormat#format(double,StringBuffer,FieldPosition) のオーバーライド ) 1587 * 1588 * timeFormatType によって、データの処理が変わります。 1589 * E1:そのまま、24:00 となり、加算されていく。 1590 * E2:そのまま、0:00 に戻る。(日付は無視) 1591 * E3:そのまま、1 00:00 と日付が付与される。 1592 * H1:そのまま、24時00分 となり、加算されていく。 1593 * H2:そのまま、00時00分 に戻る。(日付は無視) 1594 * H3:そのまま、1日 00時00分 と日付が付与される。 1595 * 1596 * @param number フォーマットする double 1597 * @param result テキストを追加する位置 1598 * @param fieldPos 入力では、必要であれば位置合わせフィールド。 出力では、その位置合わせフィールドのオフセット 1599 * @return フォーマットされた数値文字列 1600 */ 1601 @Override 1602 public StringBuffer format( final double number, final StringBuffer result, final FieldPosition fieldPos ) { 1603 int hour = (int)(number/100); // 時間のみ取り出す。 1604 if( is24repeat ) { hour = hour%24; } // 24時間を超えた場合、余りのみ使用する。 1605 1606 final int minute = (int)((number%100)*0.6); // 0.6 = 60/100 の事。100 が 60分 となる。 1607 1608 double timeVal = hour + minute/100.0 ; 1609 if( useDay ) { timeVal = timeVal + (int)(number/24) ; } // 端数を切り捨てた日付に対して、100倍しておく。 1610 return super.format( timeVal, result, fieldPos ); 1611 } 1612 1613 /** 1614 * このオブジェクトと指定されたオブジェクトを比較します。 1615 * 1616 * @og.rev 5.5.2.4 (2012/05/16) 新規追加 findbug対応 1617 * 1618 * @param anObject 比較されるオブジェクト 1619 * @return 指定されたオブジェクトが等しい場合は true、そうでない場合は false 1620 */ 1621 @Override 1622 public boolean equals( final Object anObject ) { 1623 return this == anObject; 1624 } 1625 1626 /** 1627 * このオブジェクトのハッシュコードを取得します。 1628 * 1629 * @og.rev 5.5.2.4 (2012/05/16) 新規追加 findbug対応 1630 * 1631 * @return ハッシュコード 1632 */ 1633 @Override 1634 public int hashCode() { 1635 return hsCode; 1636 } 1637 } 1638 1639 /** 1640 * このオブジェクトの文字列表現を返します。 1641 * 基本的にデバッグ目的に使用します。 1642 * 1643 * @return このクラスの文字列表現 1644 * @og.rtnNotNull 1645 */ 1646 @Override 1647 public String toString() { 1648 1649 // 6.0.2.5 (2014/10/31) char を append する。 1650 final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE ) 1651 .append( '[' ).append( this.getClass().getName() ).append( ']' ).append( CR ) 1652 .append( "chartType [" ).append( chartType ).append( ']' ).append( CR ) 1653 .append( "valueLabel [" ).append( valueLabel ).append( ']' ).append( CR ) 1654 .append( "markValues [" ).append( Arrays.toString( markValues ) ).append( ']' ).append( CR ) 1655 .append( "markColors [" ).append( Arrays.toString( markColors ) ).append( ']' ).append( CR ) 1656 .append( "lowerBound [" ).append( lowerBound ).append( ']' ).append( CR ) 1657 .append( "upperBound [" ).append( upperBound ).append( ']' ).append( CR ) 1658 .append( "useGradient [" ).append( useGradient ).append( ']' ).append( CR ) 1659 .append( "shapesVisible [" ).append( shapesVisible ).append( ']' ).append( CR ) 1660 .append( "useDottedLine [" ).append( useDottedLine ).append( ']' ).append( CR ); 1661 1662 return rtn.toString(); 1663 } 1664}