トップページ⇒tech
1001コメント326KB

Java標準低速GUI 6 AWT/Swing

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/09/26(水) 20:51:18
ハードウェアの高スペック化、描画アルゴリズムの変更、JavaVMの高速化に伴い、パフォーマンスの問題は改善されています。
しかしながら、"Java"というだけで未だに敬遠されるのが現状。
そんなSwingと引き続き付き合っていくみんなのスレッドです。
Java低速GUI Swing 5 (前スレ)
http://pc11.2ch.net/test/read.cgi/tech/1161139809/
Java低速GUI Swing 4
http://pc8.2ch.net/test/read.cgi/tech/1140533866/
Java低速GUI Swing 3
http://pc8.2ch.net/test/read.cgi/tech/1121700954/
Java低速GUI Swing 2
http://pc8.2ch.net/test/read.cgi/tech/1095398949/
Java低速GUI Swing
http://pc5.2ch.net/test/read.cgi/tech/1062271447/l50
0688デフォルトの名無しさん2007/12/21(金) 13:33:04
仕事ではGridBagLayoutが基本かな・・・
NetbeansのGridBagLayoutのエディタが無いと仕事にならんね・・・・
もうちょっと進化してくれても恨まないけど・・・・

複数のレイアウトマネージャを組み合わせて、
がちっと作り込むのは実はむしろ趣味のほうだったりする。
それでも、GridBag,Groupを手で書くのは調整くらいはできても、まぁ正直無理。
0689デフォルトの名無しさん2007/12/21(金) 13:37:50
レイアウトマネージャの組み合わせはわりと普通に使う

ただ、GropuLayoutがでてしまったおかげでほとんどそれ1本でいけるようになっちまった
0690デフォルトの名無しさん2007/12/21(金) 13:47:57
GropuLayoutはいいよね。使いたい。
でもそのためにはJavaのバージョンを6にしないとだめなんだよなー
まだ1.4だしなー
先は長いな・・・
0691デフォルトの名無しさん2007/12/21(金) 13:50:37
GropuLayout
0692デフォルトの名無しさん2007/12/21(金) 13:58:22
パッケージが違っていいのなら1.4から使えた希ガス。
5.0からだったかな?

来年登場予定のJavaSE7がでると1.4は保守されなくなるから。
保守契約結んでいるなら5.0以上でも動くようにしていったほうがいいね。
0693デフォルトの名無しさん2007/12/21(金) 16:55:49
1.4はとっくにEOL。jdk7が出てから死ぬのは1.4.2
0694デフォルトの名無しさん2007/12/21(金) 19:39:20
GroupLayoutが出たときにEclipseからNetBeansに乗り換えようかなと考えたけど
GroupLayoutが、考え方が非常に明快な上に
頭で考えたことを素直に反映できる優秀なレイアウトだったので、やめた
0695デフォルトの名無しさん2007/12/21(金) 19:40:22
なんじゃそりゃ
0696デフォルトの名無しさん2007/12/21(金) 19:45:29
難読化
0697デフォルトの名無しさん2007/12/21(金) 19:50:41
IDEなしじゃGUIも扱えない奴ってどうなん?
JTableとかテキストフィールドで再現してそう
0698デフォルトの名無しさん2007/12/21(金) 19:56:51
それはないだろ
0699デフォルトの名無しさん2007/12/21(金) 20:16:43
無知の自覚がない無知は無知のまま放置がベスト
0700デフォルトの名無しさん2007/12/21(金) 21:17:20
>>670
GUIエディタは便利だけど、業務アプリでそういうのでサックリ作っちゃうと
後々火を吹くから俺のPjでは使わない。

>>685
イタイな
0701デフォルトの名無しさん2007/12/21(金) 21:46:14
GroupLayoutってさ、vGroupとかhGroupとか使ってコンポーネントのレイアウトを決めるわけだけど、
なんか冗長な記述だよな。これは仕方ないのか?
0702デフォルトの名無しさん2007/12/21(金) 21:46:20
>>700
GUIに頼らずにどこまでできるかで、決定的な差が出る場面ってあるからね。
このスレではアマチュアが多いのか、あまり良く分かってない人が多いようだけど。
0703デフォルトの名無しさん2007/12/21(金) 22:05:17
>>700
えぢたを使って火を噴くって例えばどんなの?
0704デフォルトの名無しさん2007/12/21(金) 22:21:03
ロジックを画面実装で埋め込ませなければ大丈夫じゃないか?
ウチではハンドラをあとからインジェクションする仕組みで使ってるが・・・
0705デフォルトの名無しさん2007/12/21(金) 22:24:13
>>704
確かにそうだね。
完全にGUI担当者がデザイナと化してくれれば問題はないよね。
あとは、GUI担当者が皆一様の作法を身につけてくれることが重要かな。
そのためにもGUIデザインのためのフレームワークみたいなものは欲しいね。
0706デフォルトの名無しさん2007/12/21(金) 22:27:10
SwingApplicationFramework
0707デフォルトの名無しさん2007/12/21(金) 23:59:58
デザイン関係ない
0708デフォルトの名無しさん2007/12/22(土) 06:26:42
GUIエディタ使って火噴くって、どんだけ低レベルなんだよ
0709デフォルトの名無しさん2007/12/22(土) 07:39:23
>>708
おまえ程低くないと思うよ。
0710デフォルトの名無しさん2007/12/22(土) 08:06:29
煽りあいしかできないのか。ちょっとは期待してたんだが。
0711デフォルトの名無しさん2007/12/22(土) 12:13:06
>>706
それはどっちかというとGUIアプリの処理手順をフレームワーク化してるよね
ちょっとわかりにくいかもだけど、俺がいいたいのは、「GUIデザイン」部分のフレームワーク。
そういうのがあったらいいなぁなんてオモタわけ。
うーん伝わらないか。。。
0712デフォルトの名無しさん2007/12/22(土) 12:45:00
>>700をはじめとして釣りがまざってるので注意
0713デフォルトの名無しさん2007/12/22(土) 15:44:41
IDEがないと何も出来ません><ってやつが大勢を得る事なんてないから黙ってようね
0714デフォルトの名無しさん2007/12/22(土) 16:01:58
原因不明のバグが出たらとりあえず全部調べるんじゃね
0715デフォルトの名無しさん2007/12/22(土) 16:22:38
IDEていうかGUIビルダみたいなRADのこと言ってんだろ湧いて来る厨は。
0716デフォルトの名無しさん2007/12/22(土) 16:26:24
せいぜいメインウィンドウのメニューや、そこから辿れる設定ダイアログまでだな。
3ペインアプリとかは手書きじゃないと満足いくものはできないだろ
0717デフォルトの名無しさん2007/12/22(土) 16:32:42
3ペインなら今手書きで作ってるが・・・。
0718デフォルトの名無しさん2007/12/22(土) 18:37:38
GUIエディタ使うってのは、業務アプリの画面とかダイアログだろ。
0719デフォルトの名無しさん2007/12/22(土) 18:39:31
IDEじゃ何もできません><ってやつは使い物にならんよなぁ。
ツール使えばすぐできることを、なんだかんだいいながら手書きでやるんだけど、無駄に時間かかるし古い機能しか使ってなかったり。
0720デフォルトの名無しさん2007/12/22(土) 18:46:41
>>718
なるほどね。業務アプリって画面びっしりコントロールをつけるからなw
0721デフォルトの名無しさん2007/12/22(土) 19:00:30
>>719
まともなコードが書けるかどうかが重要であって、
IDEの使用経験の有無は大した問題じゃない気がする

IDE使ったことない奴には使い方を教えてやるだけで済むが、
プログラミングのセンスがない奴はいくら教えてもどうにもならん
0722デフォルトの名無しさん2007/12/22(土) 19:10:38
もういいからVB使っとけよ。
0723デフォルトの名無しさん2007/12/22(土) 19:11:51
VBにSwingってあるの?
0724デフォルトの名無しさん2007/12/22(土) 19:15:21
>>721
でもIDEの慣れの差はやはり大きい
NetBeansを長年使ってきた人はさくさくつくれるけど、
Eclipseしか触ってこなかった人は開発効率が悪い

1,2年たつと違うんだろうけどね
0725デフォルトの名無しさん2007/12/22(土) 19:17:27
>>724
結局それがいいたかっただけか。
マジレスしなくてよかった。
0726デフォルトの名無しさん2007/12/22(土) 19:19:44
>>725
俺今日はじめて書きこんだんけど
0727デフォルトの名無しさん2007/12/22(土) 20:00:38
業務アプリだと、こんな感じで入力項目があるからな。
http://www.epson.jp/products/oen/products/kyuyo_lite/img/img_kyuuyo02.gif

ツール使わずにやるのは非効率極まりない。
0728デフォルトの名無しさん2007/12/22(土) 20:45:36
>>727
俺が仕事で作ってる業務アプリは、こんなもんじゃねーぞ・・・
タブで分かれて細かい設定項目が山のようにある。
あんなの手書きしてたら気が狂うわ。
0729デフォルトの名無しさん2007/12/22(土) 20:48:02
普通に100個ぐらいコンポーネントあるよね
0730デフォルトの名無しさん2007/12/22(土) 21:12:10
まだ言い合ってるのか。お前らも飽きないな
0731デフォルトの名無しさん2007/12/22(土) 21:22:46
業務アプリじゃJTableやJTreeはめったに登場しないしな
そういう人らは使えばいいんじゃない?
0732デフォルトの名無しさん2007/12/22(土) 21:24:25
JTableは使用しまくりだよ
0733デフォルトの名無しさん2007/12/22(土) 21:32:13
>>731
JTable使いまくりだけど・・・
検索結果を大量に表示したりせんの?
まあ、めったにJTreeは使わんけど。
0734デフォルトの名無しさん2007/12/22(土) 22:44:43
テーブルがでてこないアプリってあるか?
ツリーはあんまりないけど
0735デフォルトの名無しさん2007/12/22(土) 22:53:20
個人開発だけどツリーの方がよく使う。JTableはスプレッドシートだから業務アプリでよく使うんじゃない?
0736デフォルトの名無しさん2007/12/23(日) 01:19:09
アプリ毎で性格違うんだから、自分の携わったプロジェクトの経験だけあげてもしかたない。
でも、部品の利用のされ方ってのは興味深いな。

アプリで使われてる場面がどれくらいあるのか、
JTableなんかのレンダラとかもどうされてるか気になる。
デフォルトで行ける場面ってどれくらいあるのかとか。

Swingのデフォルト部品って、あと一味足りないみたいなとこあるからなぁ。
というか、特にJTableに感じるんだけど。
(表の真ん中にスクロールバー付けたいなぁ、とか)
0737 2007/12/23(日) 03:03:49
Swingでキャッチされない例外が起きてもプログラムは終了しませんよね。
エクリプスとかで走らせてるとoutputに表示されるけど、コマンドプロンプトから走らせるとキャッチされない例外が起きてるのが分かりません。
これを知るにはどうしたらいいのですか?
検出してログをとるなり、メッセージダイアログを表示するなりしたいんです。
0738デフォルトの名無しさん2007/12/23(日) 05:31:30
sun.awt.exception.handler で検索汁
0739デフォルトの名無しさん2007/12/23(日) 11:06:01
throwsして無けりゃなんか表示するとおもう
0740デフォルトの名無しさん2007/12/23(日) 11:13:30
>>736
> 表の真ん中にスクロールバー付けたいなぁ
それは一味も二味も違うだろ w
それができるテーブルコントロールなんて他の言語でも見たこと無いけど。
まあ、俺なら二つのテーブルを並べて、スクロールを同期させるかな。
0741デフォルトの名無しさん2007/12/23(日) 11:42:12
>>738
どうもありがとうございます!
>>739
jarにしてダブルクリックで起動したりもするので、windowsだと何も表示されないのです。
0742デフォルトの名無しさん2007/12/23(日) 16:28:19
>>741
java -jar file.jar
と「ファイル名を指定して実行(R)..」すれば
例外は全部コンソールに表示される
0743デフォルトの名無しさん2007/12/23(日) 19:40:17
というか例外はアプリケーションのどっかの層で拾って
ユーザーにGUIで見せて後は処理続けるかどうかは状況次第っていうように組むもんだが。

System.errにテキストコンポーネント突っ込んでやると楽。
0744デフォルトの名無しさん2007/12/24(月) 00:02:41
>>743
その、「アプリケーションのどっか」にこないから問題っていってるんじゃねぇの?
738で解決するようだけど。
0745デフォルトの名無しさん2007/12/24(月) 01:58:17
例外の対応は場所によって個別対応するしかないよ。
問題ない例外なのかそうでないのかは単純に判断できないし。

運用時ならテキストファイルにログを書き出しておいてそこをメールで添付させるように促すとか
画面のスナップショットを自動でとってdesktopに自動でbmp作ってそれを添付させるとか
まぁいろんな方法があるわな。
0746デフォルトの名無しさん2007/12/24(月) 14:15:13
NetBeans6.0ってJTable使うのにほとんどの場合面倒な設定を直書きしなくてよくなったのな。
新機能であまり取り上げられていないけどこれはすごいな。
0747デフォルトの名無しさん2007/12/25(火) 14:46:26
SwingでPopup形式でJPanelとかJTableとかを表示したいのですが、どう書けばよいでしょうか?
0748デフォルトの名無しさん2007/12/25(火) 15:34:33
複雑なロジックの入ったものならポップアップよりダイアログにするほうがいいけど、ポップアップじゃないとダメ?
JDialogを普通に使うほうがいい場合もあると思うけど。

JPopupMenuは想定される素の状態だとメニューバーと同じくアクションボタンを並べるものだけど
例によって自由にカスタマイズできるので継承するといいかも。
0749デフォルトの名無しさん2007/12/25(火) 15:41:53
>>748
JFrameの上に出せるWindowなら何でも良いというくらいの意味だったんですが、Dialogでやろうと思います。
JPopupMenuがカスタマイズできるとは知りませんでした。ありがとうございます。
0750デフォルトの名無しさん2007/12/26(水) 00:00:31
Swing Application Framework でメニューバーとかツールバーを実装する場合の作法を教えてちょ。
0751デフォルトの名無しさん2007/12/26(水) 00:26:58
>>750
NetBeansでデスクトップアプリケーションで作ると
メインフレームがメニューとか作られるから参考にするとよろし
0752デフォルトの名無しさん2007/12/26(水) 00:29:32
>>751
サンクス。
いつもEclipseばっかり使ってたもんで、NetBeansには疎いんですが、
機能的には遜色ないですかね?
Eclipseでいうところの「呼び出し階層を開く」とかそういうのはありますかね?よく使う機能なので。
0753デフォルトの名無しさん2007/12/26(水) 01:25:27
宣言をしてる場所にとんだりする機能?

CTRL+クリックでとぶよ
キー操作だけだとどこだったかはわすれたけどEclipseと同じキー設定もあったような気がする

乗換えとかじゃなくて参考に出来ればよいと考えるといいかも

でも、GUIアプリ開発とWebアプリ開発が目的なら乗り換えるほうが楽だと思う
Swing Application Framework対応していて、@Actionとかぜんぶやってくれるよ
0754デフォルトの名無しさん2007/12/26(水) 08:37:12
>>753
そっちの機能じゃなくて、選択したメソッドがどこから呼び出されているかを一覧する機能。
かなり重宝してる機能なのであったらいいんだけど。
0755デフォルトの名無しさん2007/12/26(水) 13:14:07
呼び出し元なら普通に昔からあるけど。
0756デフォルトの名無しさん2007/12/27(木) 00:09:33
あるオブジェクトをある場所に移動させていきたい時に、
オブジェクトのxとyを少しづつ変化させているんですけど、どうやるのがベターですかね?
オブジェクトはいろんな場所に発生するので、
if (x > 行き先X) {
0757デフォルトの名無しさん2007/12/27(木) 00:10:11
すいません 途中でした。
続き
if (x > 行き先X) {
0758デフォルトの名無しさん2007/12/27(木) 00:13:28
すいません 途中でした。
続き
if (x > 行き先X) {
x -= 5;
} else {
x += 5;
}
if (y > 行き先Y) {
y -= 5;
} else {
y += 5;
}
こうやってるんですけど、こうするとxかyのどちらかが行き先に到達した場合に、
ぷるぷる震えた感じになっちゃうんですけど、なにかうまい方法ありますかね?
0759デフォルトの名無しさん2007/12/27(木) 00:13:37
それはSwingの問題なのか??
0760デフォルトの名無しさん2007/12/27(木) 00:15:21
単に行き先Xや行き先Yが5の倍数じゃないんじゃね?
07617582007/12/27(木) 00:18:36
>>760
そうですちょうど倍数じゃないときで、移動距離を1にしたくない場合、
どういうロジックが考えられますか?
0762デフォルトの名無しさん2007/12/27(木) 00:34:37
>>761
それぐらい、自分で考えろよ・・・・
つかスレ違い。
0763デフォルトの名無しさん2007/12/27(木) 00:40:10
Math.abs() 絶対値
差が5に満たない場合
差の分だけ移動
既に目的地に到達してたら チェックはしない。
移動距離の5は定数にしようかな

思った事を書いてみた。
俺は寝る、がんばれ。
07647582007/12/27(木) 00:41:06
そうですか
表示上の問題だと思ったんでここで聞いたんですが・・・
xflagとyflagを作って、&で到達チェックするとか考えたんですけど、
スマートじゃないんですよね
たとえばどんなのが考えられますかね?
07657582007/12/27(木) 00:43:12
>>763
ありがとうございます
とても参考になりました
0766デフォルトの名無しさん2007/12/27(木) 00:45:01
>どういうロジックが考えられますか?

って自分で聞いてるぐらいだからSwingの問題じゃなくてアルゴリズムの問題だろ。
0767デフォルトの名無しさん2007/12/27(木) 00:51:43
そうですね
javaのスレッドで聞いたほうが良かったですね
答えてくれた方ありがとうございました。
0768デフォルトの名無しさん2007/12/27(木) 01:03:08
java関係ないし
問題の切り分けに注意しないと間違ったスレでは歓迎されないぞ
0769デフォルトの名無しさん2007/12/27(木) 01:14:11
そうですか
初心者スレッドで聞けばよかったですか
いえばただの簡単なアルゴリズムの問題なのですが、
ここなら同じようなことをやっている人がいるかなと思ったんで、
ここで聞いたほうが早いかなと思ってしまいました。
0770デフォルトの名無しさん2007/12/27(木) 01:17:26
初心者は初心者らしく初心者スレで聞こうな。
まあ、その前にこの程度のロジックは自分で考えられないと、
なにを作るにしても困ると思うぞ。
0771デフォルトの名無しさん2007/12/27(木) 01:33:38
というか普通に高校の物理の問題じゃないかこれ?
そこまでのアルゴリズムじゃないけど。
0772デフォルトの名無しさん2007/12/27(木) 01:36:47
物理?!

どう見ても小学生の算数レベルだろ。
07737582007/12/27(木) 01:39:19
強引にやろうと思えばできると思うんですが、
スマートにできないんですよね(馬鹿なんで)。
完璧を目指すのはキリがないと思うんですが、
ある程度きれいなコードが知りたいんですよ。

ttp://pc11.2ch.net/test/read.cgi/tech/1197710566/
ここに移動したんで良かったらいいサンプルコードお教えください。
0774デフォルトの名無しさん2007/12/27(木) 01:43:05
>>769
>ここで聞いたほうが早いかなと思ってしまいました。
こんなのを自分で考えられないとしたら先は長い気がするが…
まぁ地道にがんばれ!
0775デフォルトの名無しさん2007/12/27(木) 02:06:16
ベーマガとか初心者向き雑誌がないと大変なのかなーとかおもっちまった
こういうの当時の小学生は普通に作ってたもんね
0776デフォルトの名無しさん2007/12/27(木) 02:18:59
HSP使ってる連中も普通に作ってるぞ。
というかゲームにSwing使ってるの?
0777デフォルトの名無しさん2007/12/27(木) 02:20:55
Java2Dを使うことはあるかもしれないが、Swingはあんまつかわないだろうね
ただ、ここAWTと合流したからJava2D等も含むといえば含む

本気でやるならJOGLだろうけど
0778デフォルトの名無しさん2007/12/27(木) 02:26:13
本当だ!!
いつの間にかスレタイにAWTが入ってた!!
0779デフォルトの名無しさん2007/12/27(木) 02:32:45
JOGLの正式版が出たときプレイアブルな2DデモとGLCanvasに描画するJMFのレンダラを組んだけど
いまじゃJOGLはjava2Dとパイプラインが統合されてんだよね。

OpenGLの関数使いたいわけじゃないなら-DオプションでOpenGL使うようにした方が楽かね?
それならわざわざ2D描画に3Dtoolkit使う必要ないし。

バグさえ消えれば。
0780デフォルトの名無しさん2007/12/27(木) 04:23:20
javax.swing.timerなんですけど
↓の様にやること多いじゃないですか
このタイマーをストップさせることって可能ですか?
public void startTimer() {
 int i = 0;
 Timer timer = new Timer(20, new ActionListener() {
  public void actionPerformed(ActionEvent e) {
   if (i > 100) {
    return;
   }
   i++;
 });
 timer.start();
}
いままで↑のような感じでiが100超えたらリターンするようにしてたんですが、
ずっとタイマーは動きっぱなしなんですよね。
timerはiが100を超えたらストップさせたいんですよ。
timer内から自分自身をstopさせることができればいいんですが...
0781デフォルトの名無しさん2007/12/27(木) 07:13:18
まぁ、とりあえず読みなさい。
http://java.sun.com/javase/ja/6/docs/ja/api/javax/swing/Timer.html
07827802007/12/27(木) 07:55:23
そこも含めていろいろググったんですが...
実際のコーディングを見てください

まずメインクラスでクラスAのインスタンスaを10個作る(略
pubilc void run { //メインループ
 for(int i=0;i<10;i++){    //a[0]からa[9]のxを増やしていき、xが10になったらstartTimer()をplay
  a[i].x++;
  if(a[i].x >= 10) {
   a.startTimer();
  }
  �@
 }
}
pubilc class A {
 int x = 0;
 int size = 10;
 public void startTimer() {
  Timer timer = new Timer(20, new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    if (size> 20) {
     return;
    }
    size++;
  });
  timer.start();
 }
}
実際はa[0]が増分し終わったらa[1]にいったり、同時に動いたりするんですが...
�@の部分で判定してtimer.stopさせようとしてもすぐストップしてしまうと困るし、
メインループからはtimerがいつ終わるのかわからないのでストップできないんですよね
なにか大きな間違いがあるんでしょうか?
0783デフォルトの名無しさん2007/12/27(木) 08:37:43
Timer#stop()を呼べば止まると分かっているのなら、
後は変数のスコープの問題。
ローカル変数timerをクラスAのインスタンス変数にして、
こんなメソッドを作って
public void stopTimer(){
 timer.stop();
}
これをactionPerformed()内の適切な位置で呼べばいい。

ところでこのサンプルコード、Timerでやってる処理がi++だけなんだが、
これは単純化したサンプルコードなだけだよね?
ホントのコードでは、ちゃんとGUIスレッドですべき処理をしてるんだよね?
0784デフォルトの名無しさん2007/12/27(木) 08:53:05
ああうまくいきました
GUIスレッドですべき処理というのがいまいちわかんないんですが、
ある条件でaのエフェクトを起こすみたいな感じなんですよ
とにかくこれで寝れます どうもありがとうございました
0785デフォルトの名無しさん2007/12/27(木) 10:45:15
ボタンのイベント中にタイマーの時間が来たり、その逆も有ったりするって意味じゃね。
0786デフォルトの名無しさん2007/12/27(木) 12:26:40
>>783
swing.TimerはEDTでactionPerformed呼ぶからそのへんは大丈夫と思
0787デフォルトの名無しさん2007/12/27(木) 13:29:19
>>779
Java2Dだとαブレンディング/テストとか足りないものが多いから
2DであってもOpenGL使わざるを得ないのが現実

>>785が正解
あと注意すべきところはSwingTimerは定期処理にはいいけど、
長時間の流れがある処理には向かないというのもおぼえておくとよろし

あくまでも一定時間ごとにアクションイベントを発生させるだけ
詳しく見てないけどSwingFrameworkでjavax.swing.Timerも扱えるんかな?
■ このスレッドは過去ログ倉庫に格納されています