プロが教える店舗&オフィスのセキュリティ対策術

まったくの初心者ですが、java入門書を参考にしながらjavaアプリケーションを作成しています。的外れなことをしているのかもしれませんが、JScrollPane(パネル名) ではスクロールバーをつくれないのでしょうか?
JScrollPane(JLabel名)にした場合はうまくうごくのですが、JScrollPane(パネル名)にした場合にスクロールバーが付いて(線の様になっている?)くれません。
縦軸に機種、横軸に日付を配置して、小さいグラフをマトリックス状に
ならべたいのです。日付の期間、または選択した機種により表示するグラフがパネル表示領域を超えてしまいます。
素人なのでむずかしいことはわかりません。わかりやすくおしえていただけないでしょうか。

A 回答 (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 {
protectedjava.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で再描画
}
}
    • good
    • 2
この回答へのお礼

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

お礼日時:2007/11/09 00:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!