• ベストアンサー

Jpanelにグラフを書くプログラム

質問させて頂きます。 今、ファイルから西暦、月、日、時間、そのときの温度、湿度を読み込んでグラフ表示するプログラムを作っています。そこで、Swingを使ってPanelを三つ作成し、一番上のPanelにグラフ、二番目にデータの日付を指定するJComboBoxボタン(何年何月何日等)、三番目にグラフ描画時の現在時刻を表示するプログラムを作っています。 そこで質問なんですが、一番目のPanelにグラフを表示する方法がわからなくて困っています。 これのPanel1に簡単な図を描く方法を教えていただければ自分でも考えられると思いますので、よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

JPanelを継承したClassを作る方法で、一例を紹介します。 1. JPanelを継承した class を1つ作ります。(hizukeの下に書けばok) public class hizuke extends JApplet implements ActionListener {  …… } class MyGraphPanel extends JPanel { } 2. 今までの p1 を このclassに変えます。 public class hizuke ... { private MyGraphPanel p1; // <-------ココのclass変更 public void init(){ //********** JPanel **********************************/ p1 = new MyGraphPanel(); // <-------ココのclass変更 3. MyGraphPanelクラスに、hizukeクラスからデータをもらうpropertyを作成します。 class MyGraphPanel extends JPanel { private int[] graphData = null; void setGraphData(int[] graphData) { this.graphData = graphData; } } 4. 実行ボタンが押されたら、データを渡してグラフ描画を依頼する命令を出します。 public class hizuke ... { …… public void actionPerformed(ActionEvent e){ …… else if(e.getSource()==bt1) { int[] graphData = {20, 24, 25, 26, 28, 24, 22, 18, 20, 22, 20, 17}; p1.setGraphData(graphData); p1.repaint(); } 5. グラフを描画する処理をMyGraphPanelに入れます。 class MyGraphPanel extends JPanel { …… public void paintComponent(Graphics g) { super.paintComponent(g); if (graphData == null) return; Graphics2D g2 = (Graphics2D) g; g2.setColor(Color.blue); //棒グラフ for (int i = 0; i < graphData.length; i++) { g2.draw3DRect(0, i * 16, graphData[i] * 10, 10, false); } } } ※jdkの\demoの配下にsampleが沢山あるので、それらも参考にしましょう

arno
質問者

補足

グラフが表示できました!! ありがとうございます。 Jpanelを継承したクラスを別に作ればいいなんて、全く気が付きませんでした。 これを基にして必要なグラフが書けそうです。 厚かましくて申し訳ないんですがもう一つだけ助言をいただけないでしょうか。 貼り付けたソースプログラムで、Panel2のとこにいくつかボタンが配置してあります。これは年、月、日を選択できるように組んであるんですがバグがあるんです。左側の年から順に選んでいけば問題なくできるんですが、年と月を変えずに日を連続して変えたりすると、1~31とかがどんどん追加されていってしまうんです。removeAllItemsで一旦リストを消去して、直後にaddItemで書こうと思ったんですが、それだとselectItemが1で固定されて上手くいきませんでした。 色々調べてみたものの解決できなかったんですが、リストの中身を上書きしたりする方法はないんでしょうか。

その他の回答 (1)

回答No.2

> リストの中身を上書きしたりする方法はないんでしょうか。 は、removeAllItems()して、addItem()で問題ありません。問題はイベントが来たときの処理内容でしょう。 まず、月はinit()で1~12を一度入れたら、もう二度と入れ替える必要はないはずです。 それと、日が変えられたからといって、何かしないといけないようなことも無いはずです。 この2点をしっかり踏まえて、アクション時の処理(actionPerformed)を見直されると、解決するでしょう。

arno
質問者

お礼

返答ありがとうございます。 ちょっと仕様上の問題がありまして、入れ替える方法を考えていたんですが、効果的な方法はなさそうですね。 後はなんとか自分で考えてみようと思います。 システムの方も教えていただいたおかげでめどが付きそうです。 pchelp-sandboxさん、本当にありがとうございました。