- - PR -
JScrollPaneについて
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2003-02-21 19:04
いつもお世話になっております。
JavaSwingに関してご教授願います。 #JavaSwingに関しては勉強して3日目くらいですので, #見当違いな質問でしたら,ご容赦ください。 1.クラスAというJPanel上にMSのExcelの様な表を描きたい。 この表の1番目の列には,Graphicsクラスで描いた図形(drawLine()等で)を 描画したいため,JTableクラスは使えない(?) 2.アプレットB上にJScrollPaneを配置し,JScrollPaneに 上記JPanelを貼り付ける。 3.表の行数が増えたときにJSollPaneにスクロールバーがつくようにしたい。 このようなことは可能なのでしょうか。 JPanelのサイズを動的に変更しても,スクロールバーが表示されません。 #単純にJScrollPane上にJTableやJTextAreaを貼り付け, #スクロールバーが表示されるのは確認できたのですが・・・。 ちなみに環境はJ2SDK1.4.1です。 :A public class A extends JPanel{ public void paint(Graphics g){ for(int i = 0; i < 5; i++){ g.drawRect(0, (i * 32), 88, 32); } } } :B public class B extends JApplet{ public void init(){ A a = new A(); JScrollPane pane = new JScrollPane(a); getContextPane().setLayout(null); pane.setBounds(new Rectangle(30, 30, 50, 50)); } } |
|
投稿日時: 2003-02-22 22:38
サイズを変更した後、JScrollPaneのdoLayoutメソッドかinvalidateメソッドのどちらかを呼び出せばスクロールバーの値を変更できたはずです。
ただし、JScrollPaneに貼り付けているコンポーネントは、Scrollableを実装するか、getPreferredSizeメソッドで必要なサイズを返す必要があります。 [ メッセージ編集済み 編集者: 二天 編集日時 2003-02-22 23:52 ] |
|
投稿日時: 2003-02-23 23:58
tarnwoさんへ、
JPanelの例と、表の描画の2つについて別々に説明します。 ■1 JPanelのサイズ変更について JPanelのサイズは setPreferredSize()で設定してください。 もしくは、二天さんの言うように、JPanelのサブクラスにて getPreferredSize()で サイズを返すようにして下さい。 JScrollPaneのスクロールの属性を特に変更していなければ、標準のままでも必要に 応じてスクロールバーが表示されるはずです。 tarnwoさんのプログラムの例では、アプレットのレイアウトを外して JScrollPaneの サイズを設定しているようですが,その中の JPanelのサイズは JScrollPaneの大きさ に合わせて大きさが変えられてしまいますので、スクロールバーが表示されないこと でしょう。 ■2 表の描画について JPanelで表を描画するのは全てをプログラムできて安心できるかも知れませんが, 後々、苦労を伴います。 JTableは大変柔軟なフレームワークを提供しますので、 それを使用したほうが楽と思います。 ただし、JTable単体で使用した場合は、 文字列や数値などの比較的単純なオブジェクトを、予め用意された表示方式のみ でしか扱えないのでがっかりすることでしょう。 JTableが提供する機能を存分に 引き出すためには、他の幾つかのクラスと組み合わせて使用することです。 以下はその概要を説明しますので、APIドキュメントと照らし合わせて理解して 下さい。 1. 表のモデルを作成する。 javax.swing.table.TableModelインターフェースを実装してください。 このモデルは、表で扱いたいデータを扱うもので、表示されたときの様子は 考えないで下さい。 個々のセルに対応するデータは文字や数字のほか、自分で定義したクラスの オブジェクトでも何でも良いです。 今回の要求では、図形を扱いたいということなので,図形データのオブジェクト でも良いです。もし図形の量が多くなければその図形を描画する JPanelでも 良いです。 音声や動画もモデルにすることはできますが、表示は苦しいでしょう。 注意:DefaultTableModelをサブクラス化する方法もありますが、リスナ登録、削除 が簡単になる程度だと思います。 2. データを描画するレンダラを作成する。 javax.swing.table.TableCellRendererインターフェースを実装します。 レンダラは1つのセルを描画するようなオブジェクトです。 JTableは1つのレンダラオブジェクトを「まるでスタンプを押すように」何回も 使用して表を描画してくれます。 カラムによって図形を表示したり、イメージを表示したり、文字列を表示したり すると思いますが、表で使用されるクラスの数(同一クラスでも見た目を変えた い場合はその分も含む)だけレンダラを準備します。 デフォルトのレンダラも 使用できるものが多いので、実際には全部を作る必要はありません。自分で定義 したオブジェクトを描画するものを作ってください。 もし、モデルの中のデータが JPanelのような java.awt.Componentのサブクラス であれば、そのオブジェクトを返すだけになるでしょう。 3. 作成したテーブルモデルのオブジェクトを JTableに関連付けて下さい。 JTableのコンストラクタまたは setModel()の引数でモデルを指定します。 4. 各コラムにレンダラを設定してください。 setDefaultRenderer()を使用して、どのクラスを描画するのにどのレンダラを使用 するかを関連付けます。 ただし、このメソッドでは同じクラスを表示するカラムが複数ある場合全部定義を 変更指定し麻衣ますから、別々にしたい場合はカラムを指定してレンダラを設定す る必要があります。それは getColumnModel()でテーブルカラムモデルを取得した 後、getColumn()でカラムのオブジェクトが得られますから、これにレンダラを設 定して下さい。 以上で、描画するための基本的な準備ができました。後は JScrollPaneに張りつけて ください。 ちょっと面倒(ってゆうか私の説明が下手)と思いますが、これが使えるようになれ ば、自由自在です。 カラムの幅を設定したり、左端のカラムを水平スクロールしないようにしたり、 セルの内容を CellEditorで編集できるようにしたり、ツールチップを表示したり、 …いろいろ応用したくなったときでも、道が開けます。 |
|
投稿日時: 2003-02-24 08:21
Java のチュートリアルに JTable の使い方について詳しく書いてありますので、
ご参考にされてはいかがでしょうか。以下にURLを書いておきます。 http://java.sun.com/docs/books/tutorial/uiswing/components/table.html |
|
投稿日時: 2003-02-24 09:32
二天様,Kissinger様,ken様,
なるほど,大変参考になりました。 さらに勉強を重ねて,より良いプログラムを作成します。 ありがとうございました。 |
|
投稿日時: 2003-02-25 19:21
私の説明に誤りがありました。お詫び申し上げます。
■訂正(概要手順の 4.) ColumnTableのオブジェクトではレンダラを指定できません。 JTableのsetDefaultCellRendererでクラス単位で指定するしかありません。 その代わり,Rendererにはコラムインデクスが引数で渡されますので、 同じクラスでもコラムによって見え方を変えたい場合はレンダラ側で 対応することができます。 |
1
