[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 02/06 15:43 / Filesize : 197 KB / Number-of Response : 766
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Java低速GUI Swing 5



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アノテーションつけてもコンパイル通る。







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<197KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef