トップページ⇒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
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みたいにデータが渡せればいいのに。
0259デフォルトの名無しさんNGNG
ソートの問題もあるべ
0260デフォルトの名無しさんNGNG
swingよりVCの方が遅いのは,Win32の場合ウィンドウメッセージ経由で
アイテムを追加する影響かも.
SWTはさらにJNIのオーバヘッドがある.

SWTはネイティブで書くのと同じことをJavaからやるという方針で,
ウィンドウシステムのAPIコールを直接JNI経由で叩くから,
2次元配列をネイティブの向こう側で展開するというのは有り得ない.
データそのものをTableにコピーするというやり方をする限りは
これ以上は速くならんだろうね.

OWNERDATAみたいなのをサポートしてもらうのが一番いいんだけど……
各プラットフォーム版のVirtualTableをここにいるヤシで書く?(w
OS判別してどの実装を使うか動的に決定するということで.
0261デフォルトの名無しさんNGNG
本家では問題にならんのか?
0262デフォルトの名無しさんNGNG
>>261
ならんようだね.
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デフォルトの名無しさんNGNG
>>261
Tableへのデータ挿入オーパヘッドが問題になる状況って、
そんなになさそうだからねぇ。
SWTそのものをメジャーデビューさせるのならいずれは問題になるだろうけど、
eclipseの一部として使うなら問題なしとしてそのままかもね。
0264デフォルトの名無しさんNGNG
TableColumnの色
Tableのセレクトされた時の色
を変更する方法はないですか?
0265デフォルトの名無しさんNGNG
>>264
TableCursorのソースを参考にしる.
0266デフォルトの名無しさんNGNG
>>265
参考にしたがそんなソースではなかったような・・・
もう一度見てみます。

ところでSWTのAPI JavaDoc日本語化の計画はなし??一生英語?
0267デフォルトの名無しさんNGNG
>>266
お前が翻訳しろ!今なら名前が載るぞ
0268デフォルトの名無しさんNGNG
>>260
Windows版だけでもやろうかな。
http://www.eclipse.org/articles/Article-Writing%20Your%20Own%20Widget/Writing%20Your%20Own%20Widget.htm
に丁寧に解説してあるし。
0269デフォルトの名無しさんNGNG
やめとけ
お前の日本語は読めたもんじゃない
0270デフォルトの名無しさんNGNG
>>268様
是非お願いいたします!!

>>269
消えてくれ

ふーん、SWTでスピナつかえたんだぁ・・
0271デフォルトの名無しさんNGNG
>>270

> ふーん、SWTでスピナつかえたんだぁ・・

マジ? 教えて先生
0272デフォルトの名無しさんNGNG
>>271
268のURIを見ると載ってる
だけど、実装するのは自分でやれってことでしょ?

あと、OWNERDATAの話がでてるけど、
Win以外でもその機能って実装されてるの?
0273デフォルトの名無しさんNGNG
>>270
あれはスピナが使えることを示すサンプルじゃなくて,
単にプラットフォームネイティブのコントロールをどう叩くか
(つまりOS依存ならなんでも使える)って例だよ.

>>272
類似の機能はまともなシステムなら大抵は実装されてると思うが.
Motifがまともかどうかは知らんけど.
もしSWTオフィシャルで実現されることになれば,
無い環境ではSWT内部で実装しちゃうでしょ.Treeの例もあるし.
0274デフォルトの名無しさんNGNG
SWTのみ(Jface使わない)で,

・進捗ダイアログ(AnimatedProcess使用)を出しつつ裏で重い処理
・進捗ダイアログにつけたキャンセルボタン押下で重い処理中止

というありがちな処理を書きたいんですが,

・Display#asyncExec(Runnable r)

を使うんだろうなと検討をつけて(これってSwingUtilのinvokerLater相当?)
・進捗ダイアログ表示
・重い処理
をスレッドにして両方を asyncExec()でメインのUIスレッドから走らせる
ようにコーディングしても,進捗ダイアログのキャンセルボタンが
押せない…

教えてSWTのえらい人・゚・(ノД`)・゚・
■ このスレッドは過去ログ倉庫に格納されています