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


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

Java標準低速GUI 6 AWT/Swing



1 名前:デフォルトの名無しさん [2007/09/26(水) 20:51:18 ]
ハードウェアの高スペック化、描画アルゴリズムの変更、JavaVMの高速化に伴い、パフォーマンスの問題は改善されています。
しかしながら、"Java"というだけで未だに敬遠されるのが現状。
そんなSwingと引き続き付き合っていくみんなのスレッドです。
Java低速GUI Swing 5 (前スレ)
pc11.2ch.net/test/read.cgi/tech/1161139809/
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

6 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 23:27:39 ]
JDialog を new するところからやり直せばいいと思うよ

7 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 03:04:22 ]
>>1
標準低速ってなんだよw
オレのお茶返せwww

Q. AWT と Swing 混ぜちゃ駄目って聞いたんですけど
  混ぜちゃ駄目なんですか・・・・?
A.
 今まででは、「駄目」というのが正解です。
 が、現在開発中(未リリース)のバージョンではSwingとAWTの混在ができるようになっています。
 正式リリースがされるまで、情報の錯綜があって混乱すると思いますが
 普通の人にとっては「まだ駄目」という状況だと思ってください。

8 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 07:20:02 ]
>>1
一乙。
>>7
期待してたテンプレthx.

9 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 09:44:34 ]
SwingとATWを混ぜて使えると良い点は多少軽量化できることがあるとか?
できないよりはできたほうがいいとはおもうけど、Swingのコンポーネント
増やしてくれたほうがうれしい。

10 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 10:26:06 ]
プルダウンメニュー付のボタンなんか欲しいな〜

11 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 11:36:39 ]
エクセル的なJTableの拡張が欲しいな〜

12 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 12:19:58 ]
「標準」でも検索にかかる上に、低速のふりをする良いスレタイだ。

>パフォーマンスの問題は改善されています。
現在完了形キタコレ。

>>9
軽量化よりも環境ネイティブな L&F なのが嬉しそう。
Swing のエミュレーションは見た目は実用レベルで近づいたけど
挙動の微妙な差異にイラっとさせられる時がある。
ファイル選択ダイアログでファイル名をクリックしたら
名前変更モードになっちゃうとか、
ちっこいアイコン叩かないとファイル選択にならないとか、
そういう部分。

13 名前:デフォルトの名無しさん [2007/09/27(木) 14:14:13 ]
正直ダイアログ関係はSystemの使ってほしいよね
AWTだと使えるけど、機能が少ないし

AWTとの連携で一番期待したいのはGLCanvasが使えること、かな?

GLJPanelが遅すぎて使い物にならないとか統合チップセット以外なら
Windowモードでも垂直同期が取れているというのが一番大きいかもしれない

14 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 18:53:18 ]
Eclipse用のGUIエディタプラグインが紹介されてる。
journal.mycom.co.jp/column/ide/015/index.html
こんなんあったんだな。VisualEditorは重すぎだし使ってみようかな。



15 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 20:28:23 ]
>>14
どれも古いプラグインじゃないか。まだ残ってたんだ。

16 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 20:42:36 ]
>>14

有償なやつはいらないな

17 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 09:31:11 ]
昔Jiglooってプラグイン使ってたんだけど、まだある?

18 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 10:27:25 ]
公式扱いということでVisual Editor使ってるんだけど、Jigloo結構いい感じだなあ。
3.3対応のVEはいつでることやら。

>>17
>>14

19 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 10:30:30 ]
Jiglooは商用製品なんだからフリーよりよくないとこまるだろ

20 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 12:52:22 ]
Delphi使ってたので、Jiglooのパレットの
並び方はなかなか懐かしくてよいなあ。

21 名前:9 mailto:sage [2007/09/28(金) 14:20:24 ]
>>12
ああなるほど、そういうのがあったのか。

余談だけど、>>9のATWはAWTですた orz

22 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 14:41:34 ]
少し凝ったアプリを作ろうとすると、GUIの操作体系考えるの難しいよね。
最初から読み切って作れればいいんだけどそうもいかない。


GUIの部分って書くの時間かかるじゃん。
メニューを動的に変化させたり、いろんな機能と複雑に絡み合っていたり。
人間側で使いやすい操作法と、コーディングのしやすさは相容れない事が多いし。
使ってみて使いにくいから別のやり方に変更とか、やり直しが頻発するときびしい。
デバッグもいろんなパターンをためしていかなきゃいけないし。

23 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 15:02:16 ]
>>22
イベントの発行順序がかわったりして苦労するとか
ほんと昔からあるとおりデバッグ等は大変だよ

GUIのアニメとか見た目のコントロールはそのフォームべったりになりやすいし
せいぜいビジネスロジックを完全に分離してフロントエンドに何が来てもいいように
するくらいしかない

NetBeansだったら2行以上のロジックはイベントのメソッドに書かないとかIDEごとの常識が存在するし

24 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 17:11:04 ]
すれ違いだけど、なんかそこら辺を解決するためにWindows Presentation Foundationとか機能があったんじゃなかったっけ?
どこかの記事で読んだだけなんだが、同じようなのJavaで付けてくれないかなあ。



25 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 17:24:04 ]
それが JavaFX なんじゃない?
詳しいことは知らないけどさ。

26 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 22:39:31 ]
そのとおりだよ
でもさー、最近のリッチクライアント事情っていったらMSのSilverlightとAdobeのAIRの2人勝負で、JavaFXが蚊帳の外になってるよね

27 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 23:02:46 ]
>>26
ランタイムはなにさ?

28 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 14:02:24 ]
SilverlightやAIRと戦えるかどうかはJava Kernelしだい。

29 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 14:14:31 ]
TransferHandlerでD&Dは出来たのですが、
貼り付けがよく分からないんですけど、
どうやってメニューアイテムとかボタンとかイベントで貼り付けを起動したらいいか分かりません。
あまりググっても出てこないんですけど、日本語の解説サイトとかないですかね?

30 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 15:15:27 ]
何をどこに貼り付けるの?

31 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 15:39:55 ]
>>29
それはDnDの範疇ではなく、普通にクリップボードを介してオブジェクトを渡せばいいんじゃないか?
DragSourceから引き出してDropTargetへ落とすまでは一連の操作だから、
ドラッグの開始で得られたTransferableをメニューやボタンなんかの他の操作でどうにかしたりはできない。
Transferableをクリップボードへ→クリップボードから貼り付け対象へ
という二段階のそれぞれを処理するイベントハンドラをメニューやボタンにaddすればいいんじゃないか?

32 名前:デフォルトの名無しさん [2007/09/29(土) 15:42:02 ]
>>30
tableにwindows上でファイルを右クリック→コピーでクリップボードに入れたファイル(?)
を解析してそのファイルの情報
D&Dできるようにはした。
up2.viploader.net/bg/src/vlbg013628.jpg

public boolean importData(TransferSupport support) {
if (!canImport(support)) {
return false;
}

try {
Object obj = support.getTransferable()
.getTransferData(DataFlavor.javaFileListFlavor);
List<File> files = (List<File>)obj;

for (File file: files) {
//if (filter.accept(file)) {
frame.addRowFile(file); ←このメソッドでtableにファイル情報が追加される
//}
}

return true;
} catch (UnsupportedFlavorException ex) {
// 失敗したら false を返すだけ
} catch (IOException ex) {
// 失敗したら false を返すだけ
}
return false;
}
D&Dなら投げ込むだけimportDataがたぶん起動してる。
貼り付けの時のどうやってimportDataを動かすか分からない…

33 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 16:07:51 ]
その貼り付けメニューはどうやって作ってるのよ。
そのメニューに getPasteAction を設定してる?

34 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 20:53:44 ]
>>33
すいません、ちょっと出かけてました…
その辺がよく分からなくて、
pastejMenuItem.setActionCommand((String)TransferHandler.getPasteAction().getValue(Action.NAME));
と書いてみました。何かでも間違ってるっぽい





35 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 22:03:23 ]
最近eclipse+VEを使いはじめました。

Timerで1秒間隔でJFrameを描画しなおす為にactionListenerを定義しようと
したんですが、VEで作成したパネル上で
[右クリック]→[Events]→[actionPerformed]
しようとしたんですが・・・・
actionPerformedがメニューに出てきません。
eclipseから全てインストールしなおしても変わりません。
何が原因なんでしょうか?

環境は
eclipse 3.2 + JRE1.6.0_02
GEF 3.2
EMF 2.2.0
VE 1.2

Windows XP Pro SP2


です。


36 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 22:09:57 ]
>>34
actionPerformedで

Transferable transferable = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(this);
Object obj = transferable.getData(DataFlavor.javaFileListFlavor);
List<File> files = (List<File>)obj;
以下略

ってやった方が簡単な気がする

37 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 22:14:26 ]
>>35
VEでは、javax.swing.TimerはGUIコンポーネント扱いされないので、
ポップアップメニューからaddActionListenerはできない。
手書きしよう。そんなに面倒じゃない。

38 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 23:50:52 ]
実際のところ
javax.swing.Timerはあんまりつかわんよな
1.3以上は

39 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 01:39:56 ]
>>38
そう?
手書きで精度をあまり問わないちょっとしたもので定期的実行が必要な時によく使うんだが。

40 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 12:29:43 ]
使うならGUIと直交した java.util.Timer じゃね?
ということかもしれない。


41 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:01:29 ]
1.3から実装されたのはjava.util.Timer
より複雑な並列動作に使うことは多いね

42 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 17:11:14 ]
java.util.Timer はコールバックが EDT じゃないじゃん

43 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 17:26:50 ]
単純な定期イベントってのが実際そんなに多くないから
java.util.Timerってことだろ?

44 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 17:28:44 ]
いまどきは ScheduledThreadPoolExecutor



45 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 17:57:55 ]
>>44
1.5以上ならjava.util.concurrentはよくつかうね

SwingWorkerはpublishとのタイミングがわからんから使われないことが多いかも
つーか、面倒だよな、あれ

46 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 18:40:34 ]
java.util.concurrentを学習してない俺が行き当たりばったりで実験コード書いたときは簡単に並列処理できて
文書ソフトのファイルの読み書きと文書内検索にはちょうど良いと思った。
使い捨てのコストもそれならあまり気にならないし。

47 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 08:27:28 ]
>37

つまりimportしているライブラリによって選べると言う事でしょうか?

Timerは置いておいてパネルだけ作って追加しようとしてもメニューに表れません。手書きしてしまうのも良いのですが、今の状況がVEの正しい挙動なのか気になるところです。

そもそも、eclipseのGUI作成プラグインとしてVEを選んだのが正解だったかも疑問です。eclipse使ってる方々はGUI作成はどうしてるのか教えていただきたいです。

48 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 09:44:17 ]
>>47
「パネルだけ作って追加」の意味が分からないが、
addActionListenerはJPanelにはない。

javax.swing.TimerはGUIコンポーネント扱いされないが、
Java Beansとして置く分には可能なので、それで追加して
addActionListenerを手書きするといい。
上で挙げられているような
java.util.Timerとどちらを使うかはお好きに。
どちらにしてもGUIコンポーネント扱いはされない。

ちなみに俺はVE使ってるが、半分意地みたいなところがある。
これがベストの選択肢という自覚はない。
昔Jigloo使ったことがあるけど、
com.cloudgarden.*なクラスが勝手に作られたり
自動生成されたコードが見づらかったりと
(1メソッドに全てのコンポーネント設定コードが詰め込まれるタイプ)
不満だったので止めた。今は良くなってるのかもしれないけど。

NetBeansという選択肢もあるが、わざわざ使い分けるのが面倒くさい。

49 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 12:34:02 ]
フォームにタイマーをおいて・・・というのは感覚的にVBだなぁあとおもた
まぁNetBeansだとできるけど、Eclipseだと商用製品に手をつけるのがオススメ

50 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 12:47:55 ]
ってかVEって使い物になるレベルだっけか?
最近は改善されてるのかな…

51 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 12:50:36 ]
いや、放置されてる

52 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 14:05:18 ]
上の方ではJiglooがいいねって話してた。試してみたら?

53 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 13:12:58 ]
Java.comから、JREについてフィードバック送れるね。
開発環境じゃないけど、
bugreport.sun.com/bugreport/contact.jsp?language=ja
JREが改良され、使われる様になったら、ここにいる人にもメリットあると思うので、
なんかあればfeedbackしておくと良いと思う。

54 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 22:32:49 ]
JTableのセルへ数字以外入力できないようにしたいんだけど、どうやるのが一番キレイかな?
やり方はいろいろありそうだけど、ソースがきれいになりそうなやり方あれば教えてちょ。



55 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 22:44:23 ]
JFormattedTextFieldとかTableCellEditorとか使うんじゃないかね。


56 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 23:40:31 ]
KeyListener#keyTyped(KeyEvent e)を実装して、そこで
char c = e.getChar();
if(c >='0' && c <=9)
return;
else
e.consume();

とかしても結構すっきりして好きだなー

57 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 23:41:20 ]
あ、JTextFieldかなんかを拡張してTableCellEditorを実装した上でってことねー

58 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 00:48:54 ]
JTableに限らず書式つけるならテキスト部分はJFormattedTextFieldだろ・・・

59 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 01:16:02 ]
JTableのセルをクリックして入力モードになるとCellEditorでの入力を行ってるっぽいけど、
セルを入力モードにせずに適当なキーを押して入力した場合はCellEditorを使ってないの?
CellEditorをかならず使うようにしたいのだが、どうすればよいかな。。。

60 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 01:27:14 ]
>>59
もう少しわかるように

61 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 02:17:15 ]
>>56
Character.isDigit使う方がよくね?
と思ったが、漢数字や全角数字にもtrueを返すんだよな。


62 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 16:26:51 ]
JTableネタが出てるのでちょっと聞きたいのですが、
ヘッダ行の文字数が多すぎると、項目によっては
...で項目名が省略されちゃいますよね。

セルの横余白を調節することってできませんか?

63 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 16:51:11 ]
JTable#setIntercellSpacing(Dimension) かなんかで出来なかったっけ?

64 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 18:11:06 ]
>>62
列の幅変えたいなら

TableColumn column = table.getColumn(col);
column.setMinWidth(min);
column.setMaxWidth(max);
column.setPreferredWidth(width);



65 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 23:46:59 ]
>>63,64

ありがとうございます。でもすみません,ヘッダ行についてだけなんです。
これだと,普通のセルの余白が変更されちゃうんじゃ・・・



66 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 23:59:03 ]
ヘッダのサイズだけ変えたいと

そう申すのか?

67 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 00:05:20 ]
>66

そのとおりです。たとえば,ヘッダ行が

|  果物名  |  産地 |  価格  |

のようにあったときに,


| 果物名 | 産地 | 価格 |

としたいのです。列のサイズ自体を変更することはできますが,ある程度
小さくすると項目行が「果...」とかになってしまって見にくくなって,
でも余白はきっちりとられているものですから,なんとかならないかなーと。


68 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 00:09:34 ]
TableColumn#setHeaderRenderer 使えば済む話?

69 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 10:24:07 ]
>68
ありがとうございます。

とりあえず,new DefaultTableCellHeaderRenderer()したものをそれぞれの列に
セットすることができるようになりました。
ただ,そのヘッダ行だけ周りのL&Fから浮いてしまっているだけでなく,クリックや
マウスホバーにも反応しないのが大変痛いです。

TableColumn#getHeaderRendererで中身を取って,それを操作してやるのが一番
よいのではないかと思ったのですが,うまくいかず・・・

(DefaultTableCellHeaderRenderer)JTable.getColumnModel().getColumn(0).getHeaderRenderer();
とかだとnullが返ってきてしまいます。



70 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 11:11:43 ]
MVCパターンの仕組みから勉強した方がよさそうだな。

71 名前:デフォルトの名無しさん [2007/10/05(金) 17:07:29 ]
まえから気になってるんだけど、
マウスイベントで、シングルクリックとダブルクリックを識別するには、
MouseEvent#getClickCount()でボタンを押した回数が分りそうに思えるけど、
ダブルクリックをするとイベントが二回発生して、
一回目はClickCount=1のイベント、
二回目にClickCount=2のイベントというように発生するよね。

たとえば画面に丸印を用意して、その丸をシングルクリックのときは四角に、
ダブルクリックのときは、三角に変化させる。
別のボタンを押すとまた丸にもどる。というプログラムを作りたいとする。

ところがダブルクリックのときは、まず1回目のクリックでmouseClicked()が呼び出され、
二回目のクリックで再び同メソッドが呼び出される事になる。

だから次のようなコードを書いたとすると・・・

public void mouseClicked(MouseEvent evt) {
 int count = evt.getClickCount();
 if(count == 1) {
  //四角を描画
 } else if(count ==2) {
  //三角を描画
 }
}

ダブクリのとき、1度目のクリックで四角が描画され、
二度目のクリックで三角が描画されることになってしまう。
ダブクリとシングルクリックを識別することがmouseClicked()では
実のところできないような気がするのだけど、みんなどんなやり方してますか?


72 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 17:39:10 ]
べつにいいんじゃない。
結果としてワンクリック目の四角形は消えて最終的に三角形だけが残るんなら。

73 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 17:49:35 ]
>>72
じゃあシングルならダイアログAが開き、ダブクリならダイアログBが開くような場合は?

74 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 18:11:45 ]
>>73
そんないかれた仕様にするならどちらかをモディファイアキー有りにするかポップアップメニューにしてくれ…
# シングルクリック時にタイマーを設定してダブルクリック時にタイマーをキャンセルとかすればできなくはないか…



75 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 18:14:16 ]
>>73
ダブルクリック1回のつもりが失敗してシングルクリック2回になってしまうことはよくある。
その逆もよくある。
そういうゲームならともかく、ミスったら終わりみたいなユーザインタフェイスはやめた方がいいと思う。

76 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 18:33:36 ]
UI設計論の話してんじゃないから、文意をくみ取ってちょ。

>>74
まあタイマー使うことになるよね。

>>75
ワンクリでアイテム選択、ダブクリでアイテムプロパティ設定とか、よくあるでしょ。
MSのパワポとか。

77 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 18:34:12 ]
>>71
こんなのは? シングルクリックの動作が遅れるのは
原理的にダブルクリックとの判別にそれだけ時間をかけないといけないからなので仕方がない
四角の描画は別スレッドなのでシングルスレッドルールに反してはいけないときはEDTに描画を投げるようにして
まあ基本的にこういうふうにクリック回数で処理を分けるUIはよくないと思うが
private final int mci = ((Integer)Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval")).intValue();
private boolean flag;
public void mouseClicked(MouseEvent evt) {
int count = evt.getClickCount();
if(count == 1) {
new Thread(new Runnable() {
public void run() {
flag = true;
try { Thread.sleep(mci); } catch (InterruptedException e) {}
if (flag) {
//四角を描画
}
}
}).start();
} else if(count == 2) {
flag = false;
//三角を描画
}
}

78 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 18:50:12 ]
前々から思ってたんだけど

AWTは知らないけど、少なくともSwingのコンポーネントの多くはそのコンストラクタで
オーバライド可能なメソッドを呼び出したり、
そのインナークラスをイベントリスナーとして登録してるんだけど、
どう考えればいいのかな。

コンストラクタが終了する前に this を漏洩することは、
オブジェクトが整合性を整える前にメソッドが呼び出される可能性がある。
とりあえず、基本EDT限定なので、まあ、別スレッドから呼び出される心配はないかもしれないが、
それを差し引いても、例えばリスナー登録の瞬間にコールバックされたりなど
シングルスレッドでも、コンストラクタ完了前に呼び出される危険がある。

とりあえず、今考えているのは、Swingを使う場合は
自前コンポーネントでthisを漏洩しないよう(ファクトリメソッドを作るとか)複雑にしても、
既に親クラスが漏洩しているので、複雑にした分だけ損。それなら、毒を食らわば皿までということで、

1.コンストラクタでイベントハンドラの登録やオーバライド可能なメソッドの呼び出しはOKとする
2.イベントの仕組みを作る場合は、イベントを登録した瞬間にコールバックしない
  (標準で用意されているSwingのコンポーネントはそうなってるのかなあ?)
3.オーバライドを前提としているメソッド(paintComponent()など)以外は、絶対オーバライドしない

というルールでカバーできるのかなと思っているのだけど、どなんでしょうか

79 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 18:51:47 ]
>>76
エクスプローラとかパワポとかテキストエディタは、実際にワンクリ目の動作 (項目選択とかカーソル移動とか) を実行してる。
その後にダブクリの動作を実行するけど、そういう流れで問題ないユーザインタフェイスになってるからな。

80 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 18:51:58 ]
>>77
おー、シンプルでいいね!
漏れが考えたのはもう少し冗長だった。
勉強になりますた!

81 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 18:59:28 ]
>>79
言われてみればそうだね。
クリック回数で処理を分けるのは、よほどの理由がないかぎり
やらないほうが良いのかもしれない。

82 名前:78 mailto:sage [2007/10/05(金) 21:27:33 ]
メソッドの呼び出しがイベントを発生する可能性があるから、

4.リスナーの登録はコンストラクタの最後にする。

が必要か。リスナーの登録メソッド自身がイベントを発生したら木阿弥だけど。
いいのかこんなので

83 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 22:59:32 ]
this参照の漏洩を防止するためにはコンストラクタからイベントリスナを決して登録すべきではない

84 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 23:41:33 ]
イベントリスナが this を(直接的にも間接的にも)参照してなければ
コンストラクタで登録しても問題ない



85 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 00:15:19 ]
Swingのイベントの話してるのか

・SwingコンポーネントのイベントはAWTスレッドでしか発行しない

これだけでおけでは?

ところでDesktopがWindowsXPで動かないわけだが、これはいったいどういうコードになってるんだ?

86 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 00:33:40 ]
solarisチェックが入っている

87 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 00:50:29 ]
>>85
ttp://www-06.ibm.com/jp/developerworks/java/050826/j_j-jtp07265.shtml
ttp://www-06.ibm.com/jp/developerworks/java/020823/j_j-jtp0618.html

88 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 01:03:45 ]
>>86
同じXPでも動くマシンと動かないマシンがあるのだ
すべてJREは同一という不思議

>>87
俺が言いたいのはコンストラクタをAWTスレッドでしか生成しないと問題は少ないという意味なんだが
生成中にthis公開するのが変というのは常識だろ

>>78の前提がおかしいのは当たり前で
それをふまえてそのままのコードでいかに問題なく動かせるかの話じゃないの?

そして現在の実装において問題が発生することはないはず(5.0までは)

結局AWT/Swingなんてソース見ればわかるとおりほとんどVM依存コードの塊なんだけど、
SunのVMで実行しているかぎり問題は表面化していないというのが正しいか

89 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 01:54:54 ]
ぬるぽが発生しなさそうで、発生しそうなコード

final AtomicReference<String> lastSetText = new ...

@Override
public void setText(Strint text) {
super.setText(text);
lastSetText.set(text);
}


90 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 16:17:20 ]
暇なので書き込み

public class NPO extends JTextField {
public NPO(String text) { super(text); }
>>89 のコード
}

として、nullでない文字列を使ってクラスNPOのインスタンスを生成すると、
その時点で、ぬるぽになる。
オーバライド可能なメソッドをコンストラクタで使うことは、
生成中にサブクラスに this を漏洩しているのと同じでやってはいけない。

このような常識を Swing は平然と破っている。したがって、Swing を使うには、
「このメソッドは、(心の目でみると) final が付いているからオーバライドしてはいけないんだ!」
などという脳内変換ルールが必要なのは明らか。

91 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 16:24:07 ]
NPOって何かと思ったらNPEのことか

92 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 17:09:08 ]
nuru-poとnull pointer exceptionか?

93 名前:デフォルトの名無しさん mailto:sage selfガッ [2007/10/06(土) 17:54:36 ]
あんまりぬるぽぬるぽいうから間違えちゃったのね。

94 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 13:48:57 ]
NullPointerObject



95 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 06:22:58 ]
JFrame#pack()はsetVisible(true)の前に実行することが推奨されていますか?

ふと以前何処かでそういう文章を読んだことを思い出し、とりあえず盲目的にそれを追記してみた所、
バキュームベッドから空気を掃除機で全部吸い取った様に空間の余裕が消え、ピッチピチに圧縮されました。
setBounds()でウィンドウサイズを設定していたのにたまったもんじゃないです。
しかしまぁそれで大体どういう動きをするメソッドか分かりました。

ただピチピチにパックするだけでは無いだろうと思い調べてみたのですが、
それ以上の情報は見つからず、必ずパックしろといった記事も見つかりません。
今までパックしていなかったにも関わらず何事も無く動いていたので、何かの勘違いだったんでしょうか。
それとも偶々運良く動いていただけなんでしょうか。

96 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 08:58:37 ]
>>95
余白が欲しければちゃんとBorderなりをセットしてからpackしろ
setBounds()で固定サイズとかダメすぎ

97 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 11:19:45 ]
>>95
大体とか言わず、正確に理解しといた方がいいと思うよ

java.sun.com/javase/ja/6/docs/ja/api/java/awt/Window.html#pack()
>サブコンポーネントの推奨サイズおよびレイアウトに合わせて、この Window をサイズ変更します

余裕が欲しいコンポーネントには推奨サイズを設定 (setPreferredSize) しておけば、そのサイズに合わせてくれる

98 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 14:27:26 ]
>>97
合わせてくれるかどうかはレイアウトマネージャ次第。
推奨サイズなんだから無視されても文句は言えない。
>>96のようにBorderでマージンとるのを推奨。

99 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 20:26:34 ]
スレタイ存続の危機?
次期Java 6、Direct3Dの概要が明らかに - WindowsでのSwing 2D描画を高速化
ttp://journal.mycom.co.jp/news/2007/10/09/021/index.html

100 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 20:34:26 ]
いやいや、まだまだ低速のタイトルは外せません><

# いや、そういうコトなら結構昔に変わってるはずで・・・

101 名前:95 mailto:sage [2007/10/10(水) 20:44:20 ]
EmptyBorderをセットしてpack、と実装したところうまく行きました。
今までモヤモヤしていた部分が引き締まったようで、とってもすがすがしいです。
>>96さん、>>97さん、どうもレスありがとうございました。

102 名前:デフォルトの名無しさん mailto:sage [2007/10/11(木) 00:12:05 ]
>>99
デフォルトでオンはいいよね。MacではOpenGLがオンになるんだろうか・・・。

103 名前:デフォルトの名無しさん mailto:sage [2007/10/11(木) 00:29:46 ]
Mac では Java2D は Quartz で描いてたはずかと

104 名前:デフォルトの名無しさん mailto:sage [2007/10/11(木) 00:38:44 ]
レンダリング品質はどうなるのだろうか・・・
現状だとDirect3Dモードにすると品質がかわるので使い物にならない



105 名前:デフォルトの名無しさん mailto:sage [2007/10/11(木) 01:08:52 ]
>>103
それがさ、Java SE 6からSunのレンダラがデフォルトになる予定なのよ。

106 名前:デフォルトの名無しさん mailto:sage [2007/10/11(木) 04:10:28 ]
今までのwin版sun JVMなら-Dsun.java2d.ddraw=trueがデフォルトだったな。
-Dsun.java2d.d3dは支援がまともに得られないから無効だった(パフォーマンス落ちる)
当然-Dsun.java2d.openglはバグ回避で無効。
しかし、D3D9ベースになるのかPS2.0も使うみたいだしVGAとドライバ依存がでかくなるな。

それよりNimbusはマルチバイト文字通るようになるの?w






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

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

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