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
0652649
NGNG今頃ですまんが、まだ2.1をDLしてる途中。
ミラーでも重いんだよね。
クラス見つからないって怒られてるんだから設定見直すか、
オープンソースなんだからソース追うか。どこまで動いてるかは調べられる。
0653648
NGNGimport org.eclipse.core.internal.boot.DelegatingURLClassLoader;(無いと怒られてるクラス)
をしようとした所、コードインサート機能ではinternalまでしか表示されなかった
ので別のjarファイルがいると思い外部jarの追加画面とにらめっこしてました。
結果 org.eclipse.core.boot_2.1.0\boot.jarを追加する事でちゃんと実行されました。
649さん 650さんアドバイスありがとうございました。
0654デフォルトの名無しさん
NGNGを使って、ハイパーリンクの抽出・埋め込みを実現したいのですが、
カーソルの変更やクリックの検出をするにはどういう手順がいいでしょうか?
手順1:
1) パーズ時に、ハイパーリンクの文字列が現れる offset を覚えておく
2) MouseListener, MouseMoveListener を作って、StyledText のメソッド
int getOffsetAtLocation(Point point)
を使い、xy 座標から offset を求め、処理をするかどうか判断
このように実装しようと考えていますが、ちょっと面倒です。
他に良い方法はないでしょうか?
0655654
NGNG実現しようがないみたいです。
その代わり、StyleRange に offset を持たせて、カーソルの変更や
クリックの検出などは、StyledText のメソッド
StyleRange getStyleRangeAtOffset(int offset)
を使って、そのスタイルの違いから判断させることにしました。
0656デフォルトの名無しさん
NGNGStyleRangeそのものから判断するのは不自然だし,
表示スタイルが変わったときなど,後々面倒なことになる可能性がある.
LinkedStyleRangeみたいなサブクラスを作るか,
もっと汎用的に独自のスタイル情報を持てるAdaptableStyleRangeを
作るのがいいかも知らんね.
0657654,655
NGNGレスありがとうございますにゃ。
おっしゃる通り LinkedStyleRange みたいなクラスを作って実装しました。
というのも、大量のテキストに一度にスタイルを指定して StyledText に
レンダリングさせようとすると、ものすごく時間がかかることが判明したからです。
ですので、StyledText をスクロールさせるたびに徐々にスタイルを
適用する、Lazy なレンダリングをさせることにしたので、
結局 LinkedStyleRange のようなクラスが必要でした。
#あと、なぜ SWT.WRAP を指定してワードラップをさせると、
#StyledText#setText() などに異常に時間がかかるんでしょうかね…。
Linked〜 は想像がつきますが、AdaptableStyleRange というのは
どんな働きをするんでしょうか? よろしかったらご教授ください。
0658デフォルトの名無しさん
NGNG>#あと、なぜ SWT.WRAP を指定してワードラップをさせると、
多分視覚的な改行位置の計算が大変なんじゃないかと.
>AdaptableStyleRange というのは
eclipseのIAdaptableとかがそうだけど,
AdaptableStyleRange a = ...;
ILink link = (ILink)a.getAdapter(ILink.class);
if(link != null)
link.hoge();
みたいな.
Adapterパターンのちょっと変則型かな?
ILinkを相手であることがはっきりするというのと,
ILink以外にも独自スタイルがある場合に
継承関係がごちゃごちゃしないですむというのがご利益,だと思う.
今回みたいな単純なケースではやりすぎかも.
0659657
NGNGどうもありがとうございました。勉強になりました。
日頃から、小さな実装であっても本質を見出そうと抽象化を試みるのは
大切な練習になると思います。
いつもそうしてないとデザパタとか忘れそうですし。
まぁ二度と使わないようなソースコードにも、つい厳密な OO の洗礼を
施したくなっちゃって時間かけたけど、でもやっぱり二度と使わなかった、
というのもままありますけどね(笑)
0660デフォルトの名無しさん
NGNG将来それを再利用する場合もあるか・・。
0661山崎渉
NGNG0662山崎渉
NGNG( ^^ )< ぬるぽ(^^)
0663デフォルトの名無しさん
NGNGメモリ食いすぎ。
Javadoc手抜き過ぎ。SWTクラスのstatic finalの説明なんか無い奴もあるし。
レイアウトもウィジェットのスタイルも、指定できる種類がSwingに比べて少なすぎ。
0664デフォルトの名無しさん
NGNG0665デフォルトの名無しさん
NGNG0666デフォルトの名無しさん
NGNG〜10MB 軽い
〜12MB 中堅
〜20MB 重い
それより上 糞重い
0667デフォルトの名無しさん
NGNG0668デフォルトの名無しさん
NGNG0669デフォルトの名無しさん
NGNG0670デフォルトの名無しさん
NGNGメモリ食わなくても人間様の感触として重いのなら重いし、
いくらメモリ食っても人間様の感触で重くなきゃ重くなく、
そこでメモリの実使用量などただの数値でしかない。
人間様の快適のほうが無限に重要。
スレ違いsage。
0671デフォルトの名無しさん
NGNGおいらもJavaでのGUIはSwingしか経験がないんだけど、
Widgetを継承させずに作っていくやりかたが良く分からない。
例えばファイルマネージャみたいなのを作ってて、フォルダツリーを表示させたいとき、
Treeを継承したFolderTreeクラスを作って、getSelectionFile()みたいなメソッドを追加して、
選択されたフォルダをFileオブジェクトとして取れるようにしたりしたい。
でなければ、Treeを使う側のクラスに、
選択されたTreeItemからFileを作成する処理を持たないといけないので、
だんだんと厨なVBのソースみたくなってくる。
個々のWidgetの振る舞いの責任を、全て使う側が持ったがため、
肥大化したソースが出来てく感じ。
>>230が言ってた「リスナによる拡張」がキーになるのかとも思うけど、
上記の例で言えばどういう風に設計すればいいのでせうか?
長文すんません。
0672デフォルトの名無しさん
NGNGgetSelectionFile()みたいなやり方すると,FolderTreeに依存するわけだ.
そーゆーのはよろしくないだろう,というのが一つの考え方.
(たとえば後々Tableに変更するかもしれないでしょう.
もちろんTreeは継承不可というのもSWTの場合は理由だけど)
>>230で書いたのは純粋にWidgetレベルの話だけど,
今回のは一段上の構造を含む話だと思う.
話としては2つ含まれてて,選択情報を得る方法と,
選択情報からディレクトリ等のアプリ固有のデータを得る方法.
選択情報を得る方法に関しては,
例えばJFaceの場合,選択を管理するフレームワークがあって,
ディレクトリツリーを表示するモジュールは
そのフレームワークに対して選択情報を適宜提供する.
で,選択に反応したいモジュールはそのフレームワークに対して
選択リスナを登録して,随時選択情報を受け取る.
SWT直接叩く場合もこんな風にすれば,
選択の提供側と消費側の依存関係が排除できる.
(つづく)
0673デフォルトの名無しさん
NGNGJFace使うとObjectで取れるので,提供側と消費側に合意があれば
キャストするとか,そういう話になる.
SWT直接叩くなら,選択情報を提供するときに,
あらかじめFileにしてから提供するとか.
具体的にはTreeにSelectionListener登録しといて,
通知が着たらFileに変換して他のモジュールに再通知してやる
FolderViewみたいなものをTree継承しないで作る.
FolderViewにgetSelectionFile()を作ってもいいし.
もちろん他にもいろいろ方法はあるだろうけど,
ひとつのやり方としてはこんな感じだと思う.
ところでswingでやるとしたらFolderTreeみたいなのは使わず,
FolderTreeSelectionModelみたいなのを作るのも手.
WidgetをFolder専用にするんじゃなくて,モデル側でというやり方.
長文スマソ
0674671
NGNGすばやいレスさんくす。疑問は氷解しますた。
Widgetとの間に、橋渡しを行うクラスを導入して、結合を疎にするということですか。
で、その橋渡しをリスナを通じて行うと。
Swingでの場合に〜Modelを導入するのは初めて知ったけど、
今APIdoc見たらSwingにListModelってのがあって、少し調べてみますた。
実はSWTのサンプルのFileViewerのソースは見てたんだけど、
「Widget継承させればもっと簡単に分かりやすくなるのに」としか思ってなかった。
でも、今見てみると新たな発見がありそうなので、読み直してみます。
>>672さん、ありがとうございました。
0675デフォルトの名無しさん
NGNG院生さんですか?
それはともかく、俺は継承しまくってます。。。
ISA関係になるやつは継承するようにしてるんですがまずいですかねぇ。やきもき
0676デフォルトの名無しさん
NGNG院生じゃないよ.
ところでJavadoc見ると
IMPORTANT: This class is not intended to be subclassed.
と書いてある通り,SWTでTreeとか継承するのはよろしくない.
swingなら別に,好みの問題だと思うけど.
0677デフォルトの名無しさん
NGNGそうですか。どうも。
J2SE1.4.2beta入れてSwingでブラウザ作り始めてるんですけど、好みの問題とのことで安心しました。
SWTはgcjでちゃんと動かせるようになったら使おうと思ってます。
ちなみに論文では,と.を使うので院生さんかなと思ったのです。
#Emacsの話だけど俺はtex-modeだけは (setq its-hira-comma "," its-hira-period ".") してるので。
うぉおぉお、全然まとまりのないゴミレスですいません。。
0678デフォルトの名無しさん
NGNGまぁどっちにしても,実績のあるコテハンでもなし,
漏れなんかの発言に惑わされるこたないと思う.
",."は昔からだなー.中学時分からかも.
0679デフォルトの名無しさん
NGNGとりあえず面倒くさかったから・・。
でも面白そうだから後々 Model や Provider で作りたいと思ってます。
0680デフォルトの名無しさん
NGNG各スレッドが直接StyledText#append()するとSWTExceptionが出るので、
Display#asyncExec()の引数にappend()するスレッドを渡して書かせようとしてます。
が、何故かStyledTextに表示されない場合があります。
渡したスレッドのrun()の中でSystem.out.println()するとちゃんと標準出力にはでるので、
実行されてないわけではなく、本当にStyledTextに書いてくれてないだけのようです。
どなたかこの辺の事情通な方、教えてください。
0681680
NGNG0682デフォルトの名無しさん
NGNG0683680
NGNG0684デフォルトの名無しさん
NGNG渡すのはスレッドじゃなくてRunnableね.
で,そういう症状は聞いたことないし,
そんな単純な問題がいまさら残ってるとも思えないので,
多分おまいさんのコードに問題がある.
非同期にappendするために渡したデータを
append前に書き換えちゃってないか?
asyncExecじゃなくsyncExecにするとどうだ?
コードの別の場所でテキストの置き換えや削除をしてないか?
そのコードが何らかの理由で実行されてないか?
まずはappendしてるとこでブレークしてSWTの中まで
ステップ実行してみるとか.
そうやって覗いてる間は再現しないかもだけど.
0685680
NGNGあう・・・。コードですか・・・。
メソッドの引数がfinalで、なおかつ直後のSystem.out.print()では表示されるので、
データが書き換わってることは無いと思うのですが・・・。
void appendLog(final String text, final Color color) { // Colorはそのうち色をつけようと思って
shell.getDisplay().asyncExec(new Runnable() {
public void run() {
logText.append(text); // こっちは時々NG
System.out.print(text); // こっちはOK
}
});
}
ちなみに、asyncExec()、syncExec()両方ともダメでした。
で、SWTの中までステップ実行してみようと思ったら、
「ソースがねぇよ」って画面が現れただす・・・。
環境整えてから試して、再度結果報告させてもらいます。
さんきゅうでした。
0686デフォルトの名無しさん
NGNGそれならtextが書き換わってるってことはないね.
ステップインはswt.jarにソースアタッチしないと.
plugins\org.eclipse.platform.win32.source_2.1.0\src\org.eclipse.swt.win32_2.1.0\ws\win32\swtsrc.zip
とかね.
まぁ,"時々NG"を捕まえるのは大変だろけど.
あとはappendの前後でlogText.getText()をprintln()してみると,どーだろうね.
0687680
NGNG普通に実行させても再現できなくなりました。
何度も複数のスレッドから大量にStyledTextに書き込ませて、
一件ずつログを追って確認してみたのですが、全て表示されてました。
ここに至って原因は「勘違い」であると断定しました。
>>684様をはじめ、考えてくださった方々、どうも申し訳ありませんですた。
おかしかったのは、DisplayでもasyncExec()でもStyledTextなく私の頭でした。
0688デフォルトの名無しさん
NGNGSWTのTableクラスを利用してウィンドウにテーブルを張っつけてます。
テーブルヘッダを作成する為に下記のようなコードを書きました。
TableColumn col = new TableColumn(table, SWT.LEFT);
col.setText("hoge");
で、一度作成したテーブルヘッダを動的に削除する方法が分かりません。
ご存知の方が居ましたらアドバイス宜しくお願いします。
0689デフォルトの名無しさん
NGNGSWT始めてみますた。
eclipse内でSWTアプリ作ってますが、swt-win32-2133.dllを認識してくれまへん。
システム環境変数PATHで通してるはずなんですけど・・・・・。
java.lang.UnsatisfiedLinkError: no swt-win32-2133 in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1403)
at java.lang.Runtime.loadLibrary0(Runtime.java:788)
at java.lang.System.loadLibrary(System.java:832)
at org.eclipse.swt.internal.Library.loadLibrary(Library.java:108)
at org.eclipse.swt.internal.win32.OS.<clinit>(OS.java:46)
at org.eclipse.swt.widgets.Display.internal_new_GC(Display.java:1291)
at org.eclipse.swt.graphics.Device.init(Device.java:547)
at org.eclipse.swt.widgets.Display.init(Display.java:1310)
at org.eclipse.swt.graphics.Device.<init>(Device.java:96)
at org.eclipse.swt.widgets.Display.<init>(Display.java:291)
at org.eclipse.swt.widgets.Display.<init>(Display.java:287)
at com.sat.sample.HelloSWT.main(HelloSWT.java:21)
Exception in thread "main"
てぃなみに、swt.jarはプロジェクトのビルドパスに変数追加してまふ。
何故swt-win32-2133 が見えないのでしょうか?
-Djava.library.path=ほげほげでswt-*.dllがあるフォルダにパス通す。
なども試してみますた。
0690デフォルトの名無しさん
NGNG>>458
>>689
コマンドプロンプトから実際のコマンド行をコピペしたら何かわかるかも.
どっちにしてもSWTとは関係ないJNIのレベルの話だかが.
0691デフォルトの名無しさん
NGNGgcjって使ってる人います?
http://pc2.2ch.net/test/read.cgi/tech/1046627795/50-51
だけど、同じ症状かもね。
0692デフォルトの名無しさん
NGNG-Djava.library.path=dllへのパス
してみれば?
0693デフォルトの名無しさん
NGNGだからそれは試したって書いてあるだろ?
0694デフォルトの名無しさん
NGNGありがとーございます。
table.getColumns()で取得したTableColumn[] に対して
dispose()したら上手く行きました。
感謝感謝っす。
0695デフォルトの名無しさん
NGNG0696デフォルトの名無しさん
NGNGうまくいきません。
swt.jar などの設定もきちんと設定を行っているので、コード上で、エラーらしき個所は指示されません。
しかし実行をすると以下のようなエラーが出ます。
java.lang.UnsatisfiedLinkError: no swt-win32-2052 in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1410)
at java.lang.Runtime.loadLibrary0(Runtime.java:772)
at java.lang.System.loadLibrary(System.java:832)
こんな感じでズラズラと・・・
くだらない質問なんだと思うので、もし、ここでの質問が不適当でしたら、どこで質問して言いか教えて頂けないでしょうか?
よろしくお願いします。
0697デフォルトの名無しさん
NGNG>http://game3.2ch.net/mmominor/dat/1052667275.dat
0698デフォルトの名無しさん
NGNG> java.lang.UnsatisfiedLinkError: no swt-win32-2052 in java.library.path
java.library.path で指定されているディレクトリに
swt-win32-2052.dll がないというエラーなんで
1. swt-win32-2052.dll を java.library.path で指定されたディレクトリに置く
2. swt-win32-2052.dll があるディレクトリを java.library.path に指定する
のどちらかで対処してください。
0699デフォルトの名無しさん
NGNGsystem32に放り込め。確実に逝ける。
0700デフォルトの名無しさん
NGNG>696は、忘れたころにPC換えて、また同じエラーで悩むと思われ。
0701デフォルトの名無しさん
NGNG>>699
>>700
ありがとうございます。swt-win32-2052.dll はコンパイル後実行する時に、必要と書いてあったのは覚えていたんですが、
よく考えたら、ビルドした時点で実行してるんですよね。
くだらない質問に答えていただいてありがとうございます。
0702デフォルトの名無しさん
NGNGあんたの思い込みが正しいとしたら、
な ん の た め の ダ イ ナ ミ ッ ク リ ン ク かと小一時間。
0703デフォルトの名無しさん
NGNG今のところIEコンポーネントOLEを呼び出すのしか例を見た事無いから、
できればどんな感じでAPIを呼び出してるのか教えてちょ
0704SWT厨房
NGNGいつの間にか(一月前からみたいだけど)、eclipse公式で、
SWT単体でダウンロードできる様になってたよ。
0705デフォルトの名無しさん
NGNGhttp://chrriis.brainlex.com/swtswing/
0706デフォルトの名無しさん
NGNGClientGUIもJavaが制覇「もう誰にも止められない」
http://girlcom.ghostsp.com/swttop.html
0707デフォルトの名無しさん
NGNGhttp://219.96.231.242/wizonline/
2chスレ
http://game3.2ch.net/mmominor/dat/1053536167.dat
0708デファルトの名無しさん
NGNGっていうのをやりたいんですが、うまくいきません。
KeyListener#keyPressed()の中で、
前の画面のCompositeをdisposeして、
新しいCompositeを作成ってしてるんですが、
新しい画面でイベントが拾えなくなります。
(CompoisteはShellの子の子に配置しています)
何かいい方法、サンプル、デバッグ手段等あったら、教えてください。
0709デフォルトの名無しさん
NGNGIStructuredContentProviderやITableLabelProviderなどの
Providerを実装したクラスのメソッド内で例外が発生すると、
org.eclipse.core.internal.runtime.AssertionFailedException: assertion failed: The application has not been initialized.
at org.eclipse.core.internal.runtime.〜・・・がだらだら続いて、
at MyClass$1.selectionChanged(MyClass:74)・・・すごーく前の呼び出し元
というクソみたいなスタックトレースを吐きやがります。
Window.IExceptionHandler#handleException(Throwable)も試してみたのですが、
このメソッドが呼ばれたときにはすでに上記の意味不明な例外に置き換えられたあとでした。
多分、ClassCastExceptionだとかArrayIndexOutOfBoundsだとかの実行時例外だと思うのですが、
何が起きてるのかを知るいい方法はないでしょうか?
というか、どのContentProvider内のどのメソッドで発生した例外なのかだけでも分かれば助かるのですが・・・。
0710デフォルトの名無しさん
NGNG何がクソで何が意味不明なの?
> at org.eclipse.core.internal.runtime.〜・・・がだらだら続いて、
の最初の要素が直接の発生場所を示してるわけでしょ.
デバッガで覗けばいいじゃない.
0711デフォルトの名無しさん
NGNG基本的なことだけれど,
Listenerはちゃんと新しいCompositeに登録しなおしてる?
0712709
NGNG>何がクソで何が意味不明なの?
何が起きようともAssertionFailedExceptionに置き換えられてしまうところが・・・。
>の最初の要素が直接の発生場所を示してるわけでしょ.
いえ、JFace内で全ての例外をキャッチして、
新しいAssertionFailedExceptionを投げているので、直接の原因が分からないままなのです。
今はデバッガで追うのも大変なので、全てのメソッド内をtry〜catchブロックでくくって、
一度スタックトレースを表示してから再度投げるようにしてますが、
実装したProviderのメソッドでnullを返してしまったがために、
JFace内で起きたNullPointerExceptionとかには対応できません。
というわけで、何とか元の例外を知る方法は無いものかと・・・。
0713デフォルトの名無しさん
NGNG>いえ、JFace内で全ての例外をキャッチして、
そのcatch節でブレークできる場合,
たとえばcatch(Exception e)なら,
Displayビューでe.printStackTrace();をDisplayすれば
ソースをいじらずに元の例外のスタックトレースが見られる.
catch節がからっぽでブレークできないなら,ソースいじるか,
その手前で毎回止めて地道に追いかけてくしかないかな……
0714デフォルトの名無しさん
NGNG例外チェーンって言葉を勉強しなおせ。
>713
例外を置き換えてる、って言ってるんだから、その処理がどこかのcatch節に必ず書いてあるはず。
そこでブレークできる。
普通はThrowable#getCause()すればそんなもん探す必要無いんだけどなあ。
0715713
NGNGうん,それは期待できるんだけど,
catch節の外で投げなおしてる可能性もゼロではないので,
保険として書いておいたのだ.
eclipseのAssertionFailedExceptionは
例外チェインみたいな仕組みには対応してないのがちょっとアレだよね.
別にJDK1.4じゃなくても独自に実装できるのだし.
0716デファルトの名無しさん
NGNG登録してます。
以下のプログラムは何かおかしいでしょうか?
---------------------------------(抜粋ここから)
public void create(Composite parent){
this.parent = parent;
Composite composite = new Composite(parent, SWT.NULL);
composite.setLayout(new FillLayout(SWT.HORIZONTAL));
Label label = new Label(composite, SWT.NULL);
label.setText("hoge");
composite.addKeyListener(new L1(composite));
}
class L1 extends KeyAdapter{
Composite composite;
L1(Composite composite){
this.composite = composite;
}
public void keyPressed(KeyEvent e){
System.out.println(e);
composite.dispose();
new TChangeView().create(parent);
}
}
---------------------------------(ここまで)
0717デファルトの名無しさん
NGNG補足
イベントリスナーの中でdisposeするってだめ?
画面切り替えってどうするものか、
いいサンプルあったら教えてください〜
0718709
NGNGいえ、例外チェーンになってたらすぐに分かるのですが、
本当に原因となった元の例外が失われてるですよ。
ちなみに、もしかしてと思ってThrowable#getCause()も試していました。
今までもデバッガで原因を探ってたりしたのですが、
もう少し簡単に分からないものかと思ったです。
>>713のDisplayビューを使う方法は初めて知ったので、試してみます。
少しは楽になりそうです。
ありがとうございました。
0719山崎渉
NGNGピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
0720デフォルトの名無しさん
NGNG0721デフォルトの名無しさん
NGNG0722デフォルトの名無しさん
NGNG外からUIのパーツにアクセスするのに
いちいちUIスレッドと同期とってスレッド立てるのってめんどくさくねえ?
Layoutもウィジェットの追加もいちいちSwingと考え方が違うし、
コード書いてるとストレスがたまって暴れだしそうだ。。
SWTになれるころには、Swing が書けなくなっている罠。
誰か書いてたけど、
Swingの別実装とはできなかったんだろうか。。
0723デフォルトの名無しさん
NGNGまさかswingでイベントスレッド外から好き放題アクセスしてた?
0724デフォルトの名無しさん
NGNGイベントキューに放り込むようになってる。
Toolkitクラス見てみるよろし。
0725デフォルトの名無しさん
NGNG( ゚ Д゚)
0726722
NGNGうっ。やっぱりそういう話になる?
たとえばログをテキストエリアに書き出すのに、
それ用のクラス作ってそこにテキストエリアの参照をstaticで保持させて、
それ経由で各クラスからログを吐き出させてますた。
そこまででなくてもSwingだったら作ったフレームの参照渡せば
外から自由にいじれたじゃない?
SWTだととっても不自由に感じる。
とりあえずの解決として、UIのクラスにログ書き出し用のメソッド書いて、
そこでUIスレッドと同期したスレッドを立ててそれ経由で書かせてます。
でログ出力クラスにはUIクラスを保持させると。
でもこんな感じでボタンの有効/無効操作とかテールへの出力とかが
たくさんある。ある程度アクセスするクラスは絞ってるんだけど
さらに絞らんときついなあ。。
SWTだとどうするのが一番いいの?
UIアクセス用のクラスを作るとか?
>>724
それをいちいち書かされるのがイヤ。
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
とか書くのもめんどくさい。
主観的だけどどんどん可読性が落ちてく。。
テーブルさえ持ってれば、もうAWTでいいんだけど。
0727デフォルトの名無しさん
NGNG0728デフォルトの名無しさん
NGNGvoid log(String text) {
textWidget.appendText(text);
}
swing:
void log(final String text) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
textWidget.appendText(text);
}
});
}
SWT:
void log(final String text) {
Display.getCurrent().asyncExec(new Runnable() {
public void run() {
textWidget.appendText(text);
}
});
}
0729722
NGNGありがとー。
結局SWTでUIにアクセスするには
必ずUIスレッドに明示的に同期/非同期でRunnable投げろってことすね。
そのへん何で隠蔽してくれないんだろね。
そういう疑問は、
「なんでjavaって型を自動変換してれないの?」
ってのとおんなじかな。。
0730デフォルトの名無しさん
NGNGSWTでっていうかswingでもな
0731デフォルトの名無しさん
NGNG0732デフォルトの名無しさん
NGNG>そのへん何で隠蔽してくれないんだろね。
SWT自体は元々eclipseを構成する中の、比較的低レベルなライブラリィだから。
隠蔽したいならeclipseのソース全体を参考にしつつ、自分で書いてみ。
>>731
マルチスレッドでの同期問題を前提にしていないO/Sや言語のほうがダサい。
0733デフォルトの名無しさん
NGNGTabFolder tf = new TabFolder(shell, SWT.NONE);
TabItem ti1 = new TabItem(tf, SWT.NONE);
ti1.setText("1");
TabItem ti2 = new TabItem(tf, SWT.NONE);
ti2.setText("2");
こんな感じで作ったタブのうち、起動時に2番目のやつが前面に出ているようにしたいのですが。
0734デフォルトの名無しさん
NGNGtf.setSelection(1);
0735デフォルトの名無しさん
NGNG>SWT自体は元々eclipseを構成する中の、比較的低レベルなライブラリィだから。
IBMによるJ2ME/PersonalProfile for Linuxのβ実装見てると、
java.awt -> SWT -> Qt/gtk/motifなんてなってる。
IBMとかOTIの社内じゃほんと汎用的な低レベルライブラリとして
位置付けられているんだろうな。
0736デフォルトの名無しさん
NGNGなんかJavaらしくないな。
0737デフォルトの名無しさん
NGNGかなりの数のOS/Window Systemで動くけどね。
0738デフォルトの名無しさん
NGNGイチイチ書き直すなんてダサすぎ。
0739デフォルトの名無しさん
NGNGそもそも適用できるレイヤが違う物同士に”単一の書き方”を求めるのが間違い。
反論その二
”これで全てOK”な究極の書き方が数年そこらで出来るはずなし。GUIなら尚更。
0740デフォルトの名無しさん
NGNG>>731
0741デフォルトの名無しさん
NGNGあまりにアホすぎて涙が出てくる
0742デフォルトの名無しさん
NGNG>>741には説明できないんだろうな。かわいそう。
0743デフォルトの名無しさん
NGNG>>739
…理解できない事象は無視してしまうのか。プログラマーに向いてないからやめた方が良いよ。
0744デフォルトの名無しさん
NGNGなんでもかんでも全部理解しようとする奴はすぐ限界に直面する。
分からんことは他人に任せる奴がもっともプログラマ向きだよ。
でもまぁ、Javaはほか言語と比べてダサくないよ、全然。
素直な人間の発想と比べればJavaではまだまだダサいのでせう。
0745722
NGNGそのためのJFaceフレームワークみたいだね。
完全隠蔽してくれないけど、同期は意識しなくていいみたい。
結局、Tableの予想以上の遅さにSWT化を断念しました。
AWTにListでTableっぽいの作って使おうかな。。。
>>736
AWTとSwingは書き方がほぼ一緒。
コンセプトはAWTとSWTがほぼ一緒。(端的に言うと)
0746デフォルトの名無しさん
NGNGAWTとSwingじゃスレッド回りが全然違うと思うが……
0747デフォルトの名無しさん
NGNG0748デフォルトの名無しさん
NGNGAWTは当時PureJavaのGUIパーツを作ってる暇無かったから仕方なく、だろ?
SWTみたいに速度や機能のために割り切ってるわけじゃないと思うが。
0749722
NGNG勉強不足ですた。
0750デフォルトの名無しさん
NGNG0751デフォルトの名無しさん
NGNGこのスレの>>238あたりを読め
■ このスレッドは過去ログ倉庫に格納されています