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
0175デフォルトの名無しさん
NGNG0176デフォルトの名無しさん
NGNGこれを利用すると、JREが不要になる。コンパイルした exe と
SWT の DLL だけでプログラムが動くですよ!
ちなみに、Swing を使っていると exe にしても、JRE がないと
プログラムが動かない。なんでだろ?
JRE になんか手伝ってもらってるのかな。。
0177デフォルトの名無しさん
NGNG0178デフォルトの名無しさん
NGNG無料のpersonal版では、いずれにせよJDKが必要だったなぁ。
gcjのmingw版はに期待
0179166
NGNGああ,いや,2ch用ブラウザの話.言葉足りずでスマソ.
>>172
なんかと混ざってたみたい.記憶違い.
>>178
gcjだとlibgcjがGPLだから,全体がGPL互換でなきゃならない.
でも,swt.jarはCPLだからGPLと互換しない.
だから,SWTアプリに関してはgcjは使えないんじゃない?
Excelsior JETでJRE使わずSWTアプリ作るには
20マソのProfessionalが必要……
0181デフォルトの名無しさん
NGNGlibgcjはlibgccと同じでリンクする分にはどういうライセンスでもかまわない
という例外付きのGPLだよ。だから、GPLと矛盾するライセンスでもgccやgcjで
作ることができる。
http://gcc.gnu.org/java/faq.html#1_1
より
1.1 What license is used for libgcj?
libgcj is distributed under the GPL, with the 'libgcc exception'. This
means that linking with libgcj does not by itself cause your program to
fall under the GPL. See LIBGCJ_LICENSE in the source tree for more details.
0182デフォルトの名無しさん
NGNGプログラムなんか(どこでも)動けば(少しくらい遅くても)いいんだヴォケ。
0183デフォルトの名無しさん
NGNGJavaを使っても、VBみたいなコーディングしてそうだし、
RDBMSは、巨大なグローバル変数として使ってそうだ(w
0184デフォルトの名無しさん
NGNG俺は >>182 ではないが、何で、「最低品質」とか、「VB みたいな」とか、
「強大なグローバル変数」なんてのが出てくるのだろう?
「(どこでも)動けば」っていうのは、「何でも良いから動けば」ってのとは
違うだろ?
と書いてみる。
0185デフォルトの名無しさん
NGNG釣れた!
0186デフォルトの名無しさん
NGNG0187デフォルトの名無しさん
NGNG言葉遊びの域を出ていないんだよ。
。。。と、釣られてみるテスト
0188デフォルトの名無しさん
NGNG0189デフォルトの名無しさん
NGNG0190デフォルトの名無しさん
NGNG0191デフォルトの名無しさん
NGNGいちいち聞くな。話を戻したいなら話を振れ。このやろう。
0192デフォルトの名無しさん
NGNG0193デフォルトの名無しさん
NGNG0194yahooo!!アダルト
NGNG0195デフォルトの名無しさん
NGNGつかってやるぞ
0196デフォルトの名無しさん
NGNG漏れはおまえのケツの穴をつかってやるぞ
0197デフォルトの名無しさん
NGNG漏れは藻前の上の口を使ってやるぞな
0198デフォルトの名無しさん
NGNGさらにmain()でShellをつくってcreatePartControl(shell)
してSWTアプリとして実行すると
java.lang.NoClassDefFoundError: org/eclipse/core/runtime/IAdaptable
・・というエラーがでてしまいます。
extends ViewPartを外したらちゃんと動いています
何がいけないのかご存知のかたいたら教えてください
0199デフォルトの名無しさん
NGNGおー,そうだったのか,知らなんだ.
そしたら,ライセンス的な障害はないね.
あとはどの程度まともに動くかってことか.
>>198
Part系はJFaceであろ.
JFaceはswt.jarには含まれとらんから,それなりのクラスパスを通さんといかん.
とりあえずruntime.jarとか.
0200デフォルトの名無しさん
NGNG0201デフォルトの名無しさん
NGNGなるほど!ありがとう、
・・ということはスレ違いか、スマソ
0202デフォルトの名無しさん
NGNGコンストラクタがパッケージ内publicのstaticメソッド呼んでるよ、、、
まぁわざとそうして互換性を保持していこうって腹かな・・
0203デフォルトの名無しさん
NGNGウィジットがほとんど。
0204デフォルトの名無しさん
NGNG0205デフォルトの名無しさん
NGNGソース晒してもらえませんか?
0206デフォルトの名無しさん
NGNG0207デフォルトの名無しさん
NGNG0208デフォルトの名無しさん
NGNG0210デフォルトの名無しさん
NGNG0211デフォルトの名無しさん
NGNG制限されているからこそ良いという物もある
0212デフォルトの名無しさん
NGNG禿同
0213209
NGNGSwing継承してコンポーネントつくったばっかりにSunのSwing仕様変更の煽りをくらって何度もクラスかきかえたもんなぁ
他人のつくったクラスをそうそう継承するもんじゃねーな、
0214デフォルトの名無しさん
NGNG本来親が賢ければ子は楽できるもんなんだがな、親がバカだと子が悲惨なことになる。
0215デフォルトの名無しさん
NGNG若いうちの苦労は買ってでもしるという言葉もあるが……
0216デフォルトの名無しさん
NGNG0217デフォルトの名無しさん
NGNGなんだよSWT
0218デフォルトの名無しさん
NGNGそういう勘違いがどうやったらできるのか
217のプログラミング言語習得履歴を知りたい
0219デフォルトの名無しさん
NGNG今の若い世代にも同じ苦しみをさせようと古い人間が考えた言葉。
0220デフォルトの名無しさん
NGNGjava.lang.Stringがfinalってことは,Javaの根幹からしてOO不能ってわけか.すごいな.
0221デフォルトの名無しさん
NGNGつまり、swingクラスを継承すると苦労する羽目になるのは、
swingチームが漏れ達にも同じ苦労をさせようと・・・
0222デフォルトの名無しさん
NGNG色々やってますが詰まってしまいました。
・Tableのセル(or列)に,コンボを入れるってどうやるの?
・DirectoryDialogで「新しいフォルダ」ボタンを消して表示するには?
・Caretって何に使うためのもの?
どなたか…(SWTもSwingぐらい充実したサンプルや書籍が欲しいなあ)
0223デフォルトの名無しさん
NGNG何かサザエさんの予告みたいだな
0224デフォルトの名無しさん
NGNG・Tableのセルをアイテム毎に選択できるようにするには?(何故か行単位でしかできない)
0226デフォルトの名無しさん
NGNG言語はJavaだけ?
0227デフォルトの名無しさん
NGNG>・Tableのセル(or列)に,コンボを入れるってどうやるの?
org.eclipse.swt.custom.TableEditorとCComboを使う.
>・DirectoryDialogで「新しいフォルダ」ボタンを消して表示するには?
DirectoryDialog使ってRun Anywhereでそういうことはできないっぽい.
Win32だけでいいならBIF_NONEWFOLDERBUTTONを渡すようにしつつ
DirectoryDialogと同じようなことを(Javaで)することは可能だけど……
Pure Javaで何も考えずに作ると"マイコンピュータ"とか見えないんだよね.
>・Caretって何に使うためのもの?
Caretはふつーにキャレットなんでは?
テキストエディタとかでちかちかしてる,挿入位置を表すやつ.
>>224
>・Tableのセルをアイテム毎に選択できるようにするには?(何故か行単位でしかできない)
org.eclipse.swt.custom.TableCursorを使う.
あれはもともとリスト系コンポーネントだから,
TableCursorなんかは結構無理矢理実現してる.
0228224
NGNGさんきゅー、やってみます
0229デフォルトの名無しさん
NGNGOOPはJavaだけ。趣味ではC#もちょこちょこやってるけど、何か問題でも?
0230デフォルトの名無しさん
NGNGSWTってのは継承によって拡張するタイプの設計じゃなくて,
リスナによって拡張するタイプの設計になってるのよね.ペイントリスナとか.
継承よりも疎な関係にできるから,スーパークラスとサブクラスの管理者間の
調整ができない場合も堅牢性を保ちやすい.
0231デフォルトの名無しさん
NGNGObjectから直接継承してるためWidgetとしては扱えないし、
内包してるListウィジェットもprivateでしかもgetter無いし。
楽しげな使い方を漏れに教えてください。
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のえらい人・゚・(ノД`)・゚・
■ このスレッドは過去ログ倉庫に格納されています