Java 高速GUI SWT
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGGUIツールキッドです。
配布時にOS依存のライブラリを同梱する必要がありますが、
アプリケーションコードはOS非依存で書くことができます。
当初はIBMが開発していましたが、現在ではオープンソースで
Eclipse.orgによって開発が進められています。
なお、ライセンスはCPLという、商用利用に寛容な
オープンソースライセンスです。
"JAVA/C++開発環境"eclipse"スレッド2
http://pc3.2ch.net/test/read.cgi/tech/1023103421
SWT FAQ
http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-swt-home/faq.html
Component Development Resources
http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/platform-swt-home/dev.html
API Reference
http://www.eclipse.org/documentation/html/plugins/org.eclipse.platform.doc.isv/topics_Reference.html
0232デフォルトの名無しさん
NGNG0233デフォルトの名無しさん
NGNG0234デフォルトの名無しさん
NGNGSWTにPopupなるクラスは無いわけだけど……
PopupListならjavadocに用途がはっきり書いてあるよ.
Comboをつつくと出てくるリストの部分だ.
独立したウィンドウだからwidgetじゃないのは当然.
0235デフォルトの名無しさん
NGNGJavaDocすぐに読めない環境だったから、書き込むときに検証できませんですた。
Comboで使うのね。なるほど。
0236デフォルトの名無しさん
NGNGに、
Extending an existing widgetってのがあるよ。
0237デフォルトの名無しさん
NGNG0238デフォルトの名無しさん
NGNG初期にデータをセットするスピードがSwingの方が圧倒的に速いという結果になった。
自分がヘタレなせいでこんな結果になってしまったと信じたいので、識者の意見を求ム。
import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
public class Test {
static String[] DATA = {"1", "2", "3", "4", "5"};
static int COUNT = 10000;
public static void main(String [] args) {
Display display = new Display();
Shell shell = new Shell(display);
Table table = new Table(shell, 0);
table.setHeaderVisible(true);
for (int i=0; i < DATA.length; i++) {
TableColumn column = new TableColumn(table, 0);
}
long time = System.currentTimeMillis();
for (int i=0; i < COUNT; i++) {
TableItem item = new TableItem(table, 0);
for (int j=0; j < DATA.length; j++) item.setText (j, DATA[j]);
}
System.out.println((System.currentTimeMillis() - time) / 1000);
for (int i=0; i < DATA.length; i++) table.getColumn(i).pack();
table.setSize(table.computeSize(SWT.DEFAULT, 200));
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();
}
0239デフォルトの名無しさん
NGNG初期にデータをセットするスピードがSwingの方が圧倒的に速いという結果になった。
自分がヘタレなせいでこんな結果になってしまったと信じたいので、識者の意見を求ム。
import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
public class Test {
static String[] DATA = {"1", "2", "3", "4", "5"};
static int COUNT = 10000;
public static void main(String [] args) {
Display display = new Display();
Shell shell = new Shell(display);
Table table = new Table(shell, 0);
table.setHeaderVisible(true);
for (int i=0; i < DATA.length; i++) {
TableColumn column = new TableColumn(table, 0);
}
long time = System.currentTimeMillis();
for (int i=0; i < COUNT; i++) {
TableItem item = new TableItem(table, 0);
for (int j=0; j < DATA.length; j++) item.setText (j, DATA[j]);
}
System.out.println((System.currentTimeMillis() - time) / 1000);
for (int i=0; i < DATA.length; i++) table.getColumn(i).pack();
table.setSize(table.computeSize(SWT.DEFAULT, 200));
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();
0240デフォルトの名無しさん
NGNGimport javax.swing.*;
import javax.swing.table.*;
public class Test {
static String[] DATA = {"1", "2", "3", "4", "5"};
static int COUNT = 10000;
public static void main(String [] args) {
JFrame frame = new JFrame();
DefaultTableModel model = new DefaultTableModel();
JTable table = new JTable(model);
frame.getContentPane().add(table);
for (int i=0; i < DATA.length; i++) model.addColumn(DATA[i]);
long time = System.currentTimeMillis();
for (int i=0; i < COUNT; i++) {
Object[] values = new Object[DATA.length];
for (int j=0; j < DATA.length; j++) { // 遅くしたい
values[j] = DATA[j];
}
model.addRow(values);
}
System.out.println((System.currentTimeMillis() - time) / 1000);
frame.pack();
frame.setVisible(true);
}
0241デフォルトの名無しさん
NGNGWindowsで言うところのいわゆる仮想リストビューとか,
swingでTableModelを自前で使ったときのような事ができないんだよね.
データを実際に放り込んだときにSWTの方が遅いのは,
主にJNIのオーバヘッドであるとかが原因.
で,Tableはアイテムの数が3桁以上だと使い物にならなくなってくるので,
そういうときはTableTreeを使って50個とか100個ごとに分割するのがいいと思う.
JDTのVariablesビューの配列の表示みたいに.
そもそも,1000行とか10000行とかあるTableって使いやすいものでもないし.
0242デフォルトの名無しさん
NGNG0243デフォルトの名無しさん
NGNGうんにゃ.
初期化がlazyになる.
つまり,ユーザによってexpandされた段階でデータモデル側(TableTreeItem)
から子のアイテム列が取られて実際のTableに追加される.
もちろん,全体を表示させるのにかかる時間という意味では長いまんまだから
全体を見渡すためにはやっぱり時間かかるけど,
でもユーザに対して素早く"とりあえず"(つまり最初の100個)を
見せられるかどうかは非常に重要.
lazyな初期化はGUIを快適にする効果的な工夫のひとつだよ.
0244デフォルトの名無しさん
NGNG一気にスクロールできないと面倒な事があるので,
そういう場合はカスタムウィジェットを書くしかないかも.
OS依存でいいなら,例えばWindowsならLVS_OWNERDATA使えば簡単だけど.
0245デフォルトの名無しさん
NGNG0246デフォルトの名無しさん
NGNG0247デフォルトの名無しさん
NGNGワラタ、ナゴムよ
0248デフォルトの名無しさん
NGNGオヤジなんだな。
0249デフォルトの名無しさん
NGNGサンプルのsort a table by columnを見たけど、確かにソートの場合
使い物にならないだろうな。
個人的に、このTableの問題が理由でSWTは使えないという判断を下すしかない。
他が良いだけに、残念だが。
0250デフォルトの名無しさん
NGNG残念ながら自分にはcustom widgetを作る技術がないから
SWTを使うことができない、ってこと?
0251デフォルトの名無しさん
NGNGおいおい、Tableって各OS固有のAPIへのすごく薄いラッパーでしかないから、
あれ以上軽負荷のものを作るのは辛いと思うよ。
>>249
SWTとSwingでどのくらい差があったのか教えて。
0252デフォルトの名無しさん
NGNGSWT 17秒
Swing 0秒
だったよ。
0253デフォルトの名無しさん
NGNGそのようなカスタム作った時点で、naitive自分で呼ぶことになって
SWTの長所を殺す気がするが?
ちょと思ったんだけど、2次元配列をTableに渡せると速くできるような。
0254デフォルトの名無しさん
NGNG他の環境で試してみたら?
0255デフォルトの名無しさん
NGNG0256SWT (キリギリス) vs Swing (アリ)
NGNGアルゴリズムは改良の余地があるんじゃない?
>>238
なんで 1000 でわるのよ...。
Pentium4 2.2GHz Windows2000、Eclipse2.0.1(JDK1.4.1) 上で実行。
COUNT | 100 | 500 | 1000 | 5000 | 100000
-------+-----+-----+-----+-----+--------
SWT | 391 | 901 | 1532 | 7000 | 12488
Swing | 671 | 681 | 591 | 731 | 801
単位は ms ね。
Swing では 1000 が催促になっているけど、
測定誤差かもしれないし、HotSpot が効き始めているのかも。
SWT が遅いのは何だろね。
どんなしょぼい処理でも JNI を使っているとしたら
そのオーバーヘッドだろうね。
そうだとしたら IBM さんチューニングよろしく。
0257256
NGNGあとうまく表作れなくてスマソ
0258デフォルトの名無しさん
NGNGValueObjectみたいにデータが渡せればいいのに。
0259デフォルトの名無しさん
NGNG0260デフォルトの名無しさん
NGNGアイテムを追加する影響かも.
SWTはさらにJNIのオーバヘッドがある.
SWTはネイティブで書くのと同じことをJavaからやるという方針で,
ウィンドウシステムのAPIコールを直接JNI経由で叩くから,
2次元配列をネイティブの向こう側で展開するというのは有り得ない.
データそのものをTableにコピーするというやり方をする限りは
これ以上は速くならんだろうね.
OWNERDATAみたいなのをサポートしてもらうのが一番いいんだけど……
各プラットフォーム版のVirtualTableをここにいるヤシで書く?(w
OS判別してどの実装を使うか動的に決定するということで.
0261デフォルトの名無しさん
NGNG0262デフォルトの名無しさん
NGNGならんようだね.
Eclipse UI Team LeadのNick Edgar曰く,
http://dev.eclipse.org/newslists/news.eclipse.tools/msg35241.html
As with anything, this is a performance tradeoff. Swing needs more CPU when
scrolling around to show new items.
てことで,初期化にかかる時間よりもスクロールの速度を優先した,と.
そんなんこっちに選ばせてくれや,と思うが……
0263デフォルトの名無しさん
NGNGTableへのデータ挿入オーパヘッドが問題になる状況って、
そんなになさそうだからねぇ。
SWTそのものをメジャーデビューさせるのならいずれは問題になるだろうけど、
eclipseの一部として使うなら問題なしとしてそのままかもね。
0264デフォルトの名無しさん
NGNGTableのセレクトされた時の色
を変更する方法はないですか?
0265デフォルトの名無しさん
NGNGTableCursorのソースを参考にしる.
0266デフォルトの名無しさん
NGNG参考にしたがそんなソースではなかったような・・・
もう一度見てみます。
ところでSWTのAPI JavaDoc日本語化の計画はなし??一生英語?
0267デフォルトの名無しさん
NGNGお前が翻訳しろ!今なら名前が載るぞ
0268デフォルトの名無しさん
NGNGWindows版だけでもやろうかな。
http://www.eclipse.org/articles/Article-Writing%20Your%20Own%20Widget/Writing%20Your%20Own%20Widget.htm
に丁寧に解説してあるし。
0269デフォルトの名無しさん
NGNGお前の日本語は読めたもんじゃない
0271デフォルトの名無しさん
NGNG> ふーん、SWTでスピナつかえたんだぁ・・
マジ? 教えて先生
0272デフォルトの名無しさん
NGNG268のURIを見ると載ってる
だけど、実装するのは自分でやれってことでしょ?
あと、OWNERDATAの話がでてるけど、
Win以外でもその機能って実装されてるの?
0273デフォルトの名無しさん
NGNGあれはスピナが使えることを示すサンプルじゃなくて,
単にプラットフォームネイティブのコントロールをどう叩くか
(つまりOS依存ならなんでも使える)って例だよ.
>>272
類似の機能はまともなシステムなら大抵は実装されてると思うが.
Motifがまともかどうかは知らんけど.
もしSWTオフィシャルで実現されることになれば,
無い環境ではSWT内部で実装しちゃうでしょ.Treeの例もあるし.
0274デフォルトの名無しさん
NGNG・進捗ダイアログ(AnimatedProcess使用)を出しつつ裏で重い処理
・進捗ダイアログにつけたキャンセルボタン押下で重い処理中止
というありがちな処理を書きたいんですが,
・Display#asyncExec(Runnable r)
を使うんだろうなと検討をつけて(これってSwingUtilのinvokerLater相当?)
・進捗ダイアログ表示
・重い処理
をスレッドにして両方を asyncExec()でメインのUIスレッドから走らせる
ようにコーディングしても,進捗ダイアログのキャンセルボタンが
押せない…
教えてSWTのえらい人・゚・(ノД`)・゚・
0275デフォルトの名無しさん
NGNGEclipseをWin以外で使いたいやついるか!?
いなかったらもうネイティブ迷わずつかうぜ
0276デフォルトの名無しさん
NGNG0277デフォルトの名無しさん
NGNG0278デフォルトの名無しさん
NGNG0279デフォルトの名無しさん
NGNG計算スレッドは別にしなきゃだめだよ.独自のスレッド立てれ.
asyncExec/syncExecはUIスレッドにRunnableを投入するものだから,
UIスレッドで重い処理をやったらUIは止まって,当然キャンセルは押せない.
進捗ダイアログの表示はasyncExec/syncExecに放り込むか,
もともとのスレッドがUIスレッドならその場でやってもいい.
>>278
スクロールバーが必要なときにも,それを表示しない,ってこと?
ネイティブのコントロールのレベルで出してる上に,
それを制御するオプションはTableに無いようなので無理ぽ.
0281278
NGNGや、やっぱり・・
あと、コンボボックスの選択数を変える事も無理でしょうか!?
0282デフォルトの名無しさん
NGNG説明能力なさ杉
質問を30文字に収めることに命かけてるの?
0283274
NGNG別々なasyncExecを連続で2つ実行するとどうやってもNGでした。なので
asyncExecに入れる1スレッド内で別の生Threadを走らせることでOK
になりました。
別途試してみましたが、asyncExec()にループ or sleepするスレッド
を2つを同時に走らせることはできないみたいですね。
0284デフォルトの名無しさん
NGNG何がやりたいのかがわからんので微妙だけど,
いずれにしてもUIスレッドは1個しかないから.
async/syncExecは新たにUIスレッドを作るわけじゃないんよ.
0286デフォルトの名無しさん
NGNGGoogle Web APIsみたいなの他にないですか??
0287デフォルトの名無しさん
NGNGこうして移植性がなくなっていくのでした。
Swingマンセー!!
0288デフォルトの名無しさん
NGNG0289デフォルトの名無しさん
NGNG0290デフォルトの名無しさん
NGNGネイティブ使う事に異論はないが、なぜこんなにもJavaっぽくない設計なのか・・
iアプリのほうがむしろJavaっぽい
0291デフォルトの名無しさん
NGNGもともとのウィンドウシステムの構成がJavaっぽくないから。
だがそれがいい......
0292デフォルトの名無しさん
NGNGネイティブ使う事に異論はないが、なぜこんなにもJavaっぽくない設計なのか・・
C#のほうがむしろJavaっぽい
0293デフォルトの名無しさん
NGNG0294デフォルトの名無しさん
NGNGこのスレで言うと叩かれるよ。
俺もそこそこマンセーだけど。
0295デフォルトの名無しさん
NGNGProgram p = Program.findProgram (".bmp");
ImageData data = p.getImageData ();
Image image = new Image (display, data);
で、拡張子ごとのアイコンは取れるのですが、
たまに、取れない拡張子があるし(自分の環境では.html .htmだめでした)
exeファイルやフォルダのアイコンを取りたいです。
0296デフォルトの名無しさん
NGNGHAGEDOU
029777
NGNGeclipseのCVSで繋がらず早速頓挫……
http://monalipse.sourceforge.jp/
まだスクリーンショットしかない.
0298デフォルトの名無しさん
NGNG0299デフォルトの名無しさん
NGNG0300デフォルトの名無しさん
NGNG0301デフォルトの名無しさん
NGNG0304デフォルトの名無しさん
NGNG使える構成に出来るのかなぁ。できればinstall/update maneger
が使える形で配布したいよね。
030577
NGNG初版リリース.
果てしなくスレ違いな気もするけど許して.
・使い方
展開してpluginsに入れる.
File-Newでwww.2ch.netプロジェクトを作る.
プロジェクトがログ置き場になる.
プロジェクトを作るとパースペクティブが開くので,あとは適当に.
・できること
スレを読む
・できないこと
スレを読む以外のほとんどあらゆる事
・動く環境
今のとこ表示にIEコンポーネントを使ってるため,Windowsのみ.
Pure Javaなスレビューアの可能性は考えて作ってあるけど,自分で作る気はあんまりなし.
0306301
NGNGランタイム・ワークベンチで試してみたけど、左側のビューをクリック
すると、NPE出ます。
!ENTRY org.eclipse.ui 4 2 10 05, 2002 23:58:01.297
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.ui".
!STACK 0
java.lang.NullPointerException
at monalipse.views.ThreadListView.selectionChanged(ThreadListView.java:172)
at org.eclipse.ui.internal.AbstractSelectionService$3.run(AbstractSelectionService.java:137)
at org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:839)
あと、配布用zipファイルの生成だけど、build.properties手付かずだけど
手動生成するの? それなら`bin.includes = *.xml,*.jar,icons/*,about.html'
って入れておくことをおすすめします。そうすればplugin.xmlからクリック一つ
で生成できるから。
0307301
NGNG030877
NGNGうっ.
* Can a Contributor remain anonymous?
No. Except for those who simply redistribute the Program, each Contributor must
identify itself as the originator of its Contribution in a way that later Recipients
will be able to readily see.
だね.
んー…… どこまで公開すればidentifyできると考えるんだろ.
メールアドレスは一応あるし,サイト立ち上げてるしで,
一応のidentifyには…… ならんかな?
早速プロジェクト存続の危機.
030977
NGNGiconsとか含んだ単独配布用のzipを作ってくれるの?
とりあえずbin.includes入れてみたけどできないし,
そもそもbin.includesを参照してないみたい.
自分でbuild.xmlに追加しようかと思ってたから,やってくれるなら楽できていいんだけど.
とりあえずupdate managerに対応させたいし,
ある程度完成したらJREとか全部入りのパッケージも作りたいな……
0310301
NGNGで、動きました。ところどころでNPE出たりとかスレッドビューのとこで
1..50とか51...100のツリー開いても先頭の1とか51しか出ないとか動作は
怪しげですけど、めっちゃうけました。イイ!! あと、リリースファイルの
ページにファイルまだ現れて来てないですね。
0311301
NGNGsource.for.jar = src/
source.bar.jar = var-src/
bin.includes = *.xml,*.jar,etc/*,icons/*,about.html
って書いておけば、
plugin.xmlの右クリック->プラグインJARの作成->zip.pluginを選択して「終了」
で新しくbuild.xmlを生成してくれた。で、次からはbuild.xmlからant動かすか
plugin.xmlから プラグインJARの作成 -> 終了 で配布用zipファイルの生成が可能って感じ。
031277
NGNGまぁ,大耳モナー的にはあれでidentifyしますたということで,あまり気にしないことに……
ツリー開いても先頭しか見えないってのは,うちの環境だと見ない動き.
よかったらバグトラッカに詳細きぼんぬ.
>>311
build.xmlを再生成したらできるようになたーよ.ありが�d.
0313デフォルトの名無しさん
NGNGUMLツール使用中はJavaコード補完がきかなくなるが・・
いずれも俺だけ?
0314デフォルトの名無しさん
NGNG同じく。
プロジェクト作って、パースペクティブ切り替わったとたんクラッシュした。
で、エラーログ。
java.lang.NoClassDefFoundError: javax/xml/transform/Source
at monalipse.server.giko.GikoServer.initialize(GikoServer.java:44)
at monalipse.server.BBSServerManager.getInstanceOf(BBSServerManager.java:120)
at monalipse.server.BBSServerManager.getInstanceOf(BBSServerManager.java:89)
at monalipse.views.BoardListView.createPartControl(BoardListView.java:81)
(以下略)
これはXalanを起動のクラスパスに追加しろということ??
0315314
NGNG031777
NGNG"起動しない"だけ言われても.
PDE RuntimeのError Logビューから例外の内容きぼん.
>>314
transformまわりはJAXP1.1.xなら実装されてるってわけじゃないのか.
Xercesにないのね.シリアライズとか便利なんだけど……
とりあえずjre1.4.xならOKてことで.
0318301
NGNGPlugin.getLog().log()ってめんどくさい割に.metadata/.logに
吐き出されるだけでおいしくないなと思ってたんだけど、ちゃんと
専用のビューがあったのね。
0319314
NGNG>>301
昨日たまたまJ2SDK1.4インストールしていたので、起動VM切り替えてみたら無事起動したよ。
サンクス。
ソース見たけど、java.util.regexとか使ってる時点で1.3では実行不可なのね・・・・
032077
NGNGお互いまだ把握し切れてないところがあるようで(w
>>319
transform使っちゃった件は意図してなかったんだけど,
regexはスレビューアでしか使ってないはず.
ここはIE依存でどうせWindowsでしか動かんから,1.4でいいかと思ってわざと.
eclipseにOROとか標準で入ってないみたいだし.
その他はOS X考えると1.3でも動くようにしときたいところ.
0321デフォルトの名無しさん
NGNGプロジェクトを作成すると
「パーツ2chを作成できませんでした」
で
左のウインドウに赤字で「このビューの作成中にエラーが発生しました。」と表示されています。
JDK1.4,1.3ともに同じ現象
WinXP
032277
NGNGメニューからWindow - Show View - Other... - PDE Runtime - Error Logビューに
すべてのエラーのログが登録されてるので,関係ありそうなスタックトレースを
ここかsourceforgeの方に貼り付けて.
0323デフォルトの名無しさん
NGNG貼り付けときました(^^
032577
NGNG032677
NGNG・書き込み
・html落ちログ読み
・dat落ちログ読み(要●)
書き込みはReset Perspectiveするか,Responseビューを開いてね.
●はPreferencesで設定.
漏れは2ch用ブラウザはmonalipseに乗り換えますた.
ブックマークがまだ無いけど,
エディタの状態が保存されるのでなんとか代用できる.
032777 ◆HLp.OhmimI
NGNG0328デフォルトの名無しさん
NGNGmonalipse関係は別スレでやっていただきたい
0329デフォルトの名無しさん
NGNGこのスレ自体が要不要論あったばかりなんだから,
ここで分割するのは時期尚早に一票
0330295
NGNGこれどなたか分かりませんか?
0331デフォルトの名無しさん
NGNGmonalipse は使えるレベルにはなっているんだから、ソフトウェア板に
立てても良さそうな気はするけどね。
■ このスレッドは過去ログ倉庫に格納されています