|
|
JFreeChart を使ったグラフ作成 タイトルの設定 |
H.Kamifuji . |
グラフのタイトルを設定する方法を確認していきます。グラフにはタイトルとサブタイトルを設定することが可能です。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 に、jfreechart-1.5.5 にアップされています。一部、上位互換について、見直しを行っていきます。 .png 画像データ作成時に実行時エラーが発生する。jfreechart-1.0.19 で、実行してください。 現在(2024/10)では、JDK-23 に、アップされています。JDK-23 + jfreechart-1.0.19 で、上位互換について、見直しを行っていきます。 |
JFreeChartでタイトルを取り扱うためにTextTitleクラスが用意されています。 TextTitleクラスのクラス図は次のようになっています。 java.lang.Object | +-- org.jfree.chart.block.AbstractBlock | +-- org.jfree.chart.title.Title | +-- org.jfree.chart.title.TextTitle public class TextTitle extends Title implements java.io.Serializable, java.lang.Cloneable, org.jfree.util.PublicCloneable用意されているコンストラクタは次の4つです。
TextTitleクラスでは表示する文字列の他にフォントの指定や背景の設定、位置関係などが指定可能となっています。ここでは基本となる2番目のコンストラクタを見てみます。 1番目のコンストラクタは系列の名前だけを指定します。このコンストラクタの場合、時間の単位はデフォルトの値である「日」になります。通常は系列の名前と時間の単位を指定する2番目のコンストラクタを使用します。 TextTitle public TextTitle(java.lang.String text)Creates a new title, using default attributes where necessary. Parameters: text - the title text (null not permitted). 引数にタイトルとして表示する文字列を指定します。 例えば次のように記述します。 TextTitle title = new TextTitle("タイトル");これでTextTitleクラスのオブジェクトが作成できました。このオブジェクトに対して用意されたメソッドを使い設定を行っていきます。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * TextTitleクラス */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; public class Test1_1 extends JFrame{ public static void main(String[] args) { Test1_1 frame = new Test1_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test1_1(){ JFreeChart chart = ChartFactory.createPieChart("夏の旅行", createData(), true, false, false); TextTitle title = new TextTitle("Summer Travel"); chart.setTitle(title); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() |
作成したタイトルをグラフに設定するにはJFreeChartクラスで用意されている「setTitle」メソッドを使います。 setTitle public void setTitle(TextTitle title)Sets the main title for the chart and sends a ChartChangeEvent to all registered listeners. If you do not want a title for the chart, set it to null. If you want more than one title on a chart, use the addSubtitle(Title) method. Parameters: title - the title (null permitted). 引数にはTextTitleクラスのオブジェクトを指定します。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); chart.setTitle(title);また単に文字列を指定してタイトルを設定する場合にはJFreeChartクラスで用意されている「setTitle」メソッドを使います。先ほどのメソッドと同じですが引数が異なります。 setTitle public void setTitle(java.lang.String text)Sets the chart title and sends a ChartChangeEvent to all registered listeners. This is a convenience method that ends up calling the setTitle(TextTitle) method. If there is an existing title, its text is updated, otherwise a new title using the default font is added to the chart. If text is null the chart title is set to null. Parameters: text - the title text (null permitted). 引数にはタイトルに設定する文字列を指定します。このメソッドは引数に指定した文字列を使って内部的にTextTitleクラスのオブジェクトを作成し、デフォルトの設定を行った後でタイトルに設定します。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 chart.setTitle("タイトル文字列"); タイトルの取得現在グラフに設定されているタイトルを取得するにはJFreeChartクラスで用意されている「getTitle」メソッドを使います。getTitle public TextTitle getTitle()Returns the main chart title. Very often a chart will have just one title, so we make this case simple by providing accessor methods for the main title. However, multiple titles are supported - see the addSubtitle(Title) method. Returns: The chart title (possibly null). メソッドを実行すると、現在タイトルとして設定されているTextTitleクラスのオブジェクトを取得します。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = chart.getTitle();既に設定してあるタイトルを取得し変更を加えたい場合に使用できます。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * タイトルの取得と設定(setTitle, getTitle) */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; public class Test2_1 extends JFrame{ public static void main(String[] args) { Test2_1 frame = new Test2_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test2_1(){ JFreeChart chart = ChartFactory.createPieChart("夏の旅行", createData(), true, false, false); chart.setTitle("Summer Travel"); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() |
既存のタイトルを取得したり新規にTextTitleクラスのオブジェクトを作成した時に、タイトルとして表示される文字列を設定する方法を確認します。TextTitleクラスで用意されている「setText」メソッドを使います。 setText public void setText(java.lang.String text)Sets the title to the specified text and sends a TitleChangeEvent to all registered listeners. Parameters: text - the text (null not permitted). 引数にはタイトルとして表示する文字列を設定します。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); title.setText("Title"); chart.setTitle(title);またTextTitleクラスのオブジェクトに設定されている文字列を取得するにはTextTitleクラスで用意されている「getText」メソッドを使用します。 getText public java.lang.String getText()Returns the title text. Returns: The text (never null). メソッドを実行するとタイトルに設定されている文字列を取得できます。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = chart.getTitle(); String str = title.getText();では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * タイトル文字列の取得と設定(setText, getText) */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; public class Test3_1 extends JFrame{ public static void main(String[] args) { Test3_1 frame = new Test3_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test3_1(){ JFreeChart chart = ChartFactory.createPieChart("夏の旅行", createData(), true, false, false); TextTitle title = chart.getTitle(); String str = title.getText(); chart.setTitle(str + "2008"); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() |
タイトルとして表示される文字列のフォントを設定する方法を確認します。TextTitleクラスで用意されている「setFont」メソッドを使います。 setFont public void setFont(java.awt.Font font)Sets the font used to display the title string. Registered listeners are notified that the title has been modified. Parameters: font - the new font (null not permitted). 引数にはFontクラスの文字列を指定します。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); title.setFont(new Font("MS 明朝", Font.BOLD | Font.ITALIC, 24)); chart.setTitle(title);Fontクラスの詳細な使い方については「Fontクラス」を参照して下さい。 なおTextTitleクラスのコンストラクタの1つにもフォントを指定可能なものがあります。 TextTitle public TextTitle(java.lang.String text, java.awt.Font font)Creates a new title, using default attributes where necessary. Parameters: text - the title text (null not permitted). font - the title font (null not permitted). 1番目の引数でタイトルとして表示する文字列を指定し、2番目の引数でフォントを指定します。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * フォントの設定(setFont) */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; import java.awt.Font; public class Test4_1 extends JFrame{ public static void main(String[] args) { Test4_1 frame = new Test4_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test4_1(){ JFreeChart chart = ChartFactory.createPieChart("", createData(), true, false, false); TextTitle title = new TextTitle("夏の旅行"); title.setFont(new Font("MS 明朝", Font.BOLD | Font.ITALIC, 38)); chart.setTitle(title); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() |
タイトルの前景色を設定する方法を確認します。TextTitleクラスで用意されている「setPaint」メソッドを使います。 setPaint public void setPaint(java.awt.Paint paint)Sets the paint used to display the title string. Registered listeners are notified that the title has been modified. Parameters: paint - the new paint (null not permitted). 引数にはPaintインターフェースを実装したクラスのオブジェクトを指定します。いくつかのクラスが用意されていますが、今回はColorクラスを使って文字の色を設定してみます。Colorクラスについての詳細は「Colorクラス」を参照して下さい。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); title.setFont(new Font("MS 明朝", Font.BOLD | Font.ITALIC, 24)); title.setPaint(Color.RED); chart.setTitle(title);では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * 前景色の設定(setPaint) */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; import java.awt.Font; import java.awt.Color; public class Test5_1 extends JFrame{ public static void main(String[] args) { Test5_1 frame = new Test5_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test5_1(){ JFreeChart chart = ChartFactory.createPieChart("", createData(), true, false, false); TextTitle title = new TextTitle("夏の旅行"); title.setFont(new Font("MS 明朝", Font.BOLD | Font.ITALIC, 38)); title.setPaint(Color.RED); chart.setTitle(title); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() |
タイトルの背景色を設定する方法を確認します。TextTitleクラスで用意されている「setBackgroundPaint」メソッドを使います。 setBackgroundPaint public void setBackgroundPaint(java.awt.Paint paint)Sets the background paint and sends a TitleChangeEvent to all registered listeners. If you set this attribute to null, no background is painted (which makes the title background transparent). Parameters: paint - the background paint (null permitted). 引数にはPaintインターフェースを実装したクラスのオブジェクトを指定します。Paintインターフェースを実装している主なクラスは以下の通りです。
今回はColorクラスを使って文字の色を設定してみます。Colorクラスについての詳細は「Colorクラス」を参照して下さい。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); title.setBackgroundPaint(Color.BLUE); chart.setTitle(title);では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * 背景色の設定(setBackgroundPaint) */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; import java.awt.Font; import java.awt.Color; public class Test6_1 extends JFrame{ public static void main(String[] args) { Test6_1 frame = new Test6_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test6_1(){ JFreeChart chart = ChartFactory.createPieChart("", createData(), true, false, false); TextTitle title = new TextTitle("夏の旅行"); title.setFont(new Font("MS 明朝", Font.BOLD | Font.ITALIC, 38)); title.setBackgroundPaint(Color.RED); chart.setTitle(title); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() |
タイトルの背景にグラデーションを設定する方法を確認します。背景色の場合と同じくTextTitleクラスで用意されている「setBackgroundPaint」メソッドを使います。 グラデーションの設定は様々な方法があります。詳しくは「色属性の設定」を確認して下さい。今回は例としてPaintインターフェースを実装したGradientPaintクラスを使ってみます。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); GradientPaint gradient = new GradientPaint( 50.0f, 50.0f, Color.PINK, 190.0f, 110.0f, Color.ORANGE ); title.setBackgroundPaint(gradient); chart.setTitle(title);では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * 背景にグラデーションを設定 */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; import java.awt.Font; import java.awt.Color; import java.awt.GradientPaint; public class Test7_1 extends JFrame{ public static void main(String[] args) { Test7_1 frame = new Test7_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test7_1(){ JFreeChart chart = ChartFactory.createPieChart("", createData(), true, false, false); TextTitle title = new TextTitle("夏の旅行"); title.setFont(new Font("MS 明朝", Font.BOLD | Font.ITALIC, 38)); GradientPaint gradient = new GradientPaint( 200.0f, 2.0f, Color.WHITE, 500.0f, 40.0f, Color.BLUE ); title.setBackgroundPaint(gradient); chart.setTitle(title); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() グラデーションの色の位置はタイトルではなくグラフ全体を基準に位置を指定する必要があります。 |
タイトルの背景をテクスチャーを使って塗りつぶす方法を確認します。背景色の場合と同じくTextTitleクラスで用意されている「setBackgroundPaint」メソッドを使います。 テクスチャーによる塗りつぶしについてはTexturePaintクラスを使用します。詳しくは「色属性の設定i」を確認して下さい。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB); File f = new File("./ball.png"); try { img = ImageIO.read(f); }catch (IOException ex){ ex.printStackTrace(); } Rectangle2D.Double rec = new Rectangle2D.Double(0, 0, img.getWidth(), img.getHeight()); title.setBackgroundPaint(new TexturePaint(img, rec)); chart.setTitle(title);では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * 背景にテクスチャーを設定 */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; import java.awt.Font; import java.awt.TexturePaint; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import java.io.IOException; import java.awt.geom.Rectangle2D; public class Test8_1 extends JFrame{ public static void main(String[] args) { Test8_1 frame = new Test8_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test8_1(){ JFreeChart chart = ChartFactory.createPieChart("", createData(), true, false, false); TextTitle title = new TextTitle("夏の旅行"); title.setFont(new Font("MS 明朝", Font.BOLD | Font.ITALIC, 38)); BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB); File f = new File("./ball.png"); try { img = ImageIO.read(f); }catch (IOException ex){ ex.printStackTrace(); } Rectangle2D.Double rec = new Rectangle2D.Double(0, 0, img.getWidth(), img.getHeight()); title.setBackgroundPaint(new TexturePaint(img, rec)); chart.setTitle(title); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() 今回読み込んだ画像は次のような画像です。 ![]() |
タイトルはデフォルトではグラフの上部に表示されていますが、表示する位置を指定することが可能です。位置を設定するにはTextTitleクラスの親クラスである「org.jfree.chart.title.Title」で用意されている「setPosition」メソッドを使います。 setPosition public void setPosition(org.jfree.ui.RectangleEdge position)Sets the position for the title and sends a TitleChangeEvent to all registered listeners. Parameters: position - the position (null not permitted). 引数には「org.jfree.ui.RectangleEdge」クラスのオブジェクトを指定します。このクラスでは次の4つのstaticフィールドが用意されていますのでいずれかを指定します。 RectangleEdge.BOTTOM 画面上部 RectangleEdge.LEFT 画面左辺 RectangleEdge.RIGHT 画面右辺 RectangleEdge.TOP 画面下部例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); title.setPosition(RectangleEdge.BOTTOM); chart.setTitle(title);上記の場合はグラフの下部にタイトルが表示されます。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * タイトルの位置の設定(setPosition) */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; import java.awt.Font; import org.jfree.ui.RectangleEdge; public class Test9_1 extends JFrame{ public static void main(String[] args) { Test9_1 frame = new Test9_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test9_1(){ JFreeChart chart = ChartFactory.createPieChart("", createData(), true, false, false); TextTitle title = new TextTitle("夏の旅行"); title.setFont(new Font("MS 明朝", Font.PLAIN, 28)); // title.setPosition(RectangleEdge.TOP); title.setPosition(RectangleEdge.BOTTOM); // title.setPosition(RectangleEdge.LEFT); // title.setPosition(RectangleEdge.RIGHT); chart.setTitle(title); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }JDK-23 + jfreechart-1.5.5 では、下記のエラーが発生しました。 [xxxxxxxx@dddddddddd Wrapper_class]$ javac JSample4_1.java Test9_1.java:38: エラー: クラス Titleのメソッド setPositionは指定された型に適用できません。 title.setPosition(RectangleEdge.BOTTOM); ^ 期待値: org.jfree.chart.ui.RectangleEdge 検出値: org.jfree.ui.RectangleEdge 理由: 引数の不一致: org.jfree.ui.RectangleEdgeをorg.jfree.chart.ui.RectangleEdgeに変換できません: [xxxxxxxx@dddddddddd Wrapper_class]$上記をコンパイルした後で実行すると次のように表示されます。 ![]() 今回はRectangleEdge.BOTTOMを指定した場合です。なお他の位置を指定した場合は次のようになります。実行結果だけ表示します。 RectangleEdge.TOP : ![]() RectangleEdge.LEFT : ![]() RectangleEdge.RIGHT : ![]() |
タイトルを上部又は下部に設置した場合、タイトル文字列の水平方向の位置を指定することが可能です。水平位置を設定するにはTextTitleクラスの親クラスである「org.jfree.chart.title.Title」で用意されている「setHorizontalAlignment」メソッドを使います。 setHorizontalAlignment public void setHorizontalAlignment(org.jfree.ui.HorizontalAlignment alignment)Sets the horizontal alignment for the title and sends a TitleChangeEvent to all registered listeners. Parameters: alignment - the horizontal alignment (null not permitted). 引数には「org.jfree.ui.HorizontalAlignment」クラスのオブジェクトを指定します。このクラスでは次の3つのstaticフィールドが用意されていますのでいずれかを指定します。 HorizontalAlignment.CENTER 中央 HorizontalAlignment.LEFT 左 HorizontalAlignment.RIGHT 右例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); title.setPosition(RectangleEdge.BOTTOM); title.setHorizontalAlignment(HorizontalAlignment.RIGHT); chart.setTitle(title);上記の場合はグラフの下部の右側にタイトルが表示されます。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * タイトル文字列の水平位置(setHorizontalAlignment) */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; import java.awt.Font; import org.jfree.ui.RectangleEdge; import org.jfree.ui.HorizontalAlignment; public class Test10_1 extends JFrame{ public static void main(String[] args) { Test10_1 frame = new Test10_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test10_1(){ JFreeChart chart = ChartFactory.createPieChart("", createData(), true, false, false); TextTitle title = new TextTitle("夏の旅行"); title.setFont(new Font("MS 明朝", Font.PLAIN, 28)); title.setPosition(RectangleEdge.BOTTOM); // title.setHorizontalAlignment(HorizontalAlignment.CENTER); // title.setHorizontalAlignment(HorizontalAlignment.LEFT); title.setHorizontalAlignment(HorizontalAlignment.RIGHT); chart.setTitle(title); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }JDK-23 + jfreechart-1.5.5 では、下記のエラーが発生しました。 [xxxxxxxx@dddddddddd Wrapper_class]$ javac JSample4_1.java t10_1.java:38: エラー: クラス Titleのメソッド setPositionは指定された型に適用できません。 title.setPosition(RectangleEdge.BOTTOM); ^ 期待値: org.jfree.chart.ui.RectangleEdge 検出値: org.jfree.ui.RectangleEdge 理由: 引数の不一致: org.jfree.ui.RectangleEdgeをorg.jfree.chart.ui.RectangleEdgeに変換できません: Test10_1.java:41: エラー: クラス Titleのメソッド setHorizontalAlignmentは指定された型に適用できません。 title.setHorizontalAlignment(HorizontalAlignment.RIGHT); ^ 期待値: org.jfree.chart.ui.HorizontalAlignment 検出値: org.jfree.ui.HorizontalAlignment 理由: 引数の不一致: org.jfree.ui.HorizontalAlignmentをorg.jfree.chart.ui.HorizontalAlignmentに変換できません: [xxxxxxxx@dddddddddd Wrapper_class]$上記をコンパイルした後で実行すると次のように表示されます。 ![]() 今回はHorizontalAlignment.RIGHTを指定した場合です。なお他の位置を指定した場合は次のようになります。実行結果だけ表示します。 HorizontalAlignment.CENTER : ![]() HorizontalAlignment.LEFT : ![]() |
タイトルを右辺又は左辺に設置した場合、タイトル文字列の垂直方向の位置を指定することが可能です。垂直位置を設定するにはTextTitleクラスの親クラスである「org.jfree.chart.title.Title」で用意されている「setVerticalAlignment」メソッドを使います。 setVerticalAlignment public void setVerticalAlignment(org.jfree.ui.VerticalAlignment alignment)Sets the vertical alignment for the title, and notifies any registered listeners of the change. Parameters: alignment - the new vertical alignment (TOP, MIDDLE or BOTTOM, null not permitted). 引数には「org.jfree.ui.VerticalAlignment」クラスのオブジェクトを指定します。このクラスでは次の3つのstaticフィールドが用意されていますのでいずれかを指定します。 VerticalAlignment.CENTER 中央 VerticalAlignment.TOP 上 VerticalAlignment.BOTTOM 下例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); title.setPosition(RectangleEdge.RIGHT); title.setVerticalAlignment(VerticalAlignment.BOTTOM); chart.setTitle(title);上記の場合はグラフの右辺の下側にタイトルが表示されます。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * タイトル文字列の垂直位置(setVerticalAlignment) */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; import java.awt.Font; import org.jfree.ui.RectangleEdge; import org.jfree.ui.VerticalAlignment; public class Test11_1 extends JFrame{ public static void main(String[] args) { Test11_1 frame = new Test11_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test11_1(){ JFreeChart chart = ChartFactory.createPieChart("", createData(), true, false, false); TextTitle title = new TextTitle("夏の旅行"); title.setFont(new Font("MS 明朝", Font.PLAIN, 28)); title.setPosition(RectangleEdge.RIGHT); // title.setVerticalAlignment(VerticalAlignment.CENTER); // title.setVerticalAlignment(VerticalAlignment.TOP); title.setVerticalAlignment(VerticalAlignment.BOTTOM); chart.setTitle(title); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }JDK-23 + jfreechart-1.5.5 では、下記のエラーが発生しました。 [xxxxxxxx@dddddddddd Wrapper_class]$ javac JSample4_1.java Test11_1.java:38: エラー: クラス Titleのメソッド setPositionは指定された型に適用できません。 title.setPosition(RectangleEdge.RIGHT); ^ 期待値: org.jfree.chart.ui.RectangleEdge 検出値: org.jfree.ui.RectangleEdge 理由: 引数の不一致: org.jfree.ui.RectangleEdgeをorg.jfree.chart.ui.RectangleEdgeに変換できません: Test11_1.java:41: エラー: クラス Titleのメソッド setVerticalAlignmentは指定された型に適用できません。 title.setVerticalAlignment(VerticalAlignment.BOTTOM); ^ 期待値: org.jfree.chart.ui.VerticalAlignment 検出値: org.jfree.ui.VerticalAlignment 理由: 引数の不一致: org.jfree.ui.VerticalAlignmentをorg.jfree.chart.ui.VerticalAlignmentに変換できません: [xxxxxxxx@dddddddddd Wrapper_class]$上記をコンパイルした後で実行すると次のように表示されます。 ![]() 今回はVerticalAlignment.BOTTOMを指定した場合です。なお他の位置を指定した場合は次のようになります。実行結果だけ表示します。 VerticalAlignment.CENTER : ![]() VerticalAlignment.TOP : ![]() |
タイトル内における文字列のパディングを設定することが可能です。パディングを設定するにはTextTitleクラスの親クラスである「org.jfree.chart.block.AbstractBlock」で用意されている「setPadding」メソッドを使います。 setPadding public void setPadding(double top, double left, double bottom, double right)Sets the padding. Parameters: top - the top padding. left - the left padding. bottom - the bottom padding. right - the right padding. 引数には上左下右のパディングのサイズをdouble型の値でそれぞれ指定します。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); title.setPadding(2d, 2d, 2d, 2d); chart.setTitle(title);上記の場合は文字列の周りにそれぞれ2ピクセルのパディングを設定します。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * パディングの設定(setPadding) */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; import java.awt.Font; import java.awt.Color; public class Test12_1 extends JFrame{ public static void main(String[] args) { Test12_1 frame = new Test12_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test12_1(){ JFreeChart chart = ChartFactory.createPieChart("", createData(), true, false, false); TextTitle title = new TextTitle("夏の旅行"); title.setFont(new Font("MS 明朝", Font.PLAIN, 28)); title.setBackgroundPaint(Color.WHITE); title.setPadding(5d, 5d, 5d, 5d); chart.setTitle(title); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() 今回はパディングのサイズを上下左右5ピクセルに設定しています。比較の為、20ピクセルにしたものが次のグラフとなります。 ![]() |
タイトルをグラフ内に表示する時に、タイトルのマージンを設定することが可能です。マージンを設定するにはTextTitleクラスの親クラスである「org.jfree.chart.block.AbstractBlock」で用意されている「setMargin」メソッドを使います。 setMargin public void setMargin(double top, double left, double bottom, double right)Sets the margin. Parameters: top - the top margin. left - the left margin. bottom - the bottom margin. right - the right margin. 引数には上左下右のマージンのサイズをdouble型の値でそれぞれ指定します。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); title.setMargin(2d, 2d, 2d, 2d); chart.setTitle(title);上記の場合は文字列の周りにそれぞれ2ピクセルのマージンを設定します。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * マージンの設定(setMargin) */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; import java.awt.Font; import java.awt.Color; public class Test13_1 extends JFrame{ public static void main(String[] args) { Test13_1 frame = new Test13_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test13_1(){ JFreeChart chart = ChartFactory.createPieChart("", createData(), true, false, false); TextTitle title = new TextTitle("夏の旅行"); title.setFont(new Font("MS 明朝", Font.PLAIN, 28)); title.setBackgroundPaint(Color.WHITE); title.setMargin(5d, 0d, 5d, 0d); chart.setTitle(title); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() 今回はマージンのサイズを上下5ピクセルに設定しています。比較の為、上下20ピクセルにしたものが次のグラフとなります。 ![]() |
タイトルに枠線を設定する方法を確認します。いくつかの方法が用意されていますので順に確認していきます。 1番目の方法はTextTitleクラスの親クラスである「org.jfree.chart.block.AbstractBlock」で用意されている「setBorder」メソッドを使います。 setBorder public void setBorder(double top, double left, double bottom, double right)Sets a black border with the specified line widths. Parameters: top - the top border line width. left - the left border line width. bottom - the bottom border line width. right - the right border line width. 引数には上左下右の枠線の太さをdouble型の値でそれぞれ指定します。このメソッドを使用する場合は枠線の色は黒になります。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); title.setBorder(2d, 2d, 2d, 2d); chart.setTitle(title);上記の場合は太さが2ピクセルの枠線を設定します。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * 枠線の設定(setBorder, setFrame) */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; import java.awt.Font; import java.awt.Color; public class Test14_1 extends JFrame{ public static void main(String[] args) { Test14_1 frame = new Test14_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test14_1(){ JFreeChart chart = ChartFactory.createPieChart("", createData(), true, false, false); TextTitle title = new TextTitle("夏の旅行"); title.setFont(new Font("MS 明朝", Font.PLAIN, 28)); title.setMargin(5d, 0d, 5d, 0d); title.setBorder(2d, 2d, 2d, 2d); chart.setTitle(title); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() 枠線の色を指定する2番目の方法はTextTitleクラスの親クラスである「org.jfree.chart.block.AbstractBlock」で用意されている「setFrame」メソッドを使います。setFrame public void setFrame(BlockFrame frame)Sets the frame (or border). Parameters: frame - the frame (null not permitted). 引数にはBlockFrameインターフェースを実装したクラスのオブジェクトを指定します。実装クラスとしては「org.jfree.chart.block.BlockBorder」と「org.jfree.chart.block.LineBorder」の2つがあり、今回は「org.jfree.chart.block.BlockBorder」を使います。 BlockBorderクラスのクラス図は次のようになっています。 java.lang.Object | +-- org.jfree.chart.block.BlockBorder public class BlockBorder extends java.lang.Object implements BlockFrame, java.io.Serializable用意されているコンストラクタは次の5つです。
いくつか種類がありますが、枠線の幅と色などを指定できる3番目のコンストラクタを使います。 BlockBorder public BlockBorder(double top, double left, double bottom, double right, java.awt.Paint paint)Creates a new border with the specified line widths (in black). Parameters: top - the width of the top border. left - the width of the left border. bottom - the width of the bottom border. right - the width of the right border. paint - the border paint (null not permitted). 1番目から4番目の引数で上左下右の枠線の太さをdouble型の値でそれぞれ指定します。そして5番目の引数にPaintインターフェースを実装したクラスのオブジェクトを指定します。 Paintインターフェースを実装したクラスはいくつかありますが、今回はColorクラスを使用します。Colorクラスについての詳細は「Colorクラス」を参照して下さい。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); BlockBorder border = new BlockBorder(2d, 2d, 2d, 2d, Color.RED); title.setFrame(border); chart.setTitle(title);上記の場合は太さが2ピクセルで色が赤の枠線を設定します。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * 枠線の色を指定する */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; import java.awt.Font; import java.awt.Color; import org.jfree.chart.block.BlockBorder; public class Test14_2 extends JFrame{ public static void main(String[] args) { Test14_2 frame = new Test14_2(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test14_2(){ JFreeChart chart = ChartFactory.createPieChart("", createData(), true, false, false); TextTitle title = new TextTitle("夏の旅行"); title.setFont(new Font("MS 明朝", Font.PLAIN, 28)); title.setMargin(5d, 0d, 5d, 0d); BlockBorder border = new BlockBorder(2d, 2d, 2d, 2d, Color.ORANGE); title.setFrame(border); chart.setTitle(title); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() 線の種類を指定する3番目の方法は「setFrame」メソッドの引数に「org.jfree.chart.block.LineBorder」を使います。LineBorderクラスのクラス図は次のようになっています。 java.lang.Object | +-- org.jfree.chart.block.LineBorder public class LineBorder extends java.lang.Object implements BlockFrame, java.io.Serializable用意されているコンストラクタは次の2つです。
では2番目のコンストラクタを見てみます。 LineBorder public LineBorder(java.awt.Paint paint, java.awt.Stroke stroke, org.jfree.ui.RectangleInsets insets)Creates a new border with the specified color. Parameters: paint - the color (null not permitted). stroke - the border stroke (null not permitted). insets - the insets (null not permitted). 1番目の引数にはPaintインターフェースを実装したクラスのオブジェクトを指定します。今回もColorクラスを使用します。 2番目の引数には線属性を表すstrokeインターフェースを実装したクラスのオブジェクトを指定します。Strokeインターフェースを実装したクラスとしては「java.awt.BasicStroke」クラスがあります。線の形状や太さなどの設定が可能です。(詳細は「線属性の設定」などを参照して下さい)。 3番目の引数には上下左右の枠線とタイトルの間の余白を表す「org.jfree.ui.RectangleInsets」クラスのオブジェクトを指定します。RectangleInsetsクラスについては「RectangleInsetsクラス」を参照して下さい。 実際には次のように上左下右の順で余白の量を指定し、RectangleInsetsクラスのオブジェクトを作成して使います。 RectangleInsets insets = new RectangleInsets(1d, 1d, 1d, 1d);例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); float dash[] = {10.0f, 3.0f}; BasicStroke dsahStroke = new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 3.0f, dash, 0.0f); RectangleInsets insets = new RectangleInsets(1d, 1d, 1d, 1d); LineBorder border = new LineBorder(Color.RED, dsahStroke, insets); title.setFrame(boder); chart.setTitle(title);上記の場合は太さが3ピクセル、色は赤、線の種類は破線、余白は1の枠線を設定します。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * 線の種類を指定する */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; import java.awt.Font; import java.awt.Color; import org.jfree.chart.block.LineBorder; import org.jfree.ui.RectangleInsets; import java.awt.BasicStroke; public class Test14_3 extends JFrame{ public static void main(String[] args) { Test14_3 frame = new Test14_3(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test14_3(){ JFreeChart chart = ChartFactory.createPieChart("", createData(), true, false, false); TextTitle title = new TextTitle("夏の旅行"); title.setFont(new Font("MS 明朝", Font.PLAIN, 28)); title.setMargin(5d, 0d, 5d, 0d); float dash[] = {10.0f, 3.0f}; BasicStroke dsahStroke = new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 3.0f, dash, 0.0f); RectangleInsets insets = new RectangleInsets(4d, 4d, 4d, 4d); LineBorder border = new LineBorder(Color.ORANGE, dsahStroke, insets); title.setFrame(border); chart.setTitle(title); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }JDK-23 + jfreechart-1.5.5 では、下記のエラーが発生しました。 [xxxxxxxx@dddddddddd Wrapper_class]$ javac JSample4_1.java Test14_3.java:50: エラー: LineBorderに適切なコンストラクタが見つかりません (Color,BasicStroke,org.jfree.ui.RectangleInsets) LineBorder border = new LineBorder(Color.ORANGE, dsahStroke, insets); ^ コンストラクタ LineBorder.LineBorder()は使用できません (実引数リストと仮引数リストの長さが異なります) コンストラクタ LineBorder.LineBorder(Paint,Stroke,org.jfree.chart.ui.RectangleInsets) は使用できません (引数の不一致: org.jfree.ui.RectangleInsetsをorg.jfree.chart.ui.RectangleInsetsに 変換できません:) [xxxxxxxx@dddddddddd Wrapper_class]$上記をコンパイルした後で実行すると次のように表示されます。 ![]() |
JFreeChartではメインのタイトルとは別にサブタイトルを追加することが可能です。サブタイトルは複数追加することが可能であり、それぞれのサブタイトルはメインタイトルと同じくTextTitleクラスのオブジェクトとなっていますので、同じように各種設定を行うことが可能です。 作成したサブタイトルをグラフに追加するにはJFreeChartクラスで用意されている「addSubtitle」メソッドを使います。 addSubtitle public void addSubtitle(Title subtitle)Adds a chart subtitle, and notifies registered listeners that the chart has been modified. Parameters: subtitle - the subtitle (null not permitted). 引数には「Title」クラスのオブジェクトを指定します。文字列のタイトルの場合はメインタイトルと同じようにTextTitleクラスのオブジェクトを指定して下さい。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); chart.setTitle(title); TextTitle subtitle = new TextTitle("サブタイトル"); chart.addSubtitle(subtitle);上記の場合は太さが2ピクセルの枠線を設定します。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * サブタイトルの追加(addSubtitle) */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; import java.awt.Font; import java.awt.Color; import org.jfree.ui.RectangleEdge; public class Test15_1 extends JFrame{ public static void main(String[] args) { Test15_1 frame = new Test15_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test15_1(){ JFreeChart chart = ChartFactory.createPieChart("", createData(), true, false, false); TextTitle title = new TextTitle("夏の旅行"); title.setFont(new Font("MS 明朝", Font.PLAIN, 28)); chart.setTitle(title); TextTitle subtitle1 = new TextTitle("2008年"); chart.addSubtitle(subtitle1); TextTitle subtitle2 = new TextTitle("調査期間 7月1日から7月31日"); subtitle2.setFont(new Font("MS 明朝", Font.PLAIN, 16)); subtitle2.setPaint(Color.RED); chart.addSubtitle(subtitle2); TextTitle subtitle3 = new TextTitle("お問い合わせ先:xxxx"); subtitle3.setPosition(RectangleEdge.BOTTOM); chart.addSubtitle(subtitle3); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }JDK-23 + jfreechart-1.5.5 では、下記のエラーが発生しました。 [xxxxxxxx@dddddddddd Wrapper_class]$ javac JSample4_1.java Test15_1.java:48: エラー: クラス Titleのメソッド setPositionは指定された型に適用できません。 subtitle3.setPosition(RectangleEdge.BOTTOM); ^ 期待値: org.jfree.chart.ui.RectangleEdge 検出値: org.jfree.ui.RectangleEdge 理由: 引数の不一致: org.jfree.ui.RectangleEdgeをorg.jfree.chart.ui.RectangleEdgeに変換できません: [xxxxxxxx@dddddddddd Wrapper_class]$上記をコンパイルした後で実行すると次のように表示されます。 ![]() サブタイトルは追加した順によりグラフの描画領域に近い位置に追加されていきます。なお凡例もサブタイトルの1つですので、サブタイトルを追加すると凡例よりもグラフ描画領域に近い位置にサブタイトルが追加されます。 |
サブタイトルは追加した順にグラフに追加されていきますが、追加したい位置を表すインデックスを指定してサブタイトルを追加することが可能です。 引数の異なる「addSubtitle」メソッドを使います。 addSubtitle public void addSubtitle(int index, Title subtitle)Adds a subtitle at a particular position in the subtitle list, and sends a ChartChangeEvent to all registered listeners. Parameters: index - the index (in the range 0 to getSubtitleCount()). subtitle - the subtitle to add (null not permitted). 1番目の引数にサブタイトルを追加する位置を指定します。先頭に追加する場合は「0」を指定して下さい。2番目の引数にはTitleクラスのオブジェクトを指定します。 注意すべき点は凡例もサブタイトルの1つとして扱われることです。凡例がいつ追加されたのかに注意して下さい。デフォルトで凡例を表示する設定にしている場合はサブタイトルの先頭は凡例の場合もあります。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); chart.setTitle(title); TextTitle subtitle1 = new TextTitle("サブタイトル1"); chart.addSubtitle(subtitle1); TextTitle subtitle2 = new TextTitle("サブタイトル2"); chart.addSubtitle(subtitle1); TextTitle subtitle3 = new TextTitle("サブタイトル3"); chart.addSubtitle(1, subtitle3);上記の場合は太さが2ピクセルの枠線を設定します。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * サブタイトルの追加する位置を指定 */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; import java.awt.Font; import java.awt.Color; import org.jfree.ui.RectangleEdge; public class Test16_1 extends JFrame{ public static void main(String[] args) { Test16_1 frame = new Test16_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test16_1(){ JFreeChart chart = ChartFactory.createPieChart("", createData(), true, false, false); TextTitle title = new TextTitle("夏の旅行"); title.setFont(new Font("MS 明朝", Font.PLAIN, 28)); chart.setTitle(title); TextTitle subtitle1 = new TextTitle("2008年"); chart.addSubtitle(subtitle1); TextTitle subtitle2 = new TextTitle("調査期間 7月1日から7月31日"); subtitle2.setFont(new Font("MS 明朝", Font.PLAIN, 16)); subtitle2.setPaint(Color.RED); chart.addSubtitle(subtitle2); TextTitle subtitle3 = new TextTitle("対象年齢 20代女性"); chart.addSubtitle(2, subtitle3); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() |
グラフに追加したサブタイトルを取得する方法を確認します。まず現在追加されているサブタイトルの数を取得します。JFreeChartクラスで用意されている「getSubtitleCount」メソッドを使います。 getSubtitleCount public int getSubtitleCount()Returns the number of titles for the chart. Returns: The number of titles for the chart. メソッドを実行すると現在グラフに追加されているサブタイトルの数を返します。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); chart.setTitle(title); TextTitle subtitle1 = new TextTitle("サブタイトル1"); chart.addSubtitle(subtitle1); TextTitle subtitle2 = new TextTitle("サブタイトル2"); chart.addSubtitle(subtitle1); int count = chart.getSubtitleCount();上記の場合、凡例が表示されるように設定されている場合は凡例も含めてサブタイトルの数は3となります。凡例が表示されないように設定されている場合、サブタイトルの数は2となります。 タイトルの取得次にインデックスを指定してサブタイトルを表すTitleクラスのオブジェクトを取得します。JFreeChartクラスで用意されている「getSubtitle」メソッドを使います。getSubtitle public Title getSubtitle(int index)Returns a chart subtitle. Parameters: index - the index of the chart subtitle (zero based). Returns: A chart subtitle. 引数に指定したインデックスのサブタイトルを表すTitleクラスのオブジェクトを取得します。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); chart.setTitle(title); TextTitle subtitle1 = new TextTitle("サブタイトル1"); chart.addSubtitle(subtitle1); TextTitle subtitle2 = new TextTitle("サブタイトル2"); chart.addSubtitle(subtitle1); for (int i = 0 ; i < chart.getSubtitleCount() ; i++){ System.out.println(chart.getSubtitle(i).getClass().getName()); }上記では現在追加されているサブタイトルを順に取り出し、サブタイトルのクラス名を標準出力に出力しています。 全てのタイトルの取得サブタイトルを表すTitleクラスのオブジェクトを全て取得することも可能です。JFreeChartクラスで用意されている「getSubtitles」メソッドを使います。getSubtitles public java.util.List getSubtitles()Returns the list of subtitles for the chart. Returns: The subtitle list (possibly empty, but never null). メソッドを実行すると、現在追加されている全てのサブタイトに対し、サブタイトルを表すTitleクラスのオブジェクトを取り出し、各オブジェクトを要素に持つListインターフェースを実装したクラスのオブジェクトとして取得できます。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); chart.setTitle(title); TextTitle subtitle1 = new TextTitle("サブタイトル1"); chart.addSubtitle(subtitle1); TextTitle subtitle2 = new TextTitle("サブタイトル2"); chart.addSubtitle(subtitle1); ArrayList list = (ArrayList)chart.getSubtitles(); for (int i = 0 ; i < list.size() ; i++){ System.out.println(list.get(i).getClass().getName()); }上記では現在追加されているサブタイトルを順に取り出し、サブタイトルのクラス名を標準出力に出力しています。 では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * サブタイトルの取得(getSubtitle, getSubtitleCount, getSubtitles) */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; import java.awt.Font; import java.awt.Color; import java.util.ArrayList; public class Test17_1 extends JFrame{ public static void main(String[] args) { Test17_1 frame = new Test17_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test17_1(){ JFreeChart chart = ChartFactory.createPieChart("", createData(), true, false, false); TextTitle title = new TextTitle("夏の旅行"); title.setFont(new Font("MS 明朝", Font.PLAIN, 28)); chart.setTitle(title); TextTitle subtitle1 = new TextTitle("2008年"); chart.addSubtitle(subtitle1); TextTitle subtitle2 = new TextTitle("調査期間 7月1日から7月31日"); subtitle2.setFont(new Font("MS 明朝", Font.PLAIN, 16)); subtitle2.setPaint(Color.RED); chart.addSubtitle(subtitle2); TextTitle subtitle3 = new TextTitle("対象年齢 20代女性"); chart.addSubtitle(subtitle3); for (int i = 0 ; i < chart.getSubtitleCount() ; i++){ System.out.println(chart.getSubtitle(i).getClass().getName()); } ArrayList list = (ArrayList)chart.getSubtitles(); for (int i = 0 ; i < list.size() ; i++){ System.out.println(list.get(i).getClass().getName()); } ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() この時、画面出力には次のように出力されています。 [wwwadmin@kamifuji18 Title]$ java Test17_1 org.jfree.chart.title.LegendTitle org.jfree.chart.title.TextTitle org.jfree.chart.title.TextTitle org.jfree.chart.title.TextTitle org.jfree.chart.title.LegendTitle org.jfree.chart.title.TextTitle org.jfree.chart.title.TextTitle org.jfree.chart.title.TextTitle [wwwadmin@kamifuji18 Title]$最初に表示されている「LegendTitle」は凡例を表すクラスです。 |
グラフに追加したサブタイトル削除する方法を確認します。JFreeChartクラスで用意されている「removeSubtitle」メソッドを使います。 removeSubtitle public void removeSubtitle(Title title)Removes the specified subtitle and sends a ChartChangeEvent to all registered listeners. Parameters: title - the title. 引数には削除したいサブタイトルを表すTitleクラスのオブジェクトを指定します。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); chart.setTitle(title); TextTitle subtitle1 = new TextTitle("サブタイトル1"); chart.addSubtitle(subtitle1); TextTitle subtitle2 = new TextTitle("サブタイトル2"); chart.addSubtitle(subtitle1); chart.removeSubtitle(subtitle2);インデックスを指定してサブタイトルを削除したい場合には「getSubtitle」メソッドと組み合わせて次のように記述します。(「getSubtitle」については「サブタイトルの取得(getSubtitle, getSubtitleCount, getSubtitles)」を参照して下さい。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); chart.setTitle(title); TextTitle subtitle1 = new TextTitle("サブタイトル1"); chart.addSubtitle(subtitle1); TextTitle subtitle2 = new TextTitle("サブタイトル2"); chart.addSubtitle(subtitle1); chart.removeSubtitle(chart.getSubtitle(2)); 全てのサブタイトルの削除追加されているサブタイトルを全て削除する事も可能です。JFreeChartクラスで用意されている「clearSubtitles」メソッドを使います。clearSubtitles public void clearSubtitles()Clears all subtitles from the chart and sends a ChartChangeEvent to all registered listeners. メソッドを実行すると全てのサブタイトルが削除されます。 例えば次のように記述します。 JFreeChart chart = ChartFactory.createPieChart(...); # 引数は省略 TextTitle title = new TextTitle("タイトル"); chart.setTitle(title); TextTitle subtitle1 = new TextTitle("サブタイトル1"); chart.addSubtitle(subtitle1); TextTitle subtitle2 = new TextTitle("サブタイトル2"); chart.addSubtitle(subtitle1); chart.clearSubtitles();では簡単なサンプルを作成して試してみます。 サンプルプログラム下記のサンプルを実行してみよう。/** * サブタイトルの削除(removeSubtitle, clearSubtitles) */ import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.data.general.DefaultPieDataset; import javax.swing.JFrame; import java.awt.BorderLayout; import org.jfree.chart.ChartPanel; import org.jfree.chart.title.TextTitle; import java.awt.Font; import java.awt.Color; import java.util.ArrayList; public class Test18_1 extends JFrame{ public static void main(String[] args) { Test18_1 frame = new Test18_1(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 500, 500); frame.setTitle("グラフサンプル"); frame.setVisible(true); } Test18_1(){ JFreeChart chart = ChartFactory.createPieChart("", createData(), true, false, false); TextTitle title = new TextTitle("夏の旅行"); title.setFont(new Font("MS 明朝", Font.PLAIN, 28)); chart.setTitle(title); TextTitle subtitle1 = new TextTitle("2008年"); chart.addSubtitle(subtitle1); TextTitle subtitle2 = new TextTitle("調査期間 7月1日から7月31日"); subtitle2.setFont(new Font("MS 明朝", Font.PLAIN, 16)); subtitle2.setPaint(Color.RED); chart.addSubtitle(subtitle2); TextTitle subtitle3 = new TextTitle("対象年齢 20代女性"); chart.addSubtitle(subtitle3); chart.removeSubtitle(chart.getSubtitle(2)); ChartPanel cpanel = new ChartPanel(chart); getContentPane().add(cpanel, BorderLayout.CENTER); } private DefaultPieDataset createData(){ DefaultPieDataset data = new DefaultPieDataset(); data.setValue("海外", 30); data.setValue("国内", 60); data.setValue("行かない", 8); data.setValue("未定", 2); return data; } }上記をコンパイルした後で実行すると次のように表示されます。 ![]() |
|