トップページ⇒tech
803コメント252KB

Java 高速GUI SWT

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
SWTはJavaでOSのネイティブAPIを直接呼び出し、高速に動作する
GUIツールキッドです。

配布時に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
0159デフォルトの名無しさんNGNG
>>158
AWTとSwingのちがいについて勉強してくダサイ。
0160デフォルトの名無しさんNGNG
JREなんか入れてないよ
必要ないし
0161デフォルトの名無しさんNGNG
それを入れさせるキラーアプリってはなしじゃないの?
0162デフォルトの名無しさんNGNG
俺的には2chプラグインは豪華なものじゃなくて
ビューポイントの拡張で小さなウインドウでも使えるようなものがいいな

あと、iアプリ実行プラグインだれかつくってくれ
0163デフォルトの名無しさんNGNG
ベースコンポーネントを継承してSWTでオリジナルコンポーネントをつくりたいのですが
Swingでいう「JPanel」の代わりになりようなコンポーネントはSWTではどれにあたるんでしょうか?
0164デフォルトの名無しさんNGNG
JavaWebStartで配布は無理かなあ。
0165デフォルトの名無しさんNGNG
>>162 やっぱeclipseスレとこのスレってネタかぶるなぁ。
仕方ないとは思うけど。i-modeプラグインはeclipse-mlのほうにさっき
流しました。でも自分でAnt使って組んだほうがいろいろカスタマイズ
できていいと思うよ。
0166デフォルトの名無しさんNGNG
>>164
一般ユーザにはJavaWebStartの重さでいきなり全否定される悪寒.
初回インスコはJREとワークベンチも含めてInstallShieldか何かで固めるしかないと思うなー.
合計40MBだけど,初回だけで,あとはアップデート機能でいけるし.

もちろん,既存eclipseユーザ向けにプラグイン単体でもリリースするとして.
0167デフォルトの名無しさんNGNG
>>166
ちょとまて、SWT自体はDLL(Windowsの場合)一つとささやかな
クラスライブラリだけだぞ。
0168デフォルトの名無しさんNGNG
あ、あの、SWTむずかしいと思うのですが俺は異常ですか?
ちなみにC++経験なし、これがいけないのか?
0169デフォルトの名無しさんNGNG
eclipseスレで既出なんだけど、eclipse platform
をベースにしたアプリケーションをInstallShieldで固めて配布する
ためのサンプルはeclipse.orgにもあるね。
0170デフォルトの名無しさんNGNG
>>168
何が難しいと思うのか述べよ
0171デフォルトの名無しさんNGNG
>>163
たぶんCompositeかCanvasが良いと思われます。
0172デフォルトの名無しさんNGNG
JREも10Mくらいだろ。
どこから40Mって数字がでるんだ?
0173デフォルトの名無しさんNGNG
>>171
とりあえずCompositeっぽいですね。ありがとう
0174デフォルトの名無しさんNGNG
>>168
多分Swingと比較して言ってるんだろう、
Swingだって最初はむずかしかったでしょ?SWTとSwingは設計理念が違うから最初とまどうね
まぁライブラリとしてはSwingの方が綺麗だと思うけど、遅くてショボくて使えないアプリつくってもね、、
0175デフォルトの名無しさんNGNG
おいらはswingよりswtくらいの粒度の方がやりやすけどね
0176デフォルトの名無しさんNGNG
いくつかのネイティブコンパイラでSWTサポートが始まってるよ。
これを利用すると、JREが不要になる。コンパイルした exe と
SWT の DLL だけでプログラムが動くですよ!
ちなみに、Swing を使っていると exe にしても、JRE がないと
プログラムが動かない。なんでだろ?
JRE になんか手伝ってもらってるのかな。。
0177デフォルトの名無しさんNGNG
↑あ、すまん。Windowsの話です。
0178デフォルトの名無しさんNGNG
>>176-177 Excelsior JET のこと?FAQになかった?

無料のpersonal版では、いずれにせよJDKが必要だったなぁ。
gcjのmingw版はに期待
0179166NGNG
>>167
ああ,いや,2ch用ブラウザの話.言葉足りずでスマソ.

>>172
なんかと混ざってたみたい.記憶違い.

>>178
gcjだとlibgcjがGPLだから,全体がGPL互換でなきゃならない.
でも,swt.jarはCPLだからGPLと互換しない.
だから,SWTアプリに関してはgcjは使えないんじゃない?

Excelsior JETでJRE使わずSWTアプリ作るには
20マソのProfessionalが必要……
0180デフォルトの名無しさんNGNG
SWT+gcj
http://www-106.ibm.com/developerworks/library/j-nativegui/index.html
0181デフォルトの名無しさんNGNG
>>179
libgcjは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
>>174
プログラムなんか(どこでも)動けば(少しくらい遅くても)いいんだヴォケ。
0183デフォルトの名無しさんNGNG
>>182が、業務でプログラム作ってたとしたら、最低品質のものだろうな。
Javaを使っても、VBみたいなコーディングしてそうだし、
RDBMSは、巨大なグローバル変数として使ってそうだ(w
0184デフォルトの名無しさんNGNG
>>183
俺は >>182 ではないが、何で、「最低品質」とか、「VB みたいな」とか、
「強大なグローバル変数」なんてのが出てくるのだろう?

「(どこでも)動けば」っていうのは、「何でも良いから動けば」ってのとは
違うだろ?

と書いてみる。
0185デフォルトの名無しさんNGNG
>>183
釣れた!
0186デフォルトの名無しさんNGNG
最近、釣れたって言うの激しくかっこ悪いと感じるんですよ。
0187デフォルトの名無しさんNGNG
釣れたとか釣れないなんてのは、主観的概念であって、
言葉遊びの域を出ていないんだよ。

。。。と、釣られてみるテスト
0188デフォルトの名無しさんNGNG
そういうことにしたいのですね( -=・=- -=・=- )
0189デフォルトの名無しさんNGNG
( ´,_ゝ`)
0190デフォルトの名無しさんNGNG
おまいら、SWT の話をしないのはなぜでつか?
0191デフォルトの名無しさんNGNG
>>190
いちいち聞くな。話を戻したいなら話を振れ。このやろう。
0192デフォルトの名無しさんNGNG
このやろう。
0193デフォルトの名無しさんNGNG
こやのろう。
0194yahooo!!アダルトNGNG
http://muvc.net/jsweb/profiles.html
0195デフォルトの名無しさんNGNG
さっさとSWTでなんかつくってUPしろや
つかってやるぞ
0196デフォルトの名無しさんNGNG
>>195
漏れはおまえのケツの穴をつかってやるぞ
0197デフォルトの名無しさんNGNG
>>196
漏れは藻前の上の口を使ってやるぞな
0198デフォルトの名無しさんNGNG
プラグイン兼SWTアプリを作ろうと思ってextends ViewPartして
さらにmain()でShellをつくってcreatePartControl(shell)
してSWTアプリとして実行すると
java.lang.NoClassDefFoundError: org/eclipse/core/runtime/IAdaptable
・・というエラーがでてしまいます。

extends ViewPartを外したらちゃんと動いています
何がいけないのかご存知のかたいたら教えてください
0199デフォルトの名無しさんNGNG
>>181
おー,そうだったのか,知らなんだ.
そしたら,ライセンス的な障害はないね.
あとはどの程度まともに動くかってことか.

>>198
Part系はJFaceであろ.
JFaceはswt.jarには含まれとらんから,それなりのクラスパスを通さんといかん.
とりあえずruntime.jarとか.
0200デフォルトの名無しさんNGNG
JFaceだと何ができる?
0201デフォルトの名無しさんNGNG
>>199
なるほど!ありがとう、
・・ということはスレ違いか、スマソ
0202デフォルトの名無しさんNGNG
SWTのWidgetsって簡単に継承できんね。
コンストラクタがパッケージ内publicのstaticメソッド呼んでるよ、、、
まぁわざとそうして互換性を保持していこうって腹かな・・
0203デフォルトの名無しさんNGNG
>>202 できんつーか、継承するなってjavadocコメントに書いてある
ウィジットがほとんど。
0204デフォルトの名無しさんNGNG
というか、別にWidgetsレベルで継承する必要はないんじゃない?
0205デフォルトの名無しさんNGNG
SWT で組むとどんな感じになるのか知りたいんですけど、だれか hello, world な
ソース晒してもらえませんか?
0206デフォルトの名無しさんNGNG
サンプルに入ってるよ。
0207デフォルトの名無しさんNGNG
携帯ダイアルアップ環境 only でつ…
0208デフォルトの名無しさんNGNG
eclipse.orgにあるオンラインマニュアルでも読んだら?
0209デフォルトの名無しさんNGNG
>>203
マジ!?
>>204
いや、俺Swingでは普通によくやってたんだけど
0210デフォルトの名無しさんNGNG
継承の件もそうだけど、全体的に見てSwingに比べて自由度が低い感じがするねぇ
0211デフォルトの名無しさんNGNG
自由度が高ければ良いという物でもない
制限されているからこそ良いという物もある
0212デフォルトの名無しさんNGNG
>>211
禿同
0213209NGNG
まぁ、それは言えるかもしれない。
Swing継承してコンポーネントつくったばっかりにSunのSwing仕様変更の煽りをくらって何度もクラスかきかえたもんなぁ
他人のつくったクラスをそうそう継承するもんじゃねーな、
0214デフォルトの名無しさんNGNG
>>213
本来親が賢ければ子は楽できるもんなんだがな、親がバカだと子が悲惨なことになる。
0215デフォルトの名無しさんNGNG
>>214
若いうちの苦労は買ってでもしるという言葉もあるが……
0216デフォルトの名無しさんNGNG
イマドキの若者は上流ばっかりやって下流肯定を嫌がるそうです
0217デフォルトの名無しさんNGNG
継承できなきゃOOPできるわけねーだろボケ!
なんだよSWT
0218デフォルトの名無しさんNGNG
継承するものかどうかはデザインによるだろ
そういう勘違いがどうやったらできるのか
217のプログラミング言語習得履歴を知りたい
0219デフォルトの名無しさんNGNG
若いうちの苦労は買ってでもしるというのは自分が若い時苦労したから
今の若い世代にも同じ苦しみをさせようと古い人間が考えた言葉。
0220デフォルトの名無しさんNGNG
>>217
java.lang.Stringがfinalってことは,Javaの根幹からしてOO不能ってわけか.すごいな.
0221デフォルトの名無しさんNGNG
>>219
つまり、swingクラスを継承すると苦労する羽目になるのは、
swingチームが漏れ達にも同じ苦労をさせようと・・・
0222デフォルトの名無しさんNGNG
初めてのGUIをSWTで勉強しています。
色々やってますが詰まってしまいました。

・Tableのセル(or列)に,コンボを入れるってどうやるの?
・DirectoryDialogで「新しいフォルダ」ボタンを消して表示するには?
・Caretって何に使うためのもの?

どなたか…(SWTもSwingぐらい充実したサンプルや書籍が欲しいなあ)
0223デフォルトの名無しさんNGNG
>>222
何かサザエさんの予告みたいだな
0224デフォルトの名無しさんNGNG
222ではないけど追加質問

・Tableのセルをアイテム毎に選択できるようにするには?(何故か行単位でしかできない)
0225デフォルトの名無しさんNGNG
>>218
OOP暦は2年程度だが、SWTのWigetsは継承可能なようにデザインすべきだと思うが?

>>220
ちみの極論がすごい
0226デフォルトの名無しさんNGNG
>>225
言語はJavaだけ?
0227デフォルトの名無しさんNGNG
>>222
>・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なんかは結構無理矢理実現してる.
0228224NGNG
>>227
さんきゅー、やってみます
0229デフォルトの名無しさんNGNG
>>226
OOPはJavaだけ。趣味ではC#もちょこちょこやってるけど、何か問題でも?
0230デフォルトの名無しさんNGNG
ちなみにTableCursorとか見ればわかると思うけど,
SWTってのは継承によって拡張するタイプの設計じゃなくて,
リスナによって拡張するタイプの設計になってるのよね.ペイントリスナとか.
継承よりも疎な関係にできるから,スーパークラスとサブクラスの管理者間の
調整ができない場合も堅牢性を保ちやすい.
0231デフォルトの名無しさんNGNG
漏れはSWTのPopupクラスを何に使うのかがマジで解らん。
Objectから直接継承してるためWidgetとしては扱えないし、
内包してるListウィジェットもprivateでしかもgetter無いし。
楽しげな使い方を漏れに教えてください。
0232デフォルトの名無しさんNGNG
swtでWindowのドッキングってできるの?
0233デフォルトの名無しさんNGNG
そんくらい作れ
0234デフォルトの名無しさんNGNG
>>231
SWTにPopupなるクラスは無いわけだけど……
PopupListならjavadocに用途がはっきり書いてあるよ.
Comboをつつくと出てくるリストの部分だ.
独立したウィンドウだからwidgetじゃないのは当然.
0235デフォルトの名無しさんNGNG
>>234
JavaDocすぐに読めない環境だったから、書き込むときに検証できませんですた。
Comboで使うのね。なるほど。
0236デフォルトの名無しさんNGNG
http://www.eclipse.org/documentation/pdf/org.eclipse.platform.doc.isv.pdf
に、
Extending an existing widgetってのがあるよ。
0237デフォルトの名無しさんNGNG
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SWT
0238デフォルトの名無しさんNGNG
SWTのTableとSwingのJTableで10,000件の表示テストをしたんだけど、
初期にデータをセットするスピードが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
SWTのTableとSwingのJTableで10,000件の表示テストをしたんだけど、
初期にデータをセットするスピードが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デフォルトの名無しさんNGNG
すまん。2度送ってしまった。以下Swing。
import 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デフォルトの名無しさんNGNG
>>238
Windowsで言うところのいわゆる仮想リストビューとか,
swingでTableModelを自前で使ったときのような事ができないんだよね.
データを実際に放り込んだときにSWTの方が遅いのは,
主にJNIのオーバヘッドであるとかが原因.

で,Tableはアイテムの数が3桁以上だと使い物にならなくなってくるので,
そういうときはTableTreeを使って50個とか100個ごとに分割するのがいいと思う.
JDTのVariablesビューの配列の表示みたいに.

そもそも,1000行とか10000行とかあるTableって使いやすいものでもないし.
0242デフォルトの名無しさんNGNG
分割しても遅いもんは遅いっしょ?
0243デフォルトの名無しさんNGNG
>>242
うんにゃ.
初期化がlazyになる.
つまり,ユーザによってexpandされた段階でデータモデル側(TableTreeItem)
から子のアイテム列が取られて実際のTableに追加される.

もちろん,全体を表示させるのにかかる時間という意味では長いまんまだから
全体を見渡すためにはやっぱり時間かかるけど,
でもユーザに対して素早く"とりあえず"(つまり最初の100個)を
見せられるかどうかは非常に重要.

lazyな初期化はGUIを快適にする効果的な工夫のひとつだよ.
0244デフォルトの名無しさんNGNG
まぁ,テーブル全体をeyeball searchするような使い方の場合は
一気にスクロールできないと面倒な事があるので,
そういう場合はカスタムウィジェットを書くしかないかも.

OS依存でいいなら,例えばWindowsならLVS_OWNERDATA使えば簡単だけど.
0245デフォルトの名無しさんNGNG
ソートしたい場合も死にそう。
0246デフォルトの名無しさんNGNG
そーっとしといて
0247デフォルトの名無しさんNGNG
>>246
ワラタ、ナゴムよ
0248デフォルトの名無しさんNGNG
>>246-247
オヤジなんだな。
0249デフォルトの名無しさんNGNG
Tableってよく使うコンポーネントだけど、それが遅いってのはなぁ。
サンプルのsort a table by columnを見たけど、確かにソートの場合
使い物にならないだろうな。

個人的に、このTableの問題が理由でSWTは使えないという判断を下すしかない。
他が良いだけに、残念だが。
0250デフォルトの名無しさんNGNG
>>249
残念ながら自分にはcustom widgetを作る技術がないから
SWTを使うことができない、ってこと?
0251デフォルトの名無しさんNGNG
>>250
おいおい、Tableって各OS固有のAPIへのすごく薄いラッパーでしかないから、
あれ以上軽負荷のものを作るのは辛いと思うよ。

>>249
SWTとSwingでどのくらい差があったのか教えて。
0252デフォルトの名無しさんNGNG
249ではないけど、 >>238 のを実行すると
SWT 17秒
Swing 0秒
だったよ。
0253デフォルトの名無しさんNGNG
>>250
そのようなカスタム作った時点で、naitive自分で呼ぶことになって
SWTの長所を殺す気がするが?

ちょと思ったんだけど、2次元配列をTableに渡せると速くできるような。
0254デフォルトの名無しさんNGNG
SWTが遅いんじゃなくて、たとえばウインドウズのリストビューが遅いんじゃないの?
他の環境で試してみたら?
0255デフォルトの名無しさんNGNG
ちなみに似た奴をVCで試すと、2秒くらいかなぁ。
0256SWT (キリギリス) vs Swing (アリ)NGNG
>>251
アルゴリズムは改良の余地があるんじゃない?

>>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 さんチューニングよろしく。
0257256NGNG
すまん最後の COUNT は 10000 ね。
あとうまく表作れなくてスマソ
0258デフォルトの名無しさんNGNG
VCで試した場合2秒なら、確かにJNIの問題だろうね。
ValueObjectみたいにデータが渡せればいいのに。
■ このスレッドは過去ログ倉庫に格納されています