• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:初心者です。JScrollPane について教えてください。)

初心者のためのJScrollPaneについての質問

このQ&Aのポイント
  • 初心者の方がJScrollPaneについての疑問を抱えています。質問内容はJScrollPaneを使用してスクロールバーを作成する方法についてです。
  • 質問者はJScrollPaneを使用する際にスクロールバーが表示されない問題に遭遇しています。具体的にはJScrollPane(パネル名)ではスクロールバーが作成されず、JScrollPane(JLabel名)では正常に動作しています。
  • 質問者はグラフを表示する際に縦軸に機種、横軸に日付を配置したいと考えています。しかし、選択した期間や機種によって表示するグラフがパネルの表示領域を超えてしまいます。初心者のため、分かりやすく教えていただきたいとのことです。

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

  • ベストアンサー
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.1

JPanel 内にJButtonとかJLabelとか一定サイズを取るものを置いて無くて、ただ、paintComponentでグラフを描いているだけだと、初期のサイズが0,0のままとなるので、JScrollPane にいれると表示されてないように見えます。 対策は、JPanel のインスタンスを作成する時に setPreferredSize(new Dimension(int width, int height) ); を実行してやるとよいです。 グラフを描くたびに全体サイズが変化するなら、その時に再度上記関数を実行し、 getParent().revalidate(); でいけるかとおもいますが、私は別関数で、Imageに描いてからrepaintして、paintComponentでは、drawImageだけにしているので、 paintComponent内から直接呼び出しでもいけるかどうかはやったことがありません。 // 参考ソース // 以前作った画像表示用utilityクラス抜粋、JComponentでも、JPanelでも効果は同じ public class SimpleCanvas extends JComponent { protected java.awt.image.BufferedImage offset_img; public SimpleCanvas(int width, int height){ setPreferredSize(new Dimension(width, height) ); // これで、JScrollpaneに対し強制sizeになる setImage( width, height ); } /** 初期画像の作成 */ private void setImage(int width, int height ){ offset_img = new java.awt.image.BufferedImage( width, height, java.awt.image.BufferedImage.TYPE_INT_RGB); Graphics dt_g = offset_img.getGraphics(); dt_g.setColor(Color.white); // 背景色 白画面作成 dt_g.fillRect( 0,0, width, height); // 右上x0,y0, 左下x2,y2 dt_g.dispose(); } public void paintComponent(Graphics g){ int mxw= this.getWidth(), myh= this.getHeight(); // this = Canvas、描画サイズ=左下座標=コンポーネント境界 g.setColor(Color.black); // 背景色 g.fillRect( 0,0, mxw, myh); //JScrollPane内の Canvasサイズよりimageが小さいとよけいなものが写り込むのを回避 int mwidth = offset_img.getWidth(this); int mheight= offset_img.getHeight(this); g.drawImage(offset_img, 0,0,mwidth,mheight, 0,0, mwidth,mheight, this); super.paintComponent(g); // swingでは、必ずsuperを呼ぶこと } /** 画像データを貰ってrepaint * @param img : 表示したい画像オブジェクト */ public void setImage_paint(BufferedImage img){ offset_img = img; int mwidth = offset_img.getWidth(this); int mheight= offset_img.getHeight(this); setPreferredSize(new Dimension( mwidth,mheight ) ); repaint(); // 外からの呼び出しではrepaintも呼び出す必要あり getParent().revalidate(); // 親をvalidateで再描画 } }

hide2002g
質問者

お礼

初めての質問で、こんな文章で内容が理解してもらえるか不安でしたが、回答がきてありがたかったです。早速やってみます。ありがとうございました。 独学で入門書たよりに(しかも古本屋で購入)やっている為、本に載ってないことをしたいときにどのクラスやメソッド等使用すればいいのかわかりません。これが分かれば調べれるのですが。 これからもちょくちょく質問することになりそうですが、よろしくおねがいいたします。

関連するQ&A

専門家に質問してみよう