トップページ⇒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
0002デフォルトの名無しさん2007/09/26(水) 20:57:16
関連スレッド

Java 高速GUI SWT 3
http://pc11.2ch.net/test/read.cgi/tech/1164877399/
0003デフォルトの名無しさん2007/09/26(水) 20:59:02
VisualStudioのようなポトペタ開発環境がほしい!!
NetBeans
http://www.netbeans.org/index_ja.html
Eclipse+VisualEditorPlugin
http://www.eclipse.org/
http://www.eclipse.org/vep/
0004デフォルトの名無しさん2007/09/26(水) 22:10:02
jDialogでボタン付きのダイアログを作成して、
ボタンを押すとdispose()して閉じるようにしても
またダイアログを開くと前回表示した内容が残ってしまいます。

2回目の表示のときは、ダイアログを最初から作り直したい
のですが、どのようにすべきでしょうか?

ちなみにVisualEditorを使って作成しています。
0005デフォルトの名無しさん2007/09/26(水) 22:30:42
disposeがやっているのはOS側のリソースの解放だから、OSリソースを
使わないSwingの子供部品はなくならないわけです。部品自体やその階層
関係はそのままのこっていて、描画が必要になったときにOSリソースが
取り直されるだけ。

地道に値を入れなおすか、子供を全部削除して入れ直(あるいはそれを
するメソッドを呼ぶ)せばいいと思うよ。
0006デフォルトの名無しさん2007/09/26(水) 23:27:39
JDialog を new するところからやり直せばいいと思うよ
0007デフォルトの名無しさん2007/09/27(木) 03:04:22
>>1
標準低速ってなんだよw
オレのお茶返せwww

Q. AWT と Swing 混ぜちゃ駄目って聞いたんですけど
  混ぜちゃ駄目なんですか・・・・?
A.
 今まででは、「駄目」というのが正解です。
 が、現在開発中(未リリース)のバージョンではSwingとAWTの混在ができるようになっています。
 正式リリースがされるまで、情報の錯綜があって混乱すると思いますが
 普通の人にとっては「まだ駄目」という状況だと思ってください。
0008デフォルトの名無しさん2007/09/27(木) 07:20:02
>>1
一乙。
>>7
期待してたテンプレthx.
0009デフォルトの名無しさん2007/09/27(木) 09:44:34
SwingとATWを混ぜて使えると良い点は多少軽量化できることがあるとか?
できないよりはできたほうがいいとはおもうけど、Swingのコンポーネント
増やしてくれたほうがうれしい。
0010デフォルトの名無しさん2007/09/27(木) 10:26:06
プルダウンメニュー付のボタンなんか欲しいな〜
0011デフォルトの名無しさん2007/09/27(木) 11:36:39
エクセル的なJTableの拡張が欲しいな〜
0012デフォルトの名無しさん2007/09/27(木) 12:19:58
「標準」でも検索にかかる上に、低速のふりをする良いスレタイだ。

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

>>9
軽量化よりも環境ネイティブな L&F なのが嬉しそう。
Swing のエミュレーションは見た目は実用レベルで近づいたけど
挙動の微妙な差異にイラっとさせられる時がある。
ファイル選択ダイアログでファイル名をクリックしたら
名前変更モードになっちゃうとか、
ちっこいアイコン叩かないとファイル選択にならないとか、
そういう部分。
0013デフォルトの名無しさん2007/09/27(木) 14:14:13
正直ダイアログ関係はSystemの使ってほしいよね
AWTだと使えるけど、機能が少ないし

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

GLJPanelが遅すぎて使い物にならないとか統合チップセット以外なら
Windowモードでも垂直同期が取れているというのが一番大きいかもしれない
0014デフォルトの名無しさん2007/09/27(木) 18:53:18
Eclipse用のGUIエディタプラグインが紹介されてる。
http://journal.mycom.co.jp/column/ide/015/index.html
こんなんあったんだな。VisualEditorは重すぎだし使ってみようかな。
0015デフォルトの名無しさん2007/09/27(木) 20:28:23
>>14
どれも古いプラグインじゃないか。まだ残ってたんだ。
0016デフォルトの名無しさん2007/09/27(木) 20:42:36
>>14

有償なやつはいらないな
0017デフォルトの名無しさん2007/09/28(金) 09:31:11
昔Jiglooってプラグイン使ってたんだけど、まだある?
0018デフォルトの名無しさん2007/09/28(金) 10:27:25
公式扱いということでVisual Editor使ってるんだけど、Jigloo結構いい感じだなあ。
3.3対応のVEはいつでることやら。

>>17
つ>>14
0019デフォルトの名無しさん2007/09/28(金) 10:30:30
Jiglooは商用製品なんだからフリーよりよくないとこまるだろ
0020デフォルトの名無しさん2007/09/28(金) 12:52:22
Delphi使ってたので、Jiglooのパレットの
並び方はなかなか懐かしくてよいなあ。
002192007/09/28(金) 14:20:24
>>12
ああなるほど、そういうのがあったのか。

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


GUIの部分って書くの時間かかるじゃん。
メニューを動的に変化させたり、いろんな機能と複雑に絡み合っていたり。
人間側で使いやすい操作法と、コーディングのしやすさは相容れない事が多いし。
使ってみて使いにくいから別のやり方に変更とか、やり直しが頻発するときびしい。
デバッグもいろんなパターンをためしていかなきゃいけないし。
0023デフォルトの名無しさん2007/09/28(金) 15:02:16
>>22
イベントの発行順序がかわったりして苦労するとか
ほんと昔からあるとおりデバッグ等は大変だよ

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

NetBeansだったら2行以上のロジックはイベントのメソッドに書かないとかIDEごとの常識が存在するし
0024デフォルトの名無しさん2007/09/28(金) 17:11:04
すれ違いだけど、なんかそこら辺を解決するためにWindows Presentation Foundationとか機能があったんじゃなかったっけ?
どこかの記事で読んだだけなんだが、同じようなのJavaで付けてくれないかなあ。
0025デフォルトの名無しさん2007/09/28(金) 17:24:04
それが JavaFX なんじゃない?
詳しいことは知らないけどさ。
0026デフォルトの名無しさん2007/09/28(金) 22:39:31
そのとおりだよ
でもさー、最近のリッチクライアント事情っていったらMSのSilverlightとAdobeのAIRの2人勝負で、JavaFXが蚊帳の外になってるよね
0027デフォルトの名無しさん2007/09/28(金) 23:02:46
>>26
ランタイムはなにさ?
0028デフォルトの名無しさん2007/09/29(土) 14:02:24
SilverlightやAIRと戦えるかどうかはJava Kernelしだい。
0029デフォルトの名無しさん2007/09/29(土) 14:14:31
TransferHandlerでD&Dは出来たのですが、
貼り付けがよく分からないんですけど、
どうやってメニューアイテムとかボタンとかイベントで貼り付けを起動したらいいか分かりません。
あまりググっても出てこないんですけど、日本語の解説サイトとかないですかね?
0030デフォルトの名無しさん2007/09/29(土) 15:15:27
何をどこに貼り付けるの?
0031デフォルトの名無しさん2007/09/29(土) 15:39:55
>>29
それはDnDの範疇ではなく、普通にクリップボードを介してオブジェクトを渡せばいいんじゃないか?
DragSourceから引き出してDropTargetへ落とすまでは一連の操作だから、
ドラッグの開始で得られたTransferableをメニューやボタンなんかの他の操作でどうにかしたりはできない。
Transferableをクリップボードへ→クリップボードから貼り付け対象へ
という二段階のそれぞれを処理するイベントハンドラをメニューやボタンにaddすればいいんじゃないか?
0032デフォルトの名無しさん2007/09/29(土) 15:42:02
>>30
tableにwindows上でファイルを右クリック→コピーでクリップボードに入れたファイル(?)
を解析してそのファイルの情報
D&Dできるようにはした。
http://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を動かすか分からない…
0033デフォルトの名無しさん2007/09/29(土) 16:07:51
その貼り付けメニューはどうやって作ってるのよ。
そのメニューに getPasteAction を設定してる?
0034デフォルトの名無しさん2007/09/29(土) 20:53:44
>>33
すいません、ちょっと出かけてました…
その辺がよく分からなくて、
pastejMenuItem.setActionCommand((String)TransferHandler.getPasteAction().getValue(Action.NAME));
と書いてみました。何かでも間違ってるっぽい

0035デフォルトの名無しさん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


です。
0036デフォルトの名無しさん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;
以下略

ってやった方が簡単な気がする
0037デフォルトの名無しさん2007/09/29(土) 22:14:26
>>35
VEでは、javax.swing.TimerはGUIコンポーネント扱いされないので、
ポップアップメニューからaddActionListenerはできない。
手書きしよう。そんなに面倒じゃない。
0038デフォルトの名無しさん2007/09/29(土) 23:50:52
実際のところ
javax.swing.Timerはあんまりつかわんよな
1.3以上は
0039デフォルトの名無しさん2007/09/30(日) 01:39:56
>>38
そう?
手書きで精度をあまり問わないちょっとしたもので定期的実行が必要な時によく使うんだが。
0040デフォルトの名無しさん2007/09/30(日) 12:29:43
使うならGUIと直交した java.util.Timer じゃね?
ということかもしれない。
0041デフォルトの名無しさん2007/09/30(日) 13:01:29
1.3から実装されたのはjava.util.Timer
より複雑な並列動作に使うことは多いね
0042デフォルトの名無しさん2007/09/30(日) 17:11:14
java.util.Timer はコールバックが EDT じゃないじゃん
0043デフォルトの名無しさん2007/09/30(日) 17:26:50
単純な定期イベントってのが実際そんなに多くないから
java.util.Timerってことだろ?
0044デフォルトの名無しさん2007/09/30(日) 17:28:44
いまどきは ScheduledThreadPoolExecutor
0045デフォルトの名無しさん2007/09/30(日) 17:57:55
>>44
1.5以上ならjava.util.concurrentはよくつかうね

SwingWorkerはpublishとのタイミングがわからんから使われないことが多いかも
つーか、面倒だよな、あれ
0046デフォルトの名無しさん2007/09/30(日) 18:40:34
java.util.concurrentを学習してない俺が行き当たりばったりで実験コード書いたときは簡単に並列処理できて
文書ソフトのファイルの読み書きと文書内検索にはちょうど良いと思った。
使い捨てのコストもそれならあまり気にならないし。
0047デフォルトの名無しさん2007/10/01(月) 08:27:28
>37

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

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

そもそも、eclipseのGUI作成プラグインとしてVEを選んだのが正解だったかも疑問です。eclipse使ってる方々はGUI作成はどうしてるのか教えていただきたいです。
0048デフォルトの名無しさん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という選択肢もあるが、わざわざ使い分けるのが面倒くさい。
0049デフォルトの名無しさん2007/10/01(月) 12:34:02
フォームにタイマーをおいて・・・というのは感覚的にVBだなぁあとおもた
まぁNetBeansだとできるけど、Eclipseだと商用製品に手をつけるのがオススメ
0050デフォルトの名無しさん2007/10/01(月) 12:47:55
ってかVEって使い物になるレベルだっけか?
最近は改善されてるのかな…
0051デフォルトの名無しさん2007/10/01(月) 12:50:36
いや、放置されてる
0052デフォルトの名無しさん2007/10/01(月) 14:05:18
上の方ではJiglooがいいねって話してた。試してみたら?
0053デフォルトの名無しさん2007/10/02(火) 13:12:58
Java.comから、JREについてフィードバック送れるね。
開発環境じゃないけど、
http://bugreport.sun.com/bugreport/contact.jsp?language=ja
JREが改良され、使われる様になったら、ここにいる人にもメリットあると思うので、
なんかあればfeedbackしておくと良いと思う。
0054デフォルトの名無しさん2007/10/03(水) 22:32:49
JTableのセルへ数字以外入力できないようにしたいんだけど、どうやるのが一番キレイかな?
やり方はいろいろありそうだけど、ソースがきれいになりそうなやり方あれば教えてちょ。
0055デフォルトの名無しさん2007/10/03(水) 22:44:23
JFormattedTextFieldとかTableCellEditorとか使うんじゃないかね。
0056デフォルトの名無しさん2007/10/03(水) 23:40:31
KeyListener#keyTyped(KeyEvent e)を実装して、そこで
char c = e.getChar();
if(c >='0' && c <=9)
return;
else
e.consume();

とかしても結構すっきりして好きだなー
0057デフォルトの名無しさん2007/10/03(水) 23:41:20
あ、JTextFieldかなんかを拡張してTableCellEditorを実装した上でってことねー
0058デフォルトの名無しさん2007/10/04(木) 00:48:54
JTableに限らず書式つけるならテキスト部分はJFormattedTextFieldだろ・・・
0059デフォルトの名無しさん2007/10/04(木) 01:16:02
JTableのセルをクリックして入力モードになるとCellEditorでの入力を行ってるっぽいけど、
セルを入力モードにせずに適当なキーを押して入力した場合はCellEditorを使ってないの?
CellEditorをかならず使うようにしたいのだが、どうすればよいかな。。。
0060デフォルトの名無しさん2007/10/04(木) 01:27:14
>>59
もう少しわかるように
0061デフォルトの名無しさん2007/10/04(木) 02:17:15
>>56
Character.isDigit使う方がよくね?
と思ったが、漢数字や全角数字にもtrueを返すんだよな。
0062デフォルトの名無しさん2007/10/04(木) 16:26:51
JTableネタが出てるのでちょっと聞きたいのですが、
ヘッダ行の文字数が多すぎると、項目によっては
...で項目名が省略されちゃいますよね。

セルの横余白を調節することってできませんか?
0063デフォルトの名無しさん2007/10/04(木) 16:51:11
JTable#setIntercellSpacing(Dimension) かなんかで出来なかったっけ?
0064デフォルトの名無しさん2007/10/04(木) 18:11:06
>>62
列の幅変えたいなら

TableColumn column = table.getColumn(col);
column.setMinWidth(min);
column.setMaxWidth(max);
column.setPreferredWidth(width);
0065デフォルトの名無しさん2007/10/04(木) 23:46:59
>>63,64

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

■ このスレッドは過去ログ倉庫に格納されています