1 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 11:50:09 ] ハードウェアの高スペック化、JavaVMのホットスポットの高速化に伴い、 パフォーマンスの問題は徐々にですが改善されつつあります。 しかしながら、"Java"というだけで未だに敬遠されるのが現状。 そんなSwingと引き続き付き合っていくみんなのスレッドです。 Java低速GUI Swing 4 (前スレ) pc8.2ch.net/test/read.cgi/tech/1140533866/ Java低速GUI Swing 3 pc8.2ch.net/test/read.cgi/tech/1121700954/ Java低速GUI Swing 2 pc8.2ch.net/test/read.cgi/tech/1095398949/ Java低速GUI Swing pc5.2ch.net/test/read.cgi/tech/1062271447/l50
207 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 00:12:43 ] >>201 なにがいいたいのか、俺にはさっぱりわからん。 図かなんか描いてどっかに貼ってみせてみろ。
208 名前:デフォルトの名無しさん [2006/12/07(木) 00:24:40 ] _________________________________ | keyword 11111111111 | | keyword 222222222222222222222 | _______ | aaaa | | | _________________ | うお | ________ | ぎゃああ | | | _______ |あああああああ | | | __________
209 名前:デフォルトの名無しさん [2006/12/07(木) 00:27:06 ] こんな風にできんのか ______________ | keyword 11111111111 | | keyword 222222222222222222222| _______ | aaaa | | | _________________ | うお | ________ | ぎゃああ | | | _______ |あああああああ | | | __________
210 名前:デフォルトの名無しさん [2006/12/07(木) 00:35:22 ] ネトゲの吹き出しみたいなもんか?
211 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 00:52:16 ] Graphicsに描画するんだろ? どうでもできるだろ。
212 名前:207 mailto:sage [2006/12/07(木) 00:52:55 ] >>208 GlyphVector 作って、getOutline() で Shape とかとってくれば 簡単な気がする。
213 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 10:22:21 ] ここまで答えが書かれてるのにできないってのは無いな。 やってないだけ。
214 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 10:53:11 ] 結局アルゴリズムの問題だよな。 やることはJavaだろうがWin32だろうがGTKだろうが変わらない。
215 名前:181 [2006/12/07(木) 12:28:54 ] 文字をいれる枠の大きさぐらいはなんとかなるかもしれんが、 文字が入ってる枠をほかの枠とかさならない位置を計算して 表示するアルゴリズムがわからんじゃないか
216 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 13:31:24 ] なに、Swingと関係ないことで苦労してるの? アルゴリズムの初心者スレいったほうがいいよ。
217 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 14:24:59 ] 複数個のJPanelが存在し, ボタンを押された祭にそれらのJPanelを切り替える事は可能でしょうか? public class SwingTest extends JFrame implements ActionListener{ JLabel label = new JLabel("change"); JButton btn = new JButton("push"); JPanel p1 = new JPanel(); JPanel p2 = new JPanel(); public static void main(String[] args){ SwingTest test = new SwingTest("SwingTest"); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test.setVisible(true); } SwingTest(String title){ setTitle(title); setBounds(10, 10, 300, 200); p1.add(btn); p2.add(label); btn.addActionListener(this); getContentPane().add(p1); } public void actionPerformed(ActionEvent e){ getContentPane().remove(p1); getContentPane().add(p2); } } こんな感じで今やっているのですが,ボタンを押しても反応しなくて困っています. どなたかご教授お願いします.
218 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 15:08:27 ] 一応そのやり方でもできるけど、ちゃんとイベント把握してないとやめたほうがいい たぶんやりたいことはJPanelを切り替えることではなく、レイアウトマネージャにあるやつで足りると思うが
219 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 15:37:48 ] >>217 解答。ボタンを押すとボタンが消えて、ラベルが現れるなんて、変なGUIだな。 元の状態にに戻れないじゃん。あくまでもテストだよね。 本ちゃんでこんな変なGUI使ったら笑われるよ。 public void actionPerformed(ActionEvent e){ getContentPane().remove(p1); getContentPane().add(p2); validate();//←ここ、ここ }
220 名前:217 mailto:sage [2006/12/07(木) 16:06:49 ] 返信ありがとうございます. validate() を加える事で表示は代わるようになったのですが,また新たな問題が・・・. 今3つのパネルを用意してそれら3つを行き来できるようにしているのですが, この方法を用いた場合何故か3つのパネルを1回ずつ表示させることはできるのですが, 2回目以降即ち違うパネルから再度戻ってきた場合に表示が反映されません. 何度も質問してしまい,お手数だと思いますが,どなたかよろしくお願いします.
221 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 16:12:04 ] コードも見ないでどうやって解答しろと?
222 名前:217 mailto:sage [2006/12/07(木) 16:22:57 ] すいません. コードを張ろうとしたら大きくなりすぎて,張る事ができなかったので・・・. 表示を切り替えている部分はこんな感じです.public void actionPerformed(ActionEvent e){ String cmd = e.getActionCommand(); if (cmd.equals("1to2")){ getContentPane().remove(パネル1); getContentPane().add(パネル2); } else if (cmd.equals("1to3")){ getContentPane().remove(パネル1); getContentPane().add(パネル3); } else if (cmd.equals("2to1")){ getContentPane().remove(パネル2); getContentPane().add(パネル1); } else if (cmd.equals("2to3")){ getContentPane().remove(パネル2); getContentPane().add(パネル3); } else if (cmd.equals("3to1")){ getContentPane().remove(パネル3); getContentPane().add(パネル1); } else if (cmd.equals("3to2")){ getContentPane().remove(パネル3); getContentPane().add(パネル2); } validate(); }
223 名前:217 mailto:sage [2006/12/07(木) 16:29:56 ] 何度も申し訳ありません. 先ほどパネルはが変わらないと言いましたが,一部分は変わっていました. 3つのパネルに共通する部分は変更されているのですが, それ以外の部分が変更されていませんでした. ただ変更されると言ってもマウスをボタンコンテナ上に乗せると変わるのですが, そうしなければ変わりませんでした. 非常に説明が下手で申し訳ありませんが,よろしくお願いします.
224 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 16:45:57 ] >>218 が一番まともな回答だと思うけどそれは調べたの?
225 名前:217 mailto:sage [2006/12/07(木) 16:49:42 ] >>224 一応>>218 の方法で 画面の切り替えが発生したら パネル上にあるコンテナをremoveAllで削除. 新たに別のパネルを作成し,コンテナを設置. そのパネルを今表示しているパネルに代入. という感じでやったのですが,画面が切り替わらず,断念しました.
226 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 16:50:46 ] そりゃそうだが、java.awt.CardLayoutというキーワードが出てこないと そう簡単には調べられない。 AWTのレイアウト概説的文章とにらめっこする必要が出てくる。
227 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 16:53:00 ] AWTやSwingはまずレイアウトマネージャありきだろ どんな初心者本だってすぐにでてくる
228 名前:217 mailto:sage [2006/12/07(木) 16:55:36 ] いまさらになってしまうのですが 自分がsetLayout(null)でレイアウトマネージャーを無効にしているのがダメな気がしてきた・・・. やはり何かしらレイアウトマネージャーは使うべきなんですかね・・・.
229 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 17:01:21 ] レイアウトマネージャ使えばコンポーネントサイズが変わってもそれにあわせて動いてくれるからな とりあえずnullを使う利点はない 絶対的な座標のように扱うにしてもグループレイアウトやアブソリュートレイアウトのほうがまし 今のコードそのまま使うにしてもそのさしかえたいJPanelにレイアウト指定して そこにカードレイアウトではりつければいいだけ レイアウトマネージャ理解していないのならIDEでいじってみてどういう感じなのか理解したほうがいい カードレイアウトってのはタブ部分のないタブコントロールみたいなもん
230 名前:217 mailto:sage [2006/12/07(木) 17:07:34 ] 返信ありがとうございます. カードレイアウトが自分のやりたい事とマッチしているようなのでまずはこれを勉強してみます. みなさま本当にありがとうございました.
231 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 17:14:50 ] カードレイアウトって、そんなもんも有ったなあ。 しかし、222のコード見たところ、ボタンがいくつか有って、押すと対応するパネルが 表示されるようにしたいんでしょ。普通はJTabbedPane使って解決じゃないの?
232 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 17:21:55 ] 今のUIそのまま使いたいならCardLayoutだけど、それは普通Tabでやる。
233 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 17:30:32 ] まあ、人様に御見せするアプリじゃないんでしょ。いいんじゃないの。
234 名前:181 [2006/12/07(木) 22:28:24 ] JGraphいちおううまくサンプル動かせたんだが、 なぜかJ2SDKのフォルダの中でソースをコンパイルして実行しないと 他の場所ではコンパイルも実行もできなんだけど、なぜだろう。 コンパイル後の.classファイルなら他の場所でも実行できるのかと思って 別の場所に移動させて動かしてみたらやっぱり動かないし。 普通、J2SDKフォルダの中でコンパイルしたり実行したりってしないんだし これだったら使い物にならないんだけど・・・
235 名前:デフォルトの名無しさん [2006/12/08(金) 00:16:52 ] jgraph.jarをソースと同じフォルダにいれればコンパイルできますた。 でも常にjgraph.jarを一緒にいれておかなければならないんでしょうか。
236 名前:デフォルトの名無しさん mailto:sage [2006/12/08(金) 00:26:59 ] なんか根本的なところ勉強したほうがよくないか? それにSwingとまったく関係ない点について
237 名前:デフォルトの名無しさん mailto:sage [2006/12/08(金) 00:31:35 ] >>181 Javaの仕様を勉強してこい。 理解できるまで帰ってこんでよい。
238 名前:デフォルトの名無しさん mailto:sage [2006/12/08(金) 00:31:59 ] jgraphスレ行け
239 名前:デフォルトの名無しさん [2006/12/08(金) 00:49:38 ] jgraphスレってなんだよ。そんなものねえじゃん
240 名前:デフォルトの名無しさん mailto:sage [2006/12/08(金) 00:53:24 ] 無けりゃ最初に質問すべきスレがあるだろ 少なくともここじゃねえ
241 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 19:21:53 ] JTableで、カーソルキーによるセルの移動を監視したいのですが、どうしたらよいですか? keyPressed で JTable#getSelectedRow() で行を取得すると、 移動前の行が取れてしまうのが悩みの種です。 押したキーによって、+1、-1すればできますが、 もう少し良い方法があれば教えてください。お願いします。
242 名前:241 mailto:sage [2006/12/09(土) 19:59:48 ] モデルの isCellEditable をオーバーライドして移動先が取得できるか試しましたが、 セルを行で選択するモードだと isCellEditable が呼ばれないんですね。どうしたものか。
243 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 20:32:19 ] >>241 SelectionModel を使う。
244 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 20:49:50 ] >>241 TableColumnModelListener,ListSelectionListener の2つで横と縦の選択がとらえられる。
245 名前:241 mailto:sage [2006/12/09(土) 22:31:36 ] >>243 >>244 ありがとうございました。早速試したところ、なんとか取れました。 あと、JTable#valueChanged(ListSelectionEvent) をオーバーライドしても取れました。 奥が深いですね。
246 名前:デフォルトの名無しさん mailto:sage [2006/12/09(土) 23:25:58 ] ぽとぺたやってると手軽にオーバーライドできなくて面倒なんだよね ペイントイベントもイベントとしての実装じゃないから手軽とはいかないし SwingはJavaBeansをベースに作ってるといいながらどうもそういう実装になってないんだよね getとsetが対になってないからプロパティとして表示されないとかも多いし
247 名前:デフォルトの名無しさん mailto:sage [2006/12/13(水) 00:56:29 ] Java SE 6 入れてみたけど Swing また速くなった?
248 名前:デフォルトの名無しさん mailto:sage [2006/12/13(水) 01:55:20 ] Swing部分はまだ確認してないが、演算速度は確実に速いっぽ コンパイルしなおしてなくても物によっては1.4倍くらいでてる
249 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 11:49:28 ] JButton上で、HTML要素を使って改行し、多段落表示させているのですが、 この中の文字列に含まれる一部の「<」や「>」や「/」などが表示されません。 これらの文字をHTML要素として解釈させないため無効化するにはどうしたらいいのでしょうか? Webブラウザ上でHTMLソースを表示させるときのように 「<」や「/」を実体参照に書き換えても表示できないようです。
250 名前:249 mailto:sage [2006/12/14(木) 12:37:25 ] 文字実体参照ではなく数値文字参照でやってみたらなぜかうまくいきました。
251 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 12:41:39 ] >>250 おれはふつうに>とかでできてるぞ
252 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 12:43:46 ] あら、2chでえすけーぷされた &gt; で普通に表示されてるよと
253 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 12:53:18 ] >>252 レスありがとうございます。 < と >はうまくいったのですが、 <html> のあとに、「/」が入る部分があると表示されたり表示されなかったりで試行錯誤中です。
254 名前:デフォルトの名無しさん mailto:sage [2006/12/14(木) 13:29:39 ] >>253 bodyタグがはいっていないとかいうオチは?
255 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 07:27:32 ] drawLineメソッドでCanvasに線をかくことが出来ますが、 その線を座標の配列として得るにはどうしたらいいでしょうか?
256 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 09:34:57 ] >>255 線は特にインスタンスを保持してないしデータもない。 このやりかたでを試してみな。 ttp://web.hc.keio.ac.jp/~fujimura/lang/page-16.html
257 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 10:45:24 ] >>256 もっと簡単にできないものでしょうか 例えば(0,0),(0,5)をdrawLineで指定したとしたら 2点とその間にある(0,1),(0,2),(0,3),(0,4)が塗りつぶされます。 この4点の塗りつぶしをJavaはどのように実装しているのでしょうか? この例のように予め2点を結ぶと水平,もしくは垂直になると分かっていればいいですが (0,0),(2,5)のように水平及び垂直にならない場合, drawLineはどのように計算して塗りつぶす点を決めているのでしょう?
258 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 11:19:16 ] >>257 言っている意味がわからないし(何に対して水平、垂直?水平な点なんてありえないし) 255との繋がりも無いように読めるんだけど、結局何がしたいの? つか256もけして難しくはないと思うんだけど。 実装について知りたければソース読め。
259 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 13:11:03 ] >>258 ちょっと感動した。ソース読めってセリフが出てくるあたり。 まあ、ネイティブに飛ばしてない限りそこ読めば分かるよな。
260 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 13:16:38 ] どうでも良いことだけどCanvasはSwingじゃなくてAWTじゃなかったっけ。
261 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 13:31:08 ] 1.2 以降だと、たかが drawLine でも Graphics2D の関係で Stroke の計算とか 結構面倒臭い事しなきゃいかんような気もする。 1.1 までだったら Stroke とか無かったし、 アンチエイリアス云々って時代でもなかったから ブレゼンハムアルゴリズムだけで出来たかもしらんけど。
262 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 13:45:06 ] 257はソース読んでからの書き込みです。 drawLineの実装ってどんなんだろ,と思ってソース見たのですが Graphic見てもabstractで Graphic2Dでオーバーライドしてるのかなと思ってもありませんでした。 どうやらdraw(Shape)っぽい漢字なのですが Stroke云々ってあってめんどくさそうなのです。 >>258 水平,垂直ってのは結んだ線の話です。 (0,0)と(0,5)を結ぶと垂直な線になります。 ある2点を結んだときにできる線が通ることになる座標を 得るにはどうしたらいいか?ってことで伝わるでしょうか
263 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 13:46:41 ] えっと、もっと簡単に言うと 直線が2本あって、 その2本の線の交点の座標って求められるの? ってことかい? もしそれなら数学学べ
264 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 14:04:43 ] >>263 全然話が違います 「ある2点を結んだとき」ですから出てくる点は2つです それだと4点になります drawLine(0, 0, 0, 5)を呼び出すと (0,0),(0,1),(0,2),(0,3),(0,4),(0,5)が塗りつぶされます。 (0,1),(0,2),(0,3),(0,4)が塗りつぶされるのは (0,0)と(0,5)を結んだ直線が通る座標だからです。 (0,0)と(0,5)を結ぶと垂直な線ができるので (0,1),(0,2),(0,3),(0,4)が塗りつぶされるということは 簡単に求められます。 drawLine(0, 0, 100, 101)を呼び出したときに 塗りつぶされる座標はどこになるのでしょうか?
265 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 14:09:00 ] もっと簡単じゃないか。。。 drawLine(0, 0, 5, 5)だと (0,0),(1,1),(2,2),(3,3),(4,4),(5,5) が塗りつぶされるけどどうやって計算するの? ってことか? やっぱ数学学べ
266 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 14:21:08 ] 計算する以外での求め方は 線を書く前のキャンバスの画像と 線を書いた後のキャンバスの画像を比較すれば良い 前と後の同一座標のドットを比較して 違っていれば描画されていると判断すれば良いんじゃないか
267 名前:デフォルトの名無しさん mailto:sage [2006/12/15(金) 14:23:28 ] >>264 ソースを理解できないのなら手助けもするが、読むのが面倒なだけなら帰れ。 そしてスレ違い。
268 名前:デフォルトの名無しさん [2006/12/15(金) 14:29:11 ] JDoalogを継承したDialogで最大化、最小化ボタンを表示させることは 可能でしょうか? JFrameを継承すれば表示されますが、 Windowsのタスクバーにアプリケーションが2個上がってきてるように 見えるのでJDialogにしたいです。
269 名前:デフォルトの名無しさん mailto:sage [2006/12/16(土) 02:53:26 ] >>268 私が知っているのは↓の手法 Merlinの魔術: もう1つのシンプルなフレーム ttp://www-06.ibm.com/jp/developerworks/java/011130/j_j-mer0717.html A,この手法の場合、最小化、最大化アイコンを設定する必要あり。 B,たぶんもっといい方法があると思う。
270 名前:デフォルトの名無しさん [2006/12/17(日) 10:51:19 ] 見えないボタンの右半分がクリックできるプログラム。 import javax.swing.*; import java.awt.event.*; class A020 { public static void main(String[] args) { JFrame f = new JFrame(); f.setSize(640, 480); JPanel p1 = new JPanel(); p1.setBounds(0, 0, 100, 100); JButton b = new JButton("クリック"); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null, "ボタンがクリックされました。"); } }); p1.add(b); JPanel p2 = new JPanel(); p2.setBounds(50, 0, 100, 100); JLayeredPane l = new JLayeredPane(); l.add(p1, Integer.valueOf(10)); l.add(p2, Integer.valueOf(20)); f.add(l); f.setVisible(true); } }
271 名前:デフォルトの名無しさん mailto:sage [2006/12/17(日) 11:00:39 ] ×見えないボタンの右半分 ○見えない「ボタンの右半分」
272 名前:デフォルトの名無しさん [2006/12/17(日) 20:29:21 ] g.drawString("Test", 0, 0); g.drawLine(0, 0, 10, 10); とすると、線は(0,0)-(10,10)で描かれますが、文字の方は描かれません。 drawStringとdrawLineでは、座標の考え方が異なるようなのでしょうか?
273 名前:272 mailto:sage [2006/12/17(日) 20:43:03 ] すみません。解決しました。 drawStringは文字の左下が基点になるのですね。 なんのためにそうなっているのかわかりませんが。。。
274 名前:デフォルトの名無しさん mailto:sage [2006/12/17(日) 20:57:59 ] ベースラインを理解しろよ・・・ それにこれはSwingと関係ないし
275 名前:デフォルトの名無しさん [2006/12/17(日) 21:25:06 ] ベースラインがなぜアセント値の下にあるか説明せよ。
276 名前:デフォルトの名無しさん mailto:sage [2006/12/17(日) 21:36:32 ] >>274 おまえには関係ないし
277 名前:デフォルトの名無しさん mailto:sage [2006/12/18(月) 12:11:24 ] >>276 >>274 自身には関係ないだろうが スレに関係ないのは確かだ 日本語嫁よ
278 名前:デフォルトの名無しさん mailto:sage [2006/12/18(月) 13:33:49 ] JTextArea で、キャレットの列の位置を取得したいのですが、 シンプルな方法があったら教えて下さい!! 今は以下のようにして取得しています。 _text = new JTextArea(); Element all = _text.getDocument().getDefaultRootElement(); int index = all.getElementIndex(_text.getCaretPosition()); Element line = element.getElement(index); int col = _text.getCaretPosition() - e.getStartOffset();
279 名前:272 [2006/12/18(月) 14:35:31 ] スレ違いでしたか。。。 JComponentの質問は良くて、Componentの質問はダメってことですか?
280 名前:デフォルトの名無しさん mailto:sage [2006/12/18(月) 15:14:32 ] 単に274がキチガイ
281 名前:デフォルトの名無しさん mailto:sage [2006/12/18(月) 17:57:41 ] >>270 どういうトリック?
282 名前:デフォルトの名無しさん mailto:sage [2006/12/18(月) 17:58:32 ] >>278 全角とTabの対応が入ってなくない? Tabは入る位置によって文字列長が変わるから、結構面倒そう。
283 名前:デフォルトの名無しさん mailto:sage [2006/12/18(月) 20:28:08 ] >>282 その行の何文字目かが欲しいだけでしょ
284 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 04:23:00 ] コンポーネントをadd()あるいはremove()するときは直後に必ずrevalidate()を呼ぶべきでしょうか? 多くの場合、revalidate()を呼ばなくてもうまくいくのですが (ただしremove()の後は必ずrepaint()してます)、 ときどきrevalidate()を呼ばないとダメなときがあります。 revalidate()が必要なときと不要なときの違いは何でしょうか? または、違いは気にせずに常にrevalidate()するべきでしょうか?
285 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 12:21:57 ] 呼ぶべき。
286 名前:デフォルトの名無しさん [2006/12/20(水) 17:41:07 ] JavaSE6だとメニューをだしたまま、タイトルバーをクリックするとメニューが消えてくれるね。 かなりいいかんじあげ
287 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 18:13:34 ] おお、どれだけ待った事か>>286
288 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 02:34:13 ] >>284 オレもよくわからない。 revalidate()を呼ぶと、repaint() 時のクリップ領域が現状にあったものになる気がする。 詳しくわかったら教えてくれ。
289 名前:284 mailto:sage [2006/12/21(木) 21:25:56 ] 自分の経験だけで言えば、JPanelに限ればrevalidate()は無くても大丈夫そうです。 以下、JPanel限定の話。 ◆add()する場合 revalidate() → なくても問題ない。 repaint() → たいていはなくても問題ないが時々ないとダメなことがある。 ◆remove()する場合 revalidate() → なくても問題ない。 repaint() → ないとダメ。 JComponentのドキュメントのrevalidateの項を見ると、 「プログラムが、通常、GUI の内容を更新するために validate を呼び出す必要がない点で AWT とは異なります」 というようなことが書いてあります。 つまりSwingではrevalidateを呼ぶ必要はないということなのかなと解釈したのですが 実際のところはどうなのでしょう? それと、JScrollPaneが絡んでるとrevalidateしないとダメなことがあるようです。
290 名前:288 mailto:sage [2006/12/21(木) 22:51:29 ] >>289 どうもありがと。 JPanel にボタンを2つ貼り付けて、押されたから片方を remove するサンプルを作って試してみた。 revalidate() しないと、ボタンが削除されたのに、レイアウトが変更されないね。 これはたぶん、revalidate()を自動的に呼ぶのが、 レイアウトに影響を受けたコンポーネントが呼ぶからだと思う。 つまり、removeされた本人は revalidate() を自動的に呼ぶが、もうremoveされていて親がいないので、すぐにreturnされる。 なので、親のコンポーネントの方で revalidate() してあげる必要がある。 ちなみにオレがrevalidate() を使う必要があったのは、JTextArea に行番号を表示させる時。 JScrollPane上に表示されていない行が増えた場合に、増えた行の行番号が正しく表示されなかった。 これは上のレスで書いた通り、新しく増えた領域が再描画する領域として認識されていないからだと思う。 まぁ長々と書いたが、オレははっきり理解していないのだが。。。。
291 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 23:11:13 ] つ ttp://homepage1.nifty.com/algafield/JavaGUIFaq19j.html#five13
292 名前:284 mailto:sage [2006/12/22(金) 01:13:22 ] どうもありがとうございます。 なるほど、周りのレイアウトに影響を及ぼす場合はrevalidate()が必要なのですね。 自分は最近setLayout(null)でずっとやってたから必要な場面がなかったのかもしれません。 JScrollPaneが絡んだときだけ必要になるのも納得です。 しかし、add()するときにrepaint()が必要になることがある理由は何なんでしょうか…?
293 名前:デフォルトの名無しさん [2006/12/22(金) 13:16:52 ] paintイベントで描画してる場合
294 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 20:02:30 ] JListで、リスト項目の高さを任意に指定したいのですが、どうすればよいでしょうか? 現在はDefaultListCellRendererを継承したRendererを使って高さを設定してますが、反映されません。 呼び元を見たところ、Fontサイズが有効になっているっぽいのです。
295 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 21:32:27 ] >>294 そのレンダラのサイズ指定はどうなってるの?
296 名前:294 mailto:sage [2006/12/22(金) 22:31:40 ] >>295 すみません。できました。 レンダラで getPreferredSize() をオーバーライドして、サイズ返したら、そのサイズになりました。 getListCellRendererComponent() の中でサイズを指定しても、有効にならないようですね。 質問の内容が不十分だったこともお詫びします。
297 名前:284 mailto:sage [2006/12/23(土) 05:20:19 ] >>293 ありがとうございます。 paintComponent()ではなくてpaint()してる場合なのですね。 すると自分ではいじってないからどこで使われているのかわかりにくいわけですね。
298 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 14:09:18 ] >>291 そのFAQは知らなかった。とても参考になった、ありがとう。
299 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 14:57:52 ] >>297 Swingはフレームワークとしてpaintよんでる つまり自前でコンポーネント描画しているすべての場合において必要ということ
300 名前:284 mailto:sage [2006/12/23(土) 17:55:43 ] >>299 ありがとうございます。 すると、add()の後はrepaint()必須ということですか? repaint()しなくてもちゃんと描画される場合があるのはなぜでしょうか?
301 名前:290 mailto:sage [2006/12/23(土) 20:02:19 ] 普通のコンポーネントを追加した場合は、revalidate() すれば repaint() しなくても正常に描画されると思う。されない時ってある? >>293 は、drawLine とかで、自分で描画している場合は「必要」と言ってる気がする。 paintイベントって言ってるのも、paintComponent()のことだよね?
302 名前:デフォルトの名無しさん mailto:sage [2006/12/23(土) 20:44:17 ] 299も293も俺 Swingはpaintイベントでpaintなんちゃらというのをよんでる そこで子のコンポーネントも順次呼ばれる paintをオーバーライドするとイベントがとまって崩れるのはこのため revalidateがリペイントマネージャに対してダーティマーキングしていれば自動的に再描画される ソース読んでみた?IDEつかってるならすぐソース見れるからJComponentみてみるといいよ
303 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 05:29:14 ] >>302 paint?paintComponent? オーバーライドするなら基本はpaintComponentでは? あと、super呼び出せば今までと変わらないと思う。 理由は何にせよ、呼ばないで崩れる時があったら、呼んでみるってのでいいのかな。
304 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 05:49:29 ] 間違えて、paintComponentsをオーバーライドしてはまる。
305 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 12:15:13 ] >>303 オーバーライドの話してないだろ >>304 それはオーバーライドとはいわない アノテーション使え
306 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 15:00:31 ] >>305 >>302 に思いっきりオーバーライドってあるけど。
307 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 17:05:05 ] >>305 オーバーライドだろ おまえみたいなヤツが思いっきりはまるんだよ。 paintComponentsというメソッドもある。 だから@Overrideアノテーションつけてもコンパイル通る。