Java低速GUI Swing 8
..
331:326
09/02/11 00:24:39
>> 327
今回はキーが押された場合のみを処理したいので
DocumentFilter は使えないのですが、
回答ありがとうございます。
>>328 >>329 を参考にして
こんな感じにしてみました。
final Action defaultAction = keymap.getDefaultAction();
keymap.setDefaultAction(new AbstractAction() {
@Override public void actionPerformed(ActionEvent ae) {
String cmd = ae.getActionCommand();
if (!" ".equals(cmd)) {
defaultAction.actionPerformed(ae);
}
}
} );
UIによって独自のデフォルトアクションが
セットされるかもしれない(?)ので、
>>329 の案のほうがよいかと。
332:デフォルトの名無しさん
09/02/11 00:30:05
まずEDTといってもシステムキューの方かSwingEDTの方なのかはっきりしてもらわんとなぁ。
単にEDTと言ったらjavaの場合SwingEDTの方を指す場合が多いからややこしい。
333:デフォルトの名無しさん
09/02/11 01:47:13
>>332
システムキューって何ぞ?
用語が一般的過ぎて、ぐぐってもそれらしきものが引っかからん。
説明資料へのリンク希望。
AWTイベントキューとは違うもんなんだよね?
334:sage
09/02/11 10:31:21
>>331
Actionに委譲するのは良いんだけど、
>UIによって独自のデフォルトアクションがセットされるかもしれない
ということを考慮するなら、委譲するActionの参照を保存してたらダメでしょ。
UI変更時に、上記のコード自体が再実行されるなら、アリだけど。
335:デフォルトの名無しさん
09/02/11 17:23:09
>>333
同じ、AWTのEDTの事をAWT event queues systemと表記する場合とSystem Queueと表記する場合がある。
今はどうなってるが知らんが。
336:デフォルトの名無しさん
09/02/11 19:36:49
>>335
んー、そうすると、昔は知らんが、今はシステムキュー==AWTのEDT==SwingのEDTなんじゃ?
>>330に書いたように、Java1.3 以降は
javax.swing.SwingUtilities.isEventDispatchThread() == java.awt.EventQueue.isDispatchThread()
なんだし。
337:326
09/02/11 23:57:03
>>334
説明不足でしたが
updateUI() をオーバーライドして
super.updateUI() の後に処理を書いているので
たぶん大丈夫だと思います。
338:デフォルトの名無しさん
09/02/19 21:59:44
こういうタイポとかでdeprecatedなメソッドはさすがに廃止してもいんじゃなかろうか。
URLリンク(java.sun.com)()
339:デフォルトの名無しさん
09/02/19 22:48:12
廃止したら、古いアプリケーションが動かなくなるからな。
ところで Cloneable はスペルミスなのに
Closeable は間違いじゃないんだな。
ややこしい。
340:デフォルトの名無しさん
09/02/20 13:56:33
互換用のjarを用意して、コンパイル時にはエラーにしてしまえばいいのに。
341:デフォルトの名無しさん
09/02/20 18:53:19
コンパイルエラーにする代わりに警告を出してるんでしょ。
問題ないと思うけど。
342:デフォルトの名無しさん
09/02/21 15:16:20
>>340
互換用のjar吐くフリーソフトとか作ったら需要あるかな。
メソッドシグネチャだけコピーして、どれを呼んでもErrorなげる実装とかいうやつ。
343:デフォルトの名無しさん
09/02/23 09:18:34
JDKのライセンス違反になるからダメ。
java.*、javax.*、sun.*以下のクラスは変えちゃいかんのよ。
勝手にクラス追加するのも禁止されてる。
344:デフォルトの名無しさん
09/02/24 17:34:57
JEditorPaneで単純にHTMLを表示する場合なんだけど、
<a href="#hoge">Hoge</a>
. . . . . .
<a name="hoge">ここにくる</a>
とやって、ページ内でジャンプさせることってできないんだっけか?
345:デフォルトの名無しさん
09/02/24 18:54:43
>>344
クリック監視はHyperlinkListenerで。
そこからJEditorPane#scrollToReference("#hoge")でなんとかなんないかな。
346:デフォルトの名無しさん
09/02/24 19:42:27
>>345
ありがとう!
これから試してみる。
347:デフォルトの名無しさん
09/02/24 22:07:18
>>345
ありがーと!
うまくいった。
JEditorPane#scrollToReference("hoge")
で、#はいらないようです。
348:デフォルトの名無しさん
09/02/24 22:28:04
うふっ
349:
09/02/26 20:25:14
JLabelがクリックされたとき、JLabelではなく親のコンポーネントがクリックされたことにしたいのですが
どういしたらいいでしょうか。
350:デフォルトの名無しさん
09/02/26 20:39:23
>>349
あほらしい方法だけど
public void mouseClicked(MouseEvent e) {
JComponent c = (JComponent)e.getSource();
for(MouseListener l :c.getParent().getMouseListeners()){
l.mouseClicked(e);
}
}
351:デフォルトの名無しさん
09/02/26 22:34:16
俺なら親のaddMouseListenerをオーバーライドしたいな
352:デフォルトの名無しさん
09/02/26 22:48:15
俺俺なら親にディスパッチする
353:sage
09/02/26 22:54:12
俺俺俺も親にディスパッチするな。
350 みたいに実装するなら、MouseEventを変換してやらないと。
354:デフォルトの名無しさん
09/02/26 22:57:08
まぁ俺の方がディスパッチするけどね。
355:デフォルトの名無しさん
09/02/26 23:07:01
ディスパッチってどうやってするねん?
俺も>>350みたいにリスナーぶち込みで対処したことがある
356:sage
09/02/26 23:17:41
>>355
java.awt.Component#dispatchEvent(AWTEvent)嫁。
357:349
09/02/27 00:35:17
getParent().dispatchEvent(event);が一番短くかけるみたいですね。
>>350から355のみなさん、どうもありがとうございました。
358:デフォルトの名無しさん
09/02/27 01:09:26
普通に JLabel の親に対して
addMouseListener(MouseEvent) を呼べば
>>349 に書かれてるような挙動になるけど。
359:デフォルトの名無しさん
09/02/27 01:40:53
c.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
c.removeKeyListener(this);
}
});
どさくさにまぎれて、一度だけ実行されるリスナーの小技。(流れ上、マウスリスナでないのは手抜き)
めったに使う機会がないと思うけど。。
360:デフォルトの名無しさん
09/02/27 01:54:28
それいけるんだ
Iteratorのループで出来ないかと思ってた〜
361:デフォルトの名無しさん
09/02/28 12:05:56
JComponent.setFont(new Font("メイリオ", Font.BOLD, 42))
とすると一回目だけすごく遅いんですが、フォントの読み込みは
何かテクニックがあるんでしょうか?
362:デフォルトの名無しさん
09/02/28 17:07:54
アプリケーション起動時にあらかじめ読み込んでおくくらいしかないよ
いずれにせよロード時間はかかる
363:デフォルトの名無しさん
09/03/01 17:17:19
Java SE Development Kit (JDK) 6 Update 11
Eclipse3.4.1
WindowsXP SP3
上記の環境があり、そこでGUIアプリをJavaで作成しようと思っています。
Swing(?)ってのをElipseのメニューから探したのですが、見当たりません。
JavaSEをアンインストールして、JavaEEをインストールするのが妥当な選択なのでしょうか?
それともplug-inがまた別にあるのでしょうか?
364:デフォルトの名無しさん
09/03/01 17:39:46
>>363
LANケーブルを抜いてクビをククルのが最速
365:デフォルトの名無しさん
09/03/01 17:49:20
>>364
最速か否かは聞かれてないだろww
366:デフォルトの名無しさん
09/03/01 17:54:37
exlipseの標準環境だと、swingアプリはメモ帳でhtml手打ちするようなのりで、
自分でソースコード書いて全部作ることになるっす。
net beansとかいうの使うと、VBみたいなポトペタを標準でできるらしい
eclipseもプラグイン導入するとポトペタできるらしい
が、swingでポトペタやったことないんでわかりません。
367:デフォルトの名無しさん
09/03/01 18:23:02
>>366
Swingやるなら現状ではNetBeans一択らしい。
EclipseプラグインのVE(VisualEditor)は使いもんにならんそうな。
俺はEclipseで手打ちしてるけどナー。
# EcilpseからSwingアプリを起動すると、フォント構成ファイルが無視されて、
# 日本語じゃないフォントで日本語がレンダリングされるという問題も……。
# おかしいなー、フォント構成ファイルの読み込み自体は正常に行われてるんだが。
368:デフォルトの名無しさん
09/03/01 20:00:47
つ jigloo
369:デフォルトの名無しさん
09/03/01 21:02:05
じぐるーも重いしすごくグループレイアウトが使いにくいしだめだよなぁ
370:デフォルトの名無しさん
09/03/01 22:51:25
NetBeansでGUI作って、Eclipseに持ち込んでる俺。
他にもいるでしょ、こんな人。
371:デフォルトの名無しさん
09/03/01 23:11:34
>>367
VEは使ってみて、脱力した。
正直、自分の脳内でレイアウト組んだほうがマシ。
最近は更新もされてないんじゃなかったっけ?
372:デフォルトの名無しさん
09/03/03 01:20:54
swingの印刷機能って、コンポーネント上の文字がカクカクになって印刷されるんだけど、
これって普通なの?
373:デフォルトの名無しさん
09/03/03 08:18:06
>>372
アンチエイリアスかければ?
374:デフォルトの名無しさん
09/03/03 23:11:33
>>370
余裕で俺、とウチの社内全員。
375:デフォルトの名無しさん
09/03/04 00:14:31
>>370
NetBeansでそのままつくらずに、Eclipseに持ち込む理由はなんですか
376:デフォルトの名無しさん
09/03/04 00:27:24
大技見つけたぜぃ。
Javaで比較的簡単にホットデプロイする方法。
まず、デプロイしたいクラスのベースとなるHogeを作っておきます。
そして、それを継承したHoge00というクラスを作ります。
ただし、このクラスのファイル名はHogeXX.javaという風にします。
コンパイルできなければ対策を考えますが、クラスをpublicにしなければ通るようです。
そして、修正してデプロイするときには、Hoge00をHoge01という風にクラスの名前も変えます。
ファイル名はそのままです。
クラス名を変えるとコンストラクタ名まで変えないといけません。この時の小技として
コンストラクタの処理を全て関数にしてHoge00クラスにはコンストラクタを記述しないようにします。
その為、Hogeクラスには空のデフォルトコンストラクタを用意しておきます。
あとは、コンパイルしてシステムのクラスローダを使ってHoge01クラスを読み込んで
Hogeにキャストして使用できます。Hogeにはインターフェースとなる関数を用意しておきます。
従来の方法だと別のクラスローダを使ったりするので、同じクラスを違うクラスであるとしてしまう為
キャストしたり出来ません。なので、リフレクションなどを使ってアクセスする事になります。
これがどうもうまくないと思ったので、別の方法を考えたら思いつきました。
今からサンプルを作ります。
377:デフォルトの名無しさん
09/03/04 01:39:21
URLリンク(space.geocities.jp)
ホームページに置きました。
なぜか、antから起動しないとToolProvider.getSystemJavaCompiler()がnullになってしまうので
antを使ってください。この辺を調べてみます。でゎ、おやすみ。
378:デフォルトの名無しさん
09/03/04 01:53:06
なんだか麻布の臭いがする。。。
379:デフォルトの名無しさん
09/03/04 10:33:20
GUIはまったく初心者だったけど「Javaアプリケーション作成講座」という本を読んで
だんだんわかるようになってきた
とりあえず簡単なテキストエディタやブラウザは作れるようになった
380:デフォルトの名無しさん
09/03/04 11:28:11
javax.tools.ToolProvider.getSystemJavaCompiler()がnullを返すのは
JAVA_HOME\lib\tools.jarにクラスパスが通ってない事が原因でした。
381:デフォルトの名無しさん
09/03/04 20:24:28
ネタ・・・じゃ・・・ないの・・・・か?
382:デフォルトの名無しさん
09/03/05 02:06:57
Swingに印刷プレビューダイアログってありますか?
383:デフォルトの名無しさん
09/03/05 09:36:17
作れば良いんじゃないの
384:sage
09/03/06 00:33:36
以下のバグが1.4でも6.0でも再現するんだけど、JTextField#setTextはスレッドセーフじゃないの?
それとも検証方法自体が間違ってるの?
URLリンク(bugs.sun.com)
385:デフォルトの名無しさん
09/03/06 00:42:39
swing自体スレッドセーフじゃなかったと思う
386:デフォルトの名無しさん
09/03/06 00:44:55
1.4.2で直ってないって書いてあるし、放置されてるんじゃね?
387:デフォルトの名無しさん
09/03/06 00:46:00
この再現コードみたいなことをすること自体基本的にないからなぁ
388:デフォルトの名無しさん
09/03/06 00:50:16
>>385
↓スレッドセーフだと書いてあるんだが・・・
URLリンク(sdc.sun.co.jp)(java.lang.String)
389:デフォルトの名無しさん
09/03/06 01:13:56
ざっとソースをみたところ、スレッドセーフじゃないね。
テキストのモデルであるDocumentへの書き込みがアトミックであったとしても、
UIスレッドを用いてコンポーネントから何らかの値をとってくるメソッドで
Documentのインスタンスを2回以上使うような操作をする全てのメソッドは
その間はDocumentへの書き込みを排他していないといけないはずなのだが、
少なくとも、getTextメソッドでは、そんなめんどくさいことはやってない。
390:389
09/03/06 01:15:33
ソースは Java 6 しかみてない。すまん
391:デフォルトの名無しさん
09/03/06 01:18:31
setTextする処理をEDTに投げればいいんじゃないの?的外れだったらごめん。
392:デフォルトの名無しさん
09/03/06 01:43:30
>>389
>.少なくとも、getTextメソッドでは、そんなめんどくさいことはやってない。
setTextの話だったんだけど、typo?
393:デフォルトの名無しさん
09/03/06 01:53:44
>>392
getTextが変な値を返す原因がsetTextをUIスレッド以外でアクセスしたことにあるなら、
setTextはスレッドセーフだといえる?
394:デフォルトの名無しさん
09/03/06 07:33:43
>>393
setTextの時点で変な値にならないのであれば、setTextはスレッドセーフじゃないの?
(よくわかってないかもしれん・・・)
そもそも>>384の再現コードは、getTextした値が""や"12"や"21"になることがあり、
以下のように思ってるんだが、違うかな?
""は、setTextが値を一度クリアしたタイミングで、getTextしているから。(getTextがスレッドセーフではないから)
"12"や"21"はsetTextがロックする前にAbstractDocument#getLengthを呼び出していることが原因。
(setTextもスレッドセーフではない?)
395:デフォルトの名無しさん
09/03/06 13:04:40
JavaDoc を見る限り getText() はスレッドセーフじゃないんだな…知らなかった…
別スレッドからsetText()して結果的に画面に"12"や"21"や""が描画される
ことがないのであれば setText() はスレッドセーフといえる…のかな?
でも現状は >>394 のいうようにsetText()もスレッドセーフじゃないように見えるなぁ
396:デフォルトの名無しさん
09/03/06 17:43:09
setText()のスレッドセーフを確認するのに、スレッドセーフではないgetText()が絡んでくるとややこしくなるので
setText()するたびに文字列を溜めておいて、最後に検証するというのはどうだろう。
397:デフォルトの名無しさん
09/03/06 19:28:23
AbstractDocument.readLockを使えば、少しはましになるけど、ダメだった。
たまに、"12"と"21"が出てくる。
398:デフォルトの名無しさん
09/03/06 22:27:20
swingコンポーネントをディープコピーしようとしたら、
Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: java.io.NotSerializableException: com.sun.java.swing.plaf.windows.XPStyle$Skin
っていわれるんだけど、どうすりゃいいの?
399:デフォルトの名無しさん
09/03/08 00:12:39
Beans Bindingはもう見捨てられたのかと思ってたけど、先月スペックリードが変わってるね。
これは期待してもいいんだろうか。
400:デフォルトの名無しさん
09/03/08 01:08:00
スペックリードとは仕様定めるリーダーみたいなものでしょうか?
401:デフォルトの名無しさん
09/03/10 10:41:55
複数のクラスで共用するダイアログなどで、わざわざそれぞれのフィールドとして持たせたくない場合は、UIUtilitiesなどを作ってそこでshow***といった感じで定義しても問題ないでしょうか
402:デフォルトの名無しさん
09/03/10 20:24:14
逆に何を懸念しているのかがわからない
403:デフォルトの名無しさん
09/03/14 13:39:14
Swingを勉強するのにお勧めの書籍とかある?
404:デフォルトの名無しさん
09/03/15 01:06:20
どのレベルか、どんな記述が読み易いか示さないと何とも。
405:デフォルトの名無しさん
09/03/15 01:15:03
>>404
Javaの勉強を始めたばかりで、プログラミング言語Java第四版を読み終わったところ。
まあまあ読みやすかった。訳も気にならなかった。
Head Firest Java 第二版を読んでる最中で、
面白いと思うけど、実用性には欠けると思っている。
ざっと機能を概観する入門書と、詳しい内容の2冊進めてもらえるとうれしい。
こんなところでどうでしょう。
406:デフォルトの名無しさん
09/03/15 02:16:03
swinglabs.orgがもう一週間近く死んでる。
407:デフォルトの名無しさん
09/03/15 06:07:53
頭いい人は本から入るのかね?
わしは本読んでると眠くなるんで、いきなりソースコードと戦う派なんだが
408:デフォルトの名無しさん
09/03/15 15:29:02
武闘派か。端から見てるとPCに向かって何か遣ってる引きこもりにしか見えないが。
409:デフォルトの名無しさん
09/03/15 15:39:15
>>405
詳しい内容ではないが実践的な内容ならEffective Java。
Swing関係ないけど。一通りJavaで組めるようになって開発規模が
大きくなってきた頃に手に取ると大変有用な本だと思う。
410:デフォルトの名無しさん
09/03/15 19:03:06
>>409
Swing本当に関係ないなww
Swingの本を薦めてくれ。
411:デフォルトの名無しさん
09/03/15 19:23:35
>>410
申し訳ない。ただJava勉強中のようだったのでつい。
確かにSwing関係ないけど間違いなく勉強になる良い本だよ。
「良いクセ」を学べる本なので、中級へのステップアップ時には
是非読んだ方が良いですよ。
Swing本については、他の人よろしく〜
412:デフォルトの名無しさん
09/03/15 19:27:20
>>411
気持ちはありがたいが、既に本棚にあるのだww
413:デフォルトの名無しさん
09/03/15 19:29:06
JavaはJava教室で買わされた本しかもってない、
Swingはグーグル先生に聞いてなんとかした、
読んでないからいい本なんて分からないんだぜ
Effective Javaは良さそうだな、読んでみようか
414:デフォルトの名無しさん
09/03/16 00:31:16
本ではないが、URLリンク(java.sun.com)
415:デフォルトの名無しさん
09/03/16 00:57:22
>>413
ちゃんと本を読まなかったので、
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
の必要性を知らなかった。
人が書いたコードを見ても、余計なことをしてると思っていた。
416:デフォルトの名無しさん
09/03/16 02:46:43
そんなの見た事無いや。orz
解説頼む。
417:デフォルトの名無しさん
09/03/16 03:12:48
>>416
Swingは、スレッドセーフじゃないから、初期化もイベントディスパッチスレッドで実行しないといけない。
invokeLaterを使うと後でイベントディスパッチスレッドで実行される。
418:デフォルトの名無しさん
09/03/16 03:23:09
>>416
スレッドセーフじゃないんだってさ。
419:デフォルトの名無しさん
09/03/16 10:10:35
本ならSwing Hackが実用的かも。
Swingの入門書の次くらいに読むといい本。
420:デフォルトの名無しさん
09/03/16 23:55:45
>>419
本屋でSwing Hackをみてきました。見た感じTIPS集みたいですね。
よさそうな入門書だと「Java GUIプログラミング」のVol.1, Vol2なのですが、
ちょっと本気すぎる感じです。以外にSwingの本って売ってないですね。
421:デフォルトの名無しさん
09/03/18 02:54:08
>>420
本を買う前に最初はsunのjavaサイトにあるswing関連のチュートリアルで十分じゃないか?
APIリファレンスのswingコンポーネントクラスの説明文の多くにリンクがあったりする。
422:デフォルトの名無しさん
09/03/18 02:58:11
あ、すま
>>414で紹介されてるね。
423:デフォルトの名無しさん
09/03/18 03:06:57
英語を読むのは面倒くさい
いや読むけどさ(ブツブツ
424:デフォルトの名無しさん
09/03/18 04:21:31
>>420
入門書ってどれもほとんど大差ないから。
「Java GUIプログラミング」が本気すぎるとなると習う前に慣れたほうが良いかも。
となるとSwingチュートリアルのソースがベストかな。
英文を隅々まで読まなくても、ソース読んで、実行してみればだいたいわかってくる。
425:デフォルトの名無しさん
09/03/18 20:45:24
>>424
ありがとう!やってみる。
426:デフォルトの名無しさん
09/03/18 22:52:15
JOptionPane#showXXXDialog()で適当なコンポーネントをつめたJPanelを
表示した際にダイアログのボタンじゃなくてJPanel内の特定のコンポーネントの
方にフォーカスがあたるようにすることってできる?
427:デフォルトの名無しさん
09/03/19 01:06:24
>>426
???
428:デフォルトの名無しさん
09/03/19 01:47:02
>>427
JOptionPaneをカスタマイズしてJPanelを埋め込んだ場合に、ダイアログのOK/Cancelボタンではなくて追加したJPanel内のコンポーネントに入力フォーカスを当てたい、ということだと思われる。
429:デフォルトの名無しさん
09/03/19 08:22:29
できると思う
swing フォーカスでぐぐりゃ解決しそう
430:デフォルトの名無しさん
09/03/19 11:23:07
>>428
そういうことです.わかりにくい文ですみません.
>>492
ぐぐってみました.URLリンク(terai.xrea.jp)
JOptionPane#showXXXDialog()系だとJDialogやJFrameがとれないから
FocusTraversalPolicyをセットしたりWindowLister#windowOpend()や
ComponentListner#componentShown()でrequestFocus()呼べないよなー
とか思ってました.
んで上のページの EventQueue#invokeLater() 方式を試してみましたが
手元の環境ではJOptionPaneの場合フォーカスはOKボタンの方になってしまいました…
431:430
09/03/19 11:39:29
試したコードはこんな感じです
public static void createAndShow(){
final JTextField textField = new JTextField("Hello");
EventQueue.invokeLater(new Runnable(){
public void run() {
textField.requestFocusInWindow();
}
});
int result = JOptionPane.showConfirmDialog(
null, textField, "Input Text",
JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
}
432:デフォルトの名無しさん
09/03/19 12:09:21
>>431
実際にフォーカスを取得するまで、
requestFocusInWindow() を何度も呼んでみるとか。
ちょっと力技かもしれないけど HierarchyListener を使えば
JOptionPane.showXxxDialog() で作られるダイアログを取得できる。
そのダイアログに対して
WindowListener か ComponentListener を使えばよい。
「コンポーネントが画面に表示されたときに特定の処理を行う」
って、意外と難しいよね?
JSplitPane が表示されたときディバイダを中央に移動させる方法を
見つけるのに、すごく苦労したことがある。
433:430
09/03/20 00:09:49
>>432
なるほど HierarchyListener は思いつきませんでした。これなら動きそうですね。
>>431 のコードはEventQueue#invokeLater()じゃなくて javax.swing.Timer で
1秒後とかやったら期待通り動いたんでタイミングの問題なんでしょうねぇ…
PC性能によって必要な delay 時間が変わるからTimerでやるのは微妙だなー
と思ったけど何度でも呼んでみる的アプローチで繰り返しありの Timer を
設定してフォーカスがとれたら Timer を止める、とかでもできそうですね…
434:デフォルトの名無しさん
09/03/20 01:56:28
final JTextField textField = new JTextField("Hello");
JOptionPane pane = new JOptionPane(textField, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
JDialog dialog = pane.createDialog("Input Text");
dialog.addWindowListener(new WindowAdapter() {
@Override public void windowOpened(WindowEvent e) { textField.requestFocusInWindow(); }
});
dialog.setVisible(true);
dialog.dispose();
Object o = pane.getValue();
int result = (o instanceof Integer) ? (Integer)o : JOptionPane.CLOSED_OPTION;
うそくさいし、ひどく面倒
435:430
09/03/20 13:14:55
>>434
確かに JOptionPane を直接使えばJDialogがとれますね。参考になります。
戻り値の扱い周りとかが大変面倒くさそうですけど…
436:デフォルトの名無しさん
09/03/20 13:26:02
>>432
>「コンポーネントが画面に表示されたときに特定の処理を行う」
Component#addNotify() / removeNotify()をオーバーライドでできると思う。
437:デフォルトの名無しさん
09/03/20 17:46:14
>>436
addNotify() が呼ばれたとき、
そのコンポーネントが表示されてるとは限らない。
たとえば Window.pack() を呼んだとき、
(たとえウィンドウが不可視であっても)
ウィンドウ内のすべてのコンポーネントの
addNotify() が呼ばれる。
あと、親コンテナの doLayout() が呼ばれるまでは
コンポーネントのサイズが確定しないので、
オーバーライドした addNotify() から
JSplitPane.setDividerLocation() を呼んでも機能しない。
438:デフォルトの名無しさん
09/03/21 15:59:56
JTableのセルをアニメーションして移動したり表示したりしたいのですが
どういう方法が一番いいでしょうねぇ・・・
439:デフォルトの名無しさん
09/03/21 19:12:38
単純にセルを描画する命令をタイマーで呼ぶしか方法はないのでは?
その具体的な方法でしょうか?
440:デフォルトの名無しさん
09/03/21 19:57:58
えーと、よくSFとかでありますね
上から1行ずつアニメーションしてさらさらと出てくるような表や
項目を追加したらふわっと最終行が浮かんでくる
といったような描画をどうやってやるかということに悩んでいます
Timer自体はいくらでも使えるのですが
441:デフォルトの名無しさん
09/03/21 20:18:33
JTableはセルそれぞれがコンポーネントというわけではないので、あまりスマートにはできません。
上げられた二つの例に限ってですが、代替策として、glasspaneでだますというのはどうでしょう?
それがいやなのであれば、Timerかなにかでアニメーションさせてください。
442:デフォルトの名無しさん
09/03/21 22:18:49
>>440
JXLayer使えばいいと思うよ。
443:デフォルトの名無しさん
09/03/21 23:44:17
JTreeでツールチップ表示中にホイールスクロールするとやたら重いんだが
どうにか、普通にスクロールさせる方法はないかね
444:デフォルトの名無しさん
09/03/22 04:22:23
ツールチップが重い処理だからそんなもの。
無効にするしか。
445:デフォルトの名無しさん
09/03/22 13:51:40
>>443
ツールチップを常に重量コンポーネントとして表示すればよいと思う。
普通 JScrollPane でコンポーネントがスクロールされるときは、
現在表示されているビューポートの外観を少しずつずらしてコピーすることで、
高速なスクロールを実現している。
しかし、軽量コンポーネント(たとえばツールチップ)が
上のレイヤーに重なっているときは、
スクロールされるたびにビューポート全体を再描画しなくてはならないので遅くなる。
446:デフォルトの名無しさん
09/03/22 20:35:26
>>441
ありがとうございます
GlassPaneを調べてみますね。それ以外の場合、Timerでアニメーションするとよいとのことですが
アニメーションの内容はどのようなものを?
TableSellRendererやJTableなどをいくら拡張しても中々難しそうですね・・・
>>442
なかなかすごそうなコンポーネントです。これはどういうものでしょうか?
447:デフォルトの名無しさん
09/03/26 02:49:32
最近beansBindingを触って疑問に思ったのですが、
ColumnBindingに対してvalidatorを設定した場合、
バリデーションエラーが発生した行の取得はどのようにすればよいのでしょうか?
448:デフォルトの名無しさん
09/03/28 01:00:27
横方向に中央であればFlowLayoutでシンプルに実現できますが、縦方向に中央に配置したい場合の簡単な実現方法はありませんでしょうか?
449:デフォルトの名無しさん
09/03/28 07:03:52
>>448
Y_AXISなBoxLayoutで子コンポーネントそれぞれにsetAlignmentX()でCENTER_ALIGNMENTを設定するのは?
FlowLayoutと違って子コンポーネントの幅は推奨サイズでなく最大サイズに影響されるので、
推奨サイズにしたいなら子コンポーネントの種類次第では最大サイズを設定してやらないといけないけれど。
450:デフォルトの名無しさん
09/03/28 10:24:26
private static JLabel createLabel(String text){
JLabel lb = new JLabel(text);
lb.setAlignmentX(Component.CENTER_ALIGNMENT);
lb.setMaximumSize(new Dimension(300,30));
return lb;
}
public static void main(String[] args) {
JPanel pn = new JPanel();
pn.setLayout(new BoxLayout(pn,BoxLayout.Y_AXIS));
pn.add(createLabel("hoge"));
pn.add(createLabel("fuga"));
//...
}
このようなコードで試してみましたが、やはりY方向には上に詰められてしまいます。
中央寄せしたいコンポーネントの上下をBox.createVerticalGlue()で詰めるというのはありでしょうか?
451:デフォルトの名無しさん
09/03/28 12:54:35
>>450
縦方向に中央揃えでコンポーネントを並べることと勘違いしてた。
Box b = Box.createVerticalBox();
b.add(Box.createVerticalGlue());
b.add(コンポーネント);
b.add(Box.createVerticalGlue());
みたいな感じでいけるんじゃないかな。
でももしかすると上下のグルーが同じ比率で伸びずに完全なセンタリングにならないかも。
その場合、どれくらいで簡単な実現方法とならないかが分からないけれど、
GridBagLayoutやGroupLayoutみたいな少し複雑なレイアウトマネージャを使うとか、
縦方向について中央配置するマネージャを自作するとか。
452:デフォルトの名無しさん
09/03/28 12:57:58
>>450 縦に中央ってこんな感じ?
JLabel label1 = new JLabel("Hello, World!!");
label1.setBorder(BorderFactory.createTitledBorder("label1"));
label1.setAlignmentX(JComponent.CENTER_ALIGNMENT);
JLabel label2 = new JLabel("Goodbye, world!!");
label2.setBorder(BorderFactory.createTitledBorder("label2"));
label2.setAlignmentX(JComponent.CENTER_ALIGNMENT);
JPanel inPanel = new JPanel();
inPanel.setLayout(new BoxLayout(inPanel,BoxLayout.Y_AXIS));
inPanel.add(label1);
inPanel.add(label2);
inPanel.setAlignmentY(JComponent.CENTER_ALIGNMENT);
inPanel.setBorder(BorderFactory.createTitledBorder("in"));
JPanel outPanel = new JPanel();
outPanel.setLayout(new BoxLayout(outPanel,BoxLayout.X_AXIS));
outPanel.add(inPanel);
outPanel.setBorder(BorderFactory.createTitledBorder("out"));
JFrame frame = new JFrame("VerticalCenterLayout");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//frame.add(BorderLayout.WEST, outPanel);
frame.add(BorderLayout.CENTER, outPanel);
frame.pack();
frame.setVisible(true);
453:デフォルトの名無しさん
09/03/29 13:32:37
初心者です。
javaでゲーム製作の本を買って、
コードがすべてAWTで書かれてるんですが、
swing用の本を買いなおしたほうがいいですか?
454:デフォルトの名無しさん
09/03/29 15:23:18
>>453
別にそんなことないだろ。
Swingの本なら、awtの知識は前提としているだろうし。
455:デフォルトの名無しさん
09/03/29 17:13:35
>>454
ありがとうございます。
今の本で勉強してみます。
456:デフォルトの名無しさん
09/03/29 23:39:38
>>453
時間の無駄をいとわないならその本でOK。
時間の無駄がいやなら買いなおすべし。
457:デフォルトの名無しさん
09/03/30 00:44:33
ゲームを作るつもりでその本を買ったなら Swing の本を
買い直す必要は全くないと思うが…
Swing の勉強をするつもりで買ったの?
458:デフォルトの名無しさん
09/03/30 04:25:34
あとでswingの本読んで、swing化してみるのは実力が付いていいと思うけどね。
基本は大事。
459:デフォルトの名無しさん
09/03/30 06:53:59
>>440
>>453
ゲームで、グラフィック表示ばっかりなら、Swingはあまり関係ないと思われる。
java.awt.Graphics2Dを使ってるから「コードがすべてAWT」というオチではないよな?
460:デフォルトの名無しさん
09/03/30 09:44:16
440関係なかった・・・
461:デフォルトの名無しさん
09/03/30 09:49:53
javaでゲームだと結局java2dだとか3d使うんだべ
462:デフォルトの名無しさん
09/03/30 11:50:26
そんなことないべ。
コマンドアドベンチャーとかなら、普通に既存コンポーネントだけで作れるべ。
463:デフォルトの名無しさん
09/03/30 17:57:11
>>461
シミュレーションだとJava2DとSwingでがっちり組むみたいよ。
最近ので、ちょっと期待してしまうDarkSideとか
URLリンク(www.darkside-game.net)
自分ではJava3Dを使いたいんだけど再配布がな・・・
464:デフォルトの名無しさん
09/03/30 22:06:37
>>463
Java Web Startにすると、そのあたりも自動でインストールしてくれるらしい
465:デフォルトの名無しさん
09/04/02 23:33:46
>>464
そんなうまい話があるわけない。
開発者の手間は変わらない。(JNLPの分面倒か)
466:デフォルトの名無しさん
09/04/03 04:05:32
>>465は技術者として終わっとるな。
467:デフォルトの名無しさん
09/04/03 04:11:55
Java Web StartでのJava3D配布は、このあたりで話題になってた
スレリンク(tech板:909-915番)
詳しくはここを
URLリンク(j3d-webstart.dev.java.net)
これが参考になるかもしれない。
URLリンク(ziddy.japan.zdnet.com)
468:465
09/04/03 07:15:22
>>466
"自動で"とか勘違いさせるような発言について書いたんだが
469:デフォルトの名無しさん
09/04/03 08:21:42
Java3Dサイトのデモでは自動でJava3Dがインストールされるように見えるが。
470:デフォルトの名無しさん
09/04/03 08:59:32
スタンドアロンでも普通に実行できるようにならんかね
ネットワークアクセスしてもいいから
471:デフォルトの名無しさん
09/04/03 09:41:54
jarファイルにすれば実行できるぞ
472:デフォルトの名無しさん
09/04/03 11:24:57
JFileChooser で、ファイルチューザーのダイアログを開いた時に表示されるディレクトリを
マイコンピュータにしたいんですが、どうしたらいいでしょうか?
473:デフォルトの名無しさん
09/04/04 16:14:59
任意のファイルを自動でインスコできたら、セキュリティ上問題が有るな。
474:デフォルトの名無しさん
09/04/04 18:51:59
だから認証が出るわけだな。いまさら何を。
475:デフォルトの名無しさん
09/04/05 04:49:56
マニフェストに記述した JAR 内の画像をアイコンにするくらいしてほしいね。
まぁ JWS でデスクトップに好きな画像のショートカットアイコン作れるけどさ。
476:デフォルトの名無しさん
09/04/05 12:17:50
テキストを編集できるフレームで特定の文字がある行だけ
編集不可能にするにはどうしたら良いでしょうか。
netBeansのエディタみたいにするには?
477:デフォルトの名無しさん
09/04/05 14:27:24
カーソル移動のイベントを受け取って、その位置の含まれる行を見て
setEditable() で切り替えるとか。
478:デフォルトの名無しさん
09/04/05 15:35:57
実際にやったことないから分からないけど
DocumentListener とか使うのでは
479:デフォルトの名無しさん
09/04/05 15:38:42
あるいは CaretListener を使って
キャレットが移動するたびに必要に応じて
setEditable(boolean) を呼ぶとか。
こっちのほうがいいかも。
480:デフォルトの名無しさん
09/04/07 14:41:24
>>477,478,479 さんありがとうございます。
試してみます。
481:デフォルトの名無しさん
09/04/14 19:46:23
スレが過疎ってるスキに、くだらないこと書かしてもらうが
FileSystemView fileSystemView = FileSystemView.getFileSystemView();
この冗長さは、どうにかならんのか?
482:デフォルトの名無しさん
09/04/14 19:49:55
IME にでも登録しとけよ。俺は Eclipse のオナペット使うけど。
483:デフォルトの名無しさん
09/04/14 20:03:54
>>481
嫌ならもう少し短い変数名使えば?
484:デフォルトの名無しさん
09/04/14 23:28:39
ラッパ書いてヲレフレームワークに突っ込めよ。
import ore;
ore = new ore.gFSV();
で出来るようになるぜ。
485:デフォルトの名無しさん
09/04/15 01:13:41
Nimbusのとかに比べると、まだまだだな。
InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedState.java
486:デフォルトの名無しさん
09/04/15 17:57:46
単にクラス名が長いというだけじゃなくて、
おなじ行に3回も FileSystemView と書かなくてはならないのが問題というか。
せめて、こうするべきだったのでは。
FileSystemView fsv = FileSystemView.instance();
Toolkit.getDefaultToolkit() も同罪。
487:デフォルトの名無しさん
09/04/15 18:00:07
get付けてgetInstance()にしようぜ
488:デフォルトの名無しさん
09/04/16 00:47:23
その程度の工夫ではJavaの冗長さはびくともしないぜ
おとなしくIDEに補完させましょう
# 型推論があればもうちょっとなんとか…
489:デフォルトの名無しさん
09/04/16 09:07:28
しかしHashMapを格納するときにMapで宣言するJavaの文化が型推論の導入を阻むのだった
490:デフォルトの名無しさん
09/04/16 23:43:57
型推論って型の宣言必要ないんだが。
491:デフォルトの名無しさん
09/04/17 00:01:30
>>490
Javaっぽい書き方
Map<String, String> map = new HashMap<String, String>();
いわゆる型推論
final map = new HashMap<String, String>();
↑HashMap<String, String>と補完される。
結局上みたいなやつじゃなくてコンストラクタの型引数が省略可能になるだけになったらしいが。
492:デフォルトの名無しさん
09/04/17 00:08:21
ゲネリックス を始めて触った時に typedef が欲しくなったのは俺だけではあるまい。
493:デフォルトの名無しさん
09/04/17 00:15:51
型推論っていえるのか・・・。
494:デフォルトの名無しさん
09/04/17 06:35:02
言語仕様談義はGUIと関係ないずら
495:デフォルトの名無しさん
09/04/18 00:34:16
JEditorPaneにsetTextで500KBくらいのHTMLを読ませると、表示にもの凄く時間がかかるんだが何かいい方法は無いですかい
496:デフォルトの名無しさん
09/04/18 01:09:10
Swing を捨て SWT の Browser クラスを使う。
497:デフォルトの名無しさん
09/04/18 01:45:50
>>496
SWTって本を見かけないから全く触れたことないなあ。
軽いのならちょっと調べてみる、d
498:デフォルトの名無しさん
09/04/18 01:57:11
500kだとブラウザでも遅いと思うんだがSwingはさらにシングルスレッドだからね。
499:デフォルトの名無しさん
09/04/18 05:55:19
>>498
シングルスレッドってw
500:デフォルトの名無しさん
09/04/18 11:28:27
イベントディスパッチスレッドがひとつしかないことを言ってるのでは
501:デフォルトの名無しさん
09/04/18 11:31:55
>>498
現存するGUIツールキットでスレッドセーフなものは無いぞ。
502:デフォルトの名無しさん
09/04/18 17:33:32
というか、JWebPaneは今どうなってんの?
503:デフォルトの名無しさん
09/04/18 18:49:46
誰か、というかの前を補完してくれ〜
504:デフォルトの名無しさん
09/04/18 20:50:07
>> 497
軽いけれど役立たずだよ。
505:デフォルトの名無しさん
09/04/19 07:12:42
Java でカスタムブラウザみたいなものを作ろうと思ったら SWT 一択だろ。
それ以外は特にいらないけど。
506:デフォルトの名無しさん
09/04/19 11:10:11
カスタムブラウザ自体がアレ。
自前でパースして適当に配置したほうが(ry
507:デフォルトの名無しさん
09/04/19 11:23:39
Google Map とか自前でパースして動かすんかい。エラい再発明家だな。
508:495
09/04/19 15:11:00
SWT調べてみたけどSwingと連携させるのはなかなか厄介そうだね。
Swingでやるとして、500KBのHTMLを一気にでは無く少しずつ表示させることは出来ないだろうか。
スレッドを使ってやってみたら、HTMLの先頭部分は表示できたんだけどスクロールができない、助けて
509:デフォルトの名無しさん
09/04/19 15:39:35
operaはHTML自体はメモリに読んどいて表示はウィンドウに見えてる部分だけ描画する。
メモリ減らしたいならそんな感じだがスクロール早くしたいなら
スクロール時の描画アルゴリズムを考えるとかじゃなかろうか。
510:デフォルトの名無しさん
09/04/20 05:26:43
Swing の全コンポーネントをヘビーウェイトにするとか、そういうオプションないんだっけ?
EDT 処理やコンポーネントは相互変換できるから、あとそれができれば SWT との混在も
不可能じゃなさそうな気がするけど。
511:デフォルトの名無しさん
09/04/20 06:58:54
ポップアップメニューくらいなら重量にできるけど
512:デフォルトの名無しさん
09/04/20 08:59:15
ヘビーとライトが混ざると変に重くなるとか
さっさと俺アプリを修正しよう
513:デフォルトの名無しさん
09/04/20 15:07:48
長いので、何回かに分けて質問します。
次のプログラムを実行して、サブフレーム表示ボタンを押すと描画領域を含むサブフレームが表示されるのですが、
サブフレームのクローズボタンを押して閉じてから再度サブフレーム表示ボタンを押すと、サブフレーム表示の瞬間に
ちらつきが起こります。一瞬白い部分が見えてから黒く塗りつぶされるのが目につくのです。JFrameのコンテントペインは
isDoubleBuffered() がtrueになるので、自動的にダブルバッファリングしてくれるはずと私は理解しているのですが、
なぜかちらつきが起こります。ちなみにactionPerformedメソッドをコメントアウトしてある方に置き換えるとちらつきが
起きないようです。しかし、この回避策はスマートとは言えませんし、なぜこれでうまくいくのかも不明です。
適切な解決策をご存知の方、ご教授ください。私の環境はMac OS X 10.4.11 J2SE 5.0です。
514:デフォルトの名無しさん
09/04/20 15:11:27
513続き
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JFrameTest extends JFrame{
JFrame subFrame;
DrawArea drawArea;//subFrameに貼り付ける描画領域
JButton button;//subFrame表示ボタン
public static void main(String[] args){
JFrameTest f=new JFrameTest();
f.setVisible(true);
}
public JFrameTest(){
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
button=new JButton("サブフレーム表示");
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(subFrame==null){
subFrame=new JFrame();
DrawArea drawArea=new DrawArea();
subFrame.add(drawArea,BorderLayout.CENTER);
}
subFrame.setBounds(210,0,500,400);
subFrame.setVisible(true);
}
515:デフォルトの名無しさん
09/04/20 15:13:16
513続き
/*
public void actionPerformed(ActionEvent e){
if(drawArea==null){
drawArea=new DrawArea();
}
if(subFrame!=null){
subFrame.dispose();
}
subFrame=new JFrame();
subFrame.add(drawArea,BorderLayout.CENTER);
subFrame.setBounds(210,0,500,400);
subFrame.setVisible(true);
}
*/
});
getContentPane().add(button, BorderLayout.CENTER);
setSize(200,100);
}
class DrawArea extends JComponent{
public void paintComponent(Graphics g) {
g.fillRect(0,0,getWidth(),getHeight());
}
}
}
516:デフォルトの名無しさん
09/04/20 15:14:33
513
以上です。
517:デフォルトの名無しさん
09/04/20 18:30:14
>>513
手元の環境(OS X 10.5.6 Java 1.6.0_07) だとどちらの
コードでも初回表示の時からちらつく.
>DrawArea drawArea=new DrawArea();
>System.out.println("drawArea.doubleBuffered : " + drawArea.isDoubleBuffered());
としたときどうなるか?
518:513
09/04/20 23:49:50
>>517
もちろんfalseと表示されますね。JComponentのdoubleBufferedはデフォルトでfalseですから。
URLリンク(wisdom.sakura.ne.jp)
を参考に
public void actionPerformed(ActionEvent e){
if(subFrame==null){
subFrame=new JFrame();
subFrame.getRootPane().setDoubleBuffered(true);
((JComponent)subFrame.getContentPane()).setDoubleBuffered(true);
DrawArea drawArea=new DrawArea();
subFrame.add(drawArea,BorderLayout.CENTER);
}
subFrame.setBounds(210,0,500,400);
subFrame.setVisible(true);
}
と変えてみましたが、結果は同じでした。
これってどうしようも無いんですかねえ。実はJFrameだけでなく、JDialogでも同様のことが起こるわけですが、
みなさんこの辺のことは不満を感じないのでしょうか。まあ実用上問題はないのだけれど、見た目も大事だと思うんですよ。
519:デフォルトの名無しさん
09/04/21 00:55:01
JListはsetVisibleRowCountで縦の長さを指定できますが、
横幅を指定するのはどうやるのでしょうか?
DefaultListModelで3文字ぐらいをaddしても横幅は8文字分とかにしたいです。
520:デフォルトの名無しさん
09/04/21 01:59:41
519ですが調べてみたら何とか解決しそうです。
521:デフォルトの名無しさん
09/04/21 02:30:23
マカウザイ。マクのはサン純正じゃないからアポーに問い合わせろ。
522:デフォルトの名無しさん
09/04/21 05:20:38
N+あたりの一部のキチガイのせいで Mac と聞いただけで過剰反応する奴が増えたなぁ。
コンピュータ関係だと使いやすい Unix 端末として使ってる人も多そうなのに。
523:デフォルトの名無しさん
09/04/21 08:13:22
先入観だけど、多く…ないと思う、多いの?
Macは昔から嫌いだが、MacのJavaは動作が違うのか妙に嫌われてるな
524:デフォルトの名無しさん
09/04/21 08:43:10
今日JJUGのイベントにいくんだけど、「複数のGUIウィンドウプログラムが動くシングルウィンドウシステムとその応用」
を発表する会社のページ見るとかなりトンデモな発表になりそうで今から楽しみだぜ、
URLリンク(www.sys-audit.com)
525:デフォルトの名無しさん
09/04/21 08:53:44
>>524
そこ読んだ限りでは単なる C/S システムライクなアプレット実装だな。
つうかページ一番下
> 探偵を使って当研究所関係者を執拗に尾行する企業があります。社員として採用してただ
> 同然で技術を入手しようとお考の上でのことでしょうが、暴力行為であり甚だしい
> 人権侵害ですのでお止めください。不正競争防止法に触れる可能性もあります。
妄想ワロタw
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5496日前に更新/137 KB
担当:undef