トップページ⇒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
0652649NGNG
>>651
今頃ですまんが、まだ2.1をDLしてる途中。
ミラーでも重いんだよね。

クラス見つからないって怒られてるんだから設定見直すか、
オープンソースなんだからソース追うか。どこまで動いてるかは調べられる。
0653648NGNG
>>649さん
import org.eclipse.core.internal.boot.DelegatingURLClassLoader;(無いと怒られてるクラス)
をしようとした所、コードインサート機能ではinternalまでしか表示されなかった
ので別のjarファイルがいると思い外部jarの追加画面とにらめっこしてました。
 結果 org.eclipse.core.boot_2.1.0\boot.jarを追加する事でちゃんと実行されました。

 649さん 650さんアドバイスありがとうございました。
0654デフォルトの名無しさんNGNG
org.eclipse.swt.custom.StyledText
を使って、ハイパーリンクの抽出・埋め込みを実現したいのですが、
カーソルの変更やクリックの検出をするにはどういう手順がいいでしょうか?

手順1:
1) パーズ時に、ハイパーリンクの文字列が現れる offset を覚えておく
2) MouseListener, MouseMoveListener を作って、StyledText のメソッド
 int getOffsetAtLocation(Point point)
 を使い、xy 座標から offset を求め、処理をするかどうか判断

このように実装しようと考えていますが、ちょっと面倒です。
他に良い方法はないでしょうか?
0655654NGNG
ふぅむ・・もう少し自分で調べてみましたが、>654 にある手順でないと
実現しようがないみたいです。
その代わり、StyleRange に offset を持たせて、カーソルの変更や
クリックの検出などは、StyledText のメソッド
StyleRange getStyleRangeAtOffset(int offset)
を使って、そのスタイルの違いから判断させることにしました。
0656デフォルトの名無しさんNGNG
>>655
StyleRangeそのものから判断するのは不自然だし,
表示スタイルが変わったときなど,後々面倒なことになる可能性がある.
LinkedStyleRangeみたいなサブクラスを作るか,
もっと汎用的に独自のスタイル情報を持てるAdaptableStyleRangeを
作るのがいいかも知らんね.
0657654,655NGNG
>>656
レスありがとうございますにゃ。
おっしゃる通り LinkedStyleRange みたいなクラスを作って実装しました。
というのも、大量のテキストに一度にスタイルを指定して StyledText に
レンダリングさせようとすると、ものすごく時間がかかることが判明したからです。

ですので、StyledText をスクロールさせるたびに徐々にスタイルを
適用する、Lazy なレンダリングをさせることにしたので、
結局 LinkedStyleRange のようなクラスが必要でした。

#あと、なぜ SWT.WRAP を指定してワードラップをさせると、
#StyledText#setText() などに異常に時間がかかるんでしょうかね…。

Linked〜 は想像がつきますが、AdaptableStyleRange というのは
どんな働きをするんでしょうか? よろしかったらご教授ください。
0658デフォルトの名無しさんNGNG
>>657
>#あと、なぜ SWT.WRAP を指定してワードラップをさせると、

多分視覚的な改行位置の計算が大変なんじゃないかと.

>AdaptableStyleRange というのは

eclipseのIAdaptableとかがそうだけど,
AdaptableStyleRange a = ...;
ILink link = (ILink)a.getAdapter(ILink.class);
if(link != null)
    link.hoge();
みたいな.

Adapterパターンのちょっと変則型かな?
ILinkを相手であることがはっきりするというのと,
ILink以外にも独自スタイルがある場合に
継承関係がごちゃごちゃしないですむというのがご利益,だと思う.

今回みたいな単純なケースではやりすぎかも.
0659657NGNG
>>658

どうもありがとうございました。勉強になりました。
日頃から、小さな実装であっても本質を見出そうと抽象化を試みるのは
大切な練習になると思います。

いつもそうしてないとデザパタとか忘れそうですし。
まぁ二度と使わないようなソースコードにも、つい厳密な OO の洗礼を
施したくなっちゃって時間かけたけど、でもやっぱり二度と使わなかった、
というのもままありますけどね(笑)
0660デフォルトの名無しさんNGNG
…まぁ二度と使わなくても、パターンの使い方は自分の中に累積されるから
将来それを再利用する場合もあるか・・。
0661山崎渉NGNG
(^^)
0662山崎渉NGNG
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
0663デフォルトの名無しさんNGNG
ダメだ。
メモリ食いすぎ。
Javadoc手抜き過ぎ。SWTクラスのstatic finalの説明なんか無い奴もあるし。
レイアウトもウィジェットのスタイルも、指定できる種類がSwingに比べて少なすぎ。
0664デフォルトの名無しさんNGNG
今は256MBくらい消費しないとメモリ食い過ぎとは言わないよな。
0665デフォルトの名無しさんNGNG
そうでもない
0666デフォルトの名無しさんNGNG
〜7MB 激軽
〜10MB 軽い
〜12MB 中堅
〜20MB 重い
それより上 糞重い
0667デフォルトの名無しさんNGNG
メモリの食い方と重い軽いはちとち
0668デフォルトの名無しさんNGNG
重い軽いはメモリの食い方だろ。
0669デフォルトの名無しさんNGNG
むしゃむしゃ
0670デフォルトの名無しさんNGNG
スレ違いだが重い軽いは人間様が判断するべきもの。

メモリ食わなくても人間様の感触として重いのなら重いし、
いくらメモリ食っても人間様の感触で重くなきゃ重くなく、
そこでメモリの実使用量などただの数値でしかない。
人間様の快適のほうが無限に重要。

スレ違いsage。
0671デフォルトの名無しさんNGNG
ちょっと前にWidgetの継承についての話が出てたけど、蒸し返してもいい?

おいらもJavaでのGUIはSwingしか経験がないんだけど、
Widgetを継承させずに作っていくやりかたが良く分からない。

例えばファイルマネージャみたいなのを作ってて、フォルダツリーを表示させたいとき、
Treeを継承したFolderTreeクラスを作って、getSelectionFile()みたいなメソッドを追加して、
選択されたフォルダをFileオブジェクトとして取れるようにしたりしたい。

でなければ、Treeを使う側のクラスに、
選択されたTreeItemからFileを作成する処理を持たないといけないので、
だんだんと厨なVBのソースみたくなってくる。
個々のWidgetの振る舞いの責任を、全て使う側が持ったがため、
肥大化したソースが出来てく感じ。

>>230が言ってた「リスナによる拡張」がキーになるのかとも思うけど、
上記の例で言えばどういう風に設計すればいいのでせうか?
長文すんません。
0672デフォルトの名無しさんNGNG
>>671
getSelectionFile()みたいなやり方すると,FolderTreeに依存するわけだ.
そーゆーのはよろしくないだろう,というのが一つの考え方.
(たとえば後々Tableに変更するかもしれないでしょう.
もちろんTreeは継承不可というのもSWTの場合は理由だけど)

>>230で書いたのは純粋にWidgetレベルの話だけど,
今回のは一段上の構造を含む話だと思う.
話としては2つ含まれてて,選択情報を得る方法と,
選択情報からディレクトリ等のアプリ固有のデータを得る方法.

選択情報を得る方法に関しては,
例えばJFaceの場合,選択を管理するフレームワークがあって,
ディレクトリツリーを表示するモジュールは
そのフレームワークに対して選択情報を適宜提供する.
で,選択に反応したいモジュールはそのフレームワークに対して
選択リスナを登録して,随時選択情報を受け取る.
SWT直接叩く場合もこんな風にすれば,
選択の提供側と消費側の依存関係が排除できる.

(つづく)
0673デフォルトの名無しさんNGNG
アプリ固有のデータを得る方法に関しては,
JFace使うとObjectで取れるので,提供側と消費側に合意があれば
キャストするとか,そういう話になる.
SWT直接叩くなら,選択情報を提供するときに,
あらかじめFileにしてから提供するとか.

具体的にはTreeにSelectionListener登録しといて,
通知が着たらFileに変換して他のモジュールに再通知してやる
FolderViewみたいなものをTree継承しないで作る.
FolderViewにgetSelectionFile()を作ってもいいし.

もちろん他にもいろいろ方法はあるだろうけど,
ひとつのやり方としてはこんな感じだと思う.


ところでswingでやるとしたらFolderTreeみたいなのは使わず,
FolderTreeSelectionModelみたいなのを作るのも手.
WidgetをFolder専用にするんじゃなくて,モデル側でというやり方.


長文スマソ
0674671NGNG
>>672
すばやいレスさんくす。疑問は氷解しますた。
Widgetとの間に、橋渡しを行うクラスを導入して、結合を疎にするということですか。
で、その橋渡しをリスナを通じて行うと。

Swingでの場合に〜Modelを導入するのは初めて知ったけど、
今APIdoc見たらSwingにListModelってのがあって、少し調べてみますた。

実はSWTのサンプルのFileViewerのソースは見てたんだけど、
「Widget継承させればもっと簡単に分かりやすくなるのに」としか思ってなかった。
でも、今見てみると新たな発見がありそうなので、読み直してみます。

>>672さん、ありがとうございました。
0675デフォルトの名無しさんNGNG
>>672-673
院生さんですか?

それはともかく、俺は継承しまくってます。。。
ISA関係になるやつは継承するようにしてるんですがまずいですかねぇ。やきもき
0676デフォルトの名無しさんNGNG
>>675
院生じゃないよ.

ところでJavadoc見ると
IMPORTANT: This class is not intended to be subclassed.
と書いてある通り,SWTでTreeとか継承するのはよろしくない.
swingなら別に,好みの問題だと思うけど.
0677デフォルトの名無しさんNGNG
>>676
そうですか。どうも。
J2SE1.4.2beta入れてSwingでブラウザ作り始めてるんですけど、好みの問題とのことで安心しました。
SWTはgcjでちゃんと動かせるようになったら使おうと思ってます。

ちなみに論文では,と.を使うので院生さんかなと思ったのです。
#Emacsの話だけど俺はtex-modeだけは (setq its-hira-comma "," its-hira-period ".") してるので。


うぉおぉお、全然まとまりのないゴミレスですいません。。
0678デフォルトの名無しさんNGNG
>>677
まぁどっちにしても,実績のあるコテハンでもなし,
漏れなんかの発言に惑わされるこたないと思う.

",."は昔からだなー.中学時分からかも.
0679デフォルトの名無しさんNGNG
俺は思いっきり FolderTree みたいなクラス使っちゃってる(笑)
とりあえず面倒くさかったから・・。
でも面白そうだから後々 Model や Provider で作りたいと思ってます。
0680デフォルトの名無しさんNGNG
複数のスレッドがTCPの通信内容をStyledTextに書き込むアプリを作ってるですが、
各スレッドが直接StyledText#append()するとSWTExceptionが出るので、
Display#asyncExec()の引数にappend()するスレッドを渡して書かせようとしてます。
が、何故かStyledTextに表示されない場合があります。

渡したスレッドのrun()の中でSystem.out.println()するとちゃんと標準出力にはでるので、
実行されてないわけではなく、本当にStyledTextに書いてくれてないだけのようです。
どなたかこの辺の事情通な方、教えてください。
0681680NGNG
すまそ。あげ忘れますた。
0682デフォルトの名無しさんNGNG
age厨しね
0683680NGNG
すんません。sage進行だとは知りませんでした。お許しを。<_o_>
0684デフォルトの名無しさんNGNG
>>680
渡すのはスレッドじゃなくてRunnableね.

で,そういう症状は聞いたことないし,
そんな単純な問題がいまさら残ってるとも思えないので,
多分おまいさんのコードに問題がある.

非同期にappendするために渡したデータを
append前に書き換えちゃってないか?
asyncExecじゃなくsyncExecにするとどうだ?

コードの別の場所でテキストの置き換えや削除をしてないか?
そのコードが何らかの理由で実行されてないか?

まずはappendしてるとこでブレークしてSWTの中まで
ステップ実行してみるとか.
そうやって覗いてる間は再現しないかもだけど.
0685680NGNG
>>684
あう・・・。コードですか・・・。
メソッドの引数が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
>>685
それなら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()してみると,どーだろうね.
0687680NGNG
すんません。>>680の件ですが、デバッグでの実行時はもとより、
普通に実行させても再現できなくなりました。
何度も複数のスレッドから大量にStyledTextに書き込ませて、
一件ずつログを追って確認してみたのですが、全て表示されてました。
ここに至って原因は「勘違い」であると断定しました。

>>684様をはじめ、考えてくださった方々、どうも申し訳ありませんですた。
おかしかったのは、DisplayでもasyncExec()でもStyledTextなく私の頭でした。
0688デフォルトの名無しさんNGNG
すみません、質問させてくらさい。

SWTのTableクラスを利用してウィンドウにテーブルを張っつけてます。
テーブルヘッダを作成する為に下記のようなコードを書きました。
TableColumn col = new TableColumn(table, SWT.LEFT);
col.setText("hoge");

で、一度作成したテーブルヘッダを動的に削除する方法が分かりません。
ご存知の方が居ましたらアドバイス宜しくお願いします。
0689デフォルトの名無しさんNGNG
SWTスレ見つけたのでここで質問しようかと思います。

SWT始めてみますた。
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
>>688
>>458

>>689
コマンドプロンプトから実際のコマンド行をコピペしたら何かわかるかも.
どっちにしてもSWTとは関係ないJNIのレベルの話だかが.
0691デフォルトの名無しさんNGNG
俺
gcjって使ってる人います?
http://pc2.2ch.net/test/read.cgi/tech/1046627795/50-51
だけど、同じ症状かもね。
0692デフォルトの名無しさんNGNG
あ、全然違うね。すまそ。
-Djava.library.path=dllへのパス
してみれば?
0693デフォルトの名無しさんNGNG
>>692
だからそれは試したって書いてあるだろ?
0694デフォルトの名無しさんNGNG
>>690

ありがとーございます。
table.getColumns()で取得したTableColumn[] に対して
dispose()したら上手く行きました。

感謝感謝っす。
0695デフォルトの名無しさんNGNG
monalipse
0696デフォルトの名無しさんNGNG
eclipseつかって、SWTを使いとりあえず、WindowAPIを使った画面出そうと思っているのですが、
うまくいきません。
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デフォルトの名無しさんNGNG
>>698
system32に放り込め。確実に逝ける。
0700デフォルトの名無しさんNGNG
>>699

>696は、忘れたころにPC換えて、また同じエラーで悩むと思われ。
0701デフォルトの名無しさんNGNG
>>698
>>699
>>700
ありがとうございます。swt-win32-2052.dll はコンパイル後実行する時に、必要と書いてあったのは覚えていたんですが、
よく考えたら、ビルドした時点で実行してるんですよね。

くだらない質問に答えていただいてありがとうございます。
0702デフォルトの名無しさんNGNG
>>701
あんたの思い込みが正しいとしたら、

な ん の た め の ダ イ ナ ミ ッ ク リ ン ク かと小一時間。
0703デフォルトの名無しさんNGNG
ところでところで、>>696はどんなWindows APIを使おうとしてるの?
今のところIEコンポーネントOLEを呼び出すのしか例を見た事無いから、
できればどんな感じでAPIを呼び出してるのか教えてちょ
0704SWT厨房NGNG
http://download2.eclipse.org/downloads/drops/R-2.1-200303272130/index.php
いつの間にか(一月前からみたいだけど)、eclipse公式で、
SWT単体でダウンロードできる様になってたよ。
0705デフォルトの名無しさんNGNG
SWTSwing
http://chrriis.brainlex.com/swtswing/
0706デフォルトの名無しさんNGNG
SWT関連技術
ClientGUIもJavaが制覇「もう誰にも止められない」
http://girlcom.ghostsp.com/swttop.html
0707デフォルトの名無しさんNGNG
WizOnline開発中!プログラマ緊急募集(C,Java)
http://219.96.231.242/wizonline/
2chスレ
http://game3.2ch.net/mmominor/dat/1053536167.dat




0708デファルトの名無しさんNGNG
「キー入力したら画面を切り替える」
っていうのをやりたいんですが、うまくいきません。
KeyListener#keyPressed()の中で、
前の画面のCompositeをdisposeして、
新しいCompositeを作成ってしてるんですが、
新しい画面でイベントが拾えなくなります。
(CompoisteはShellの子の子に配置しています)

何かいい方法、サンプル、デバッグ手段等あったら、教えてください。
0709デフォルトの名無しさんNGNG
JFaceの質問もここでいいですか?

IStructuredContentProviderや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
>>709
何がクソで何が意味不明なの?

>  at org.eclipse.core.internal.runtime.〜・・・がだらだら続いて、
の最初の要素が直接の発生場所を示してるわけでしょ.
デバッガで覗けばいいじゃない.
0711デフォルトの名無しさんNGNG
>>708
基本的なことだけれど,
Listenerはちゃんと新しいCompositeに登録しなおしてる?
0712709NGNG
>>710 ありがとうございます。

>何がクソで何が意味不明なの?

何が起きようともAssertionFailedExceptionに置き換えられてしまうところが・・・。

>の最初の要素が直接の発生場所を示してるわけでしょ.

いえ、JFace内で全ての例外をキャッチして、
新しいAssertionFailedExceptionを投げているので、直接の原因が分からないままなのです。

今はデバッガで追うのも大変なので、全てのメソッド内をtry〜catchブロックでくくって、
一度スタックトレースを表示してから再度投げるようにしてますが、
実装したProviderのメソッドでnullを返してしまったがために、
JFace内で起きたNullPointerExceptionとかには対応できません。

というわけで、何とか元の例外を知る方法は無いものかと・・・。
0713デフォルトの名無しさんNGNG
>>712
>いえ、JFace内で全ての例外をキャッチして、

そのcatch節でブレークできる場合,
たとえばcatch(Exception e)なら,
Displayビューでe.printStackTrace();をDisplayすれば
ソースをいじらずに元の例外のスタックトレースが見られる.

catch節がからっぽでブレークできないなら,ソースいじるか,
その手前で毎回止めて地道に追いかけてくしかないかな……
0714デフォルトの名無しさんNGNG
>何が起きようともAssertionFailedExceptionに置き換えられてしまうところが・・・。

例外チェーンって言葉を勉強しなおせ。

>713
例外を置き換えてる、って言ってるんだから、その処理がどこかのcatch節に必ず書いてあるはず。
そこでブレークできる。

普通はThrowable#getCause()すればそんなもん探す必要無いんだけどなあ。
0715713NGNG
>>714
うん,それは期待できるんだけど,
catch節の外で投げなおしてる可能性もゼロではないので,
保険として書いておいたのだ.

eclipseのAssertionFailedExceptionは
例外チェインみたいな仕組みには対応してないのがちょっとアレだよね.
別にJDK1.4じゃなくても独自に実装できるのだし.
0716デファルトの名無しさんNGNG
>>711
登録してます。

以下のプログラムは何かおかしいでしょうか?

---------------------------------(抜粋ここから)
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
>>716
補足
イベントリスナーの中でdisposeするってだめ?

画面切り替えってどうするものか、
いいサンプルあったら教えてください〜
0718709NGNG
>>714
いえ、例外チェーンになってたらすぐに分かるのですが、
本当に原因となった元の例外が失われてるですよ。

ちなみに、もしかしてと思ってThrowable#getCause()も試していました。
今までもデバッガで原因を探ってたりしたのですが、
もう少し簡単に分からないものかと思ったです。

>>713のDisplayビューを使う方法は初めて知ったので、試してみます。
少しは楽になりそうです。

ありがとうございました。
0719山崎渉NGNG
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
0720デフォルトの名無しさんNGNG
保守
0721デフォルトの名無しさんNGNG
SwingとSWT比べてどっちが簡単に覚えられそうでしょう?
0722デフォルトの名無しさんNGNG
今SwingのUIをSWTに書き換えているんだが、
外からUIのパーツにアクセスするのに
いちいちUIスレッドと同期とってスレッド立てるのってめんどくさくねえ?
Layoutもウィジェットの追加もいちいちSwingと考え方が違うし、
コード書いてるとストレスがたまって暴れだしそうだ。。
SWTになれるころには、Swing が書けなくなっている罠。

誰か書いてたけど、
Swingの別実装とはできなかったんだろうか。。
0723デフォルトの名無しさんNGNG
>>722
まさかswingでイベントスレッド外から好き放題アクセスしてた?
0724デフォルトの名無しさんNGNG
AWT/Swingは内部で同期してるよ。
イベントキューに放り込むようになってる。
Toolkitクラス見てみるよろし。
0725デフォルトの名無しさんNGNG
  _, ._
( ゚ Д゚)
0726722NGNG
>>723
うっ。やっぱりそういう話になる?
たとえばログをテキストエリアに書き出すのに、
それ用のクラス作ってそこにテキストエリアの参照をstaticで保持させて、
それ経由で各クラスからログを吐き出させてますた。

そこまででなくてもSwingだったら作ったフレームの参照渡せば
外から自由にいじれたじゃない?
SWTだととっても不自由に感じる。

とりあえずの解決として、UIのクラスにログ書き出し用のメソッド書いて、
そこでUIスレッドと同期したスレッドを立ててそれ経由で書かせてます。
でログ出力クラスにはUIクラスを保持させると。

でもこんな感じでボタンの有効/無効操作とかテールへの出力とかが
たくさんある。ある程度アクセスするクラスは絞ってるんだけど
さらに絞らんときついなあ。。
SWTだとどうするのが一番いいの?
UIアクセス用のクラスを作るとか?

>>724
それをいちいち書かされるのがイヤ。
while (!shell.isDisposed()) {
  if (!display.readAndDispatch())
  display.sleep();
}
とか書くのもめんどくさい。
主観的だけどどんどん可読性が落ちてく。。

テーブルさえ持ってれば、もうAWTでいいんだけど。
0727デフォルトの名無しさんNGNG
速さを得るためには何かが犠牲になるものよ
0728デフォルトの名無しさんNGNG
AWT:
void 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);
      }
    });
}
0729722NGNG
>>728
ありがとー。
結局SWTでUIにアクセスするには
必ずUIスレッドに明示的に同期/非同期でRunnable投げろってことすね。
そのへん何で隠蔽してくれないんだろね。
そういう疑問は、
「なんでjavaって型を自動変換してれないの?」
ってのとおんなじかな。。
0730デフォルトの名無しさんNGNG
>>722
SWTでっていうかswingでもな
0731デフォルトの名無しさんNGNG
Javaってこのへんダサいな。使わずに済んでよかったよ。
0732デフォルトの名無しさんNGNG
>>722
>そのへん何で隠蔽してくれないんだろね。

SWT自体は元々eclipseを構成する中の、比較的低レベルなライブラリィだから。

隠蔽したいならeclipseのソース全体を参考にしつつ、自分で書いてみ。

>>731

マルチスレッドでの同期問題を前提にしていないO/Sや言語のほうがダサい。
0733デフォルトの名無しさんNGNG
複数のタブアイテムのうち1つを最前面に出す場合はどうすれば良いんでしょうか?

 TabFolder 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デフォルトの名無しさんNGNG
>>733
tf.setSelection(1);
0735デフォルトの名無しさんNGNG
>>732
>SWT自体は元々eclipseを構成する中の、比較的低レベルなライブラリィだから。
IBMによるJ2ME/PersonalProfile for Linuxのβ実装見てると、
java.awt -> SWT -> Qt/gtk/motifなんてなってる。
IBMとかOTIの社内じゃほんと汎用的な低レベルライブラリとして
位置付けられているんだろうな。
0736デフォルトの名無しさんNGNG
awt/Swing/SWTそれぞれコードの書き方が違うの?
なんかJavaらしくないな。
0737デフォルトの名無しさんNGNG
Javaらしさってなんだろ。マルチ環境って意味だと↑のどれ選んでも
かなりの数のOS/Window Systemで動くけどね。
0738デフォルトの名無しさんNGNG
Javaなんだから、単一の書き方で全てに対応できるべき。
イチイチ書き直すなんてダサすぎ。
0739デフォルトの名無しさんNGNG
反論その一
そもそも適用できるレイヤが違う物同士に”単一の書き方”を求めるのが間違い。

反論その二
”これで全てOK”な究極の書き方が数年そこらで出来るはずなし。GUIなら尚更。
0740デフォルトの名無しさんNGNG
>>739
>>731
0741デフォルトの名無しさんNGNG
>>736とか>>738とかただの煽り屋なんだろうけど
あまりにアホすぎて涙が出てくる
0742デフォルトの名無しさんNGNG
>>738は一理あると思うんだが、
>>741には説明できないんだろうな。かわいそう。
0743デフォルトの名無しさんNGNG
>>742
>>739



…理解できない事象は無視してしまうのか。プログラマーに向いてないからやめた方が良いよ。
0744デフォルトの名無しさんNGNG
>>743

なんでもかんでも全部理解しようとする奴はすぐ限界に直面する。
分からんことは他人に任せる奴がもっともプログラマ向きだよ。

でもまぁ、Javaはほか言語と比べてダサくないよ、全然。
素直な人間の発想と比べればJavaではまだまだダサいのでせう。
0745722NGNG
>>732
そのためのJFaceフレームワークみたいだね。
完全隠蔽してくれないけど、同期は意識しなくていいみたい。

結局、Tableの予想以上の遅さにSWT化を断念しました。
AWTにListでTableっぽいの作って使おうかな。。。

>>736
AWTとSwingは書き方がほぼ一緒。
コンセプトはAWTとSWTがほぼ一緒。(端的に言うと)
0746デフォルトの名無しさんNGNG
JFaceでマルチスレッドの扱いがSWTと変わるわけでもないし,
AWTとSwingじゃスレッド回りが全然違うと思うが……
0747デフォルトの名無しさんNGNG
SwingってAWTと同居してたような気がするけど、なんで違うの?
0748デフォルトの名無しさんNGNG
>>745

AWTは当時PureJavaのGUIパーツを作ってる暇無かったから仕方なく、だろ?
SWTみたいに速度や機能のために割り切ってるわけじゃないと思うが。
0749722NGNG
うーん、乱暴やったなー。
勉強不足ですた。
0750デフォルトの名無しさんNGNG
Tableってそんなに遅いか?
0751デフォルトの名無しさんNGNG
>>750
このスレの>>238あたりを読め
■ このスレッドは過去ログ倉庫に格納されています