Java低速GUI Swing 10
このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究所 >>3 そのコピペは立て逃げスレに貼るものなんだが _,,,,,ィ=ー-、_ / /. : : : : : : : : : : .ヽ / ィ /. : /: : : : : : : : : : : : .\ / ┼ /. : /: : : : ハ: : :}斗、ヽ: : .| ノ |. : /_: 斗〒\八」 ∨リリ _,_ 乂レl;W弋ノ };l_> | | `` ∠___l;人 , ─ァ ノ'ノ |: :从ハ`┼一ィ刋:::\ r┴, |: : : : : : :};Y/ハ{;;;;;;;;ノ / ヽ-‐ァ‐ァ';|l/\∧イ \ / /\/;;|l' ̄ハ } \ / |;;メ二ニ| | ャ、__/l;lゝ ト‐| / `/|_,_|;|,_,_,_,_,_ト′ / / |==|;|=====| ∠、,,ィ〜' └r幵─‐r七 {Ξ} 匕} Swingってなんでこんなに人気ないの? 割りと真面目に教えて下さい AWTもターゲットに入ってていいんだよね? Q. AWT と Swing 混ぜちゃ駄目って聞いたんですけど 混ぜちゃ駄目なんですか・・・・? A. 今まででは、「駄目」というのが正解です。 が、現在開発中(未リリース)のバージョンではSwingとAWTの混在ができるようになっています。 正式リリースがされるまで、情報の錯綜があって混乱すると思いますが 普通の人にとっては「まだ駄目」という状況だと思ってください。 Q. Nimbusって何よ。 A. 次期Swingの標準となるとされているLAFです。 元々は、SUNのGnome環境のテーマに使われていた見た目を移植したものになります。 実装にはXMLベースでLAFを定義できるSynthLookAndFeel を利用しています。 jdk6の開発版で試す事ができます。 Q. こんなプログラムを作れって言われたんですが・・・ A. 宿題スレへどうぞ。 Q. なんでスレタイに低速って入ってるの? A. まだまだ速くなるってことさ。 Q. JavaFX と Swing 混ぜちゃ駄目なの? A. SwingベースのアプリにJavaFXコンポーネントを乗せるのはOKです。 逆は不可です。(JavaFX2.0現在)ちなみに、JavaFX2.0は今年の下旬に リリースされます。今はベータ版です。 Nimbusに変えたいけどレイアウトが崩れるし 微妙にセンスが悪い気がするので結局Windowsのままだ Nimbusと混ぜるとウマーとJOGLパイプライン統合とアプレットのDnDはもうQ&Aでもよさそう。 SwingX系はJRE7の一般DL以降くらいじゃねか? JavaFXまわりは検討もつかん。JavaFXはprismエンジンだから描画スレッドとEDT別だよってのはここの範疇? >>7 見た目はWindowsのLookAndFeelでぎりぎりなんとかなるけど、 ファイル選択ダイアログの細部の挙動がネイティブと違って気持ち悪い。 あと、テキストフィールドで右クリックしたときの挙動とか。 でも、大きな理由はそんな細部じゃなくて、起動が遅いこと。 ディスクキャッシュに乗ってないとJVM起動して、関連するクラスロードして、 最初のフレーム表示するまでに数秒かかる。 動き出せばネイティブとの速度的な差はない。 会社で使う分には、起動が遅い方が、いいよ。その分、ゆとりがでる。 商用のソフトじゃ使われてないから人気がないように見えるけど 社内とかだと結構使われてたりするよ 数千行のテキストを容易に表示できて 表示するテキストを後から容易に追加できて テキスト中に何らかのコンポーネント(テキストのリンク、アイコン、ボタンなどどれでも良い)も表示できて そこからイベントを発生させられるような コンポーネントはありますか? JEditorPaneでハイパーリンクを使うことを考えましたが HTMLにテキストを追加するのが容易ではないのと、テキスト追加が頻繁にあると重くなりそうで、別の選択肢が無いか探しています。 テキスト追加と、表示とを分けて考えたほうがいい。 たとえば編集にはJTextArea、表示にJEditorPaneを使って、Wikiっぽくするとか どうよ? どうしても同じ画面でやりたいとかじゃなきゃ、いけそうだが。 テキスト追加はユーザが編集するのではなくて プログラムがテキストを出力します >>26 難しい、重いと思うならコンポーネントなんか使わないで独自実装でもすれば? ぐだぐだ抜かしてないで、まず実装してから最適化しろよ。 >>24 数千行くらいJEditorPaneで十分だがJListでも使っとけ >>27 質問の意図を理解してないアホは死ね >>28 どうもです JavaFXって一体どこで使うべき技術なのかいまいち分からない。 >>32 んなもん、おまぇ、Swingの代わりだろ・・ >>33 JavaFXってSwingに依存してないってこと? SwingもそのうちJava標準GUIライブラリの地位を 剥奪されたりすんのかな >>34 依存しなくてもできるし、依存してもいい。 もともと、JavaFXスクリプトっていって、WindowsプログラムにおけるWPFのような お気軽なGUI設計思考で作られた。でも、スクリプト自体がなんもなくなってしまった。 JavaFXにはコンポーネントが不足してるのでSwingも使う→ Swingにはリッチなコンポーネントが不足しているのでSwingXも使う(java7いまここ)→Swing labは終ってしまったので結局路頭に迷う。 Swingはん、まだまだこれからやで〜。 わし、今日、3980円もする、JavaGUIVol.1ていう、Swingばっかの本こうてきたわ。 奇遇やな わしおととい図書館でVol.2借りてきたで 付属のCDにVol1のソースまで付いてきて得した気分になったで UI 関連は、タッチパネルUI勢、HTML5勢の勢いがすごいからな すぐに Swing 並の API が JavaScript で用意できるか俺は懐疑的だが もしものすごい実装用意されたら、ついに Swing は終わってしまうな HTML5全盛の今でも、PCではまだIE6サポートしないといけないから実戦では使えない 流れてくるメッセージがちょいちょい違うから混乱するかもな。 それで混乱して質問したら「なんでそんなことやってんだ」と罵倒される。 それに変なクセがつきそう。 練習ならメインウインドウにボタンやらエディットコントロールを貼り付ければ良いと思うよ。 全部CreateWindowでできる。 猫でもわかるかWisdomsoft参考にしろ。 JApplet(Swingのアプレット)にJTableって乗せれる? >>47 どうもです。Javaアプレット復権しないっすかね〜。 しないだろう というかあんな時代はもう来なくていい Javaメインに使ってる自分としては、わざわざActionScriptとか別に覚えるの面倒だから Appletのが良いかな。 全盛期のjavaアプレットは、あまりに重くてただのブラクラと化してたけど Swingみたく今はそうでもないのかね iOS や Windows 8 がすでに、もうブラウザ上で動くプログラムは HTML5 オンリーと決め込んでるからな Flash も Java も Silverlight も廃れるべきと奴らは考えてるらしい。 おれが思いうに Java は着々とセキュリティホールは塞がれてるし、 動作速度も速い。ブラウザの対応も年の功で進んでる。開発環境は 揃ってて、クロスプラットフォームのクライアントサイドの技術と しては今ある中ではベストだと思うよ。 ブラウザがダメになるならAppletを実行・起動するにはどうすればいいんですか? JavaWebStartってアプレット扱えなかったっけ? ウィンドウベースのアプリケーションに移植するなら JApplet.setContentPane(mainPane) のとこを JFrame.setContentPane(mainPane) とかすれば、まあ動くだろう まあ、アプレットはブラウザ上でセキュアに動くから、 ユーザにとって価値があるのであって、なんでもやらかす ウィンドウベースのレガシーなアプリケーションにされると よくないだろう そういえば Adobe AIR はどこにいったかね >>58 確かに、html + JavaScript(&ライブラリ)使って開発するよりは、Javaプログラマにとっては ハードルは下がりますね… しかしGWT使った開発、規模が大きくなるとすごく面倒。 コンパイルが洒落にならないくらい時間かかる、ってのが一番大きいと思うけど、他にもデバッグ時とか。 同等規模のhtml5風開発したこと無いのでJavaプログラマにとってどっちがよりましか、 ってのは分からないんだけどもね。 >>55 Java6u10でAppletもJava Web StartもセキュリティについてはJNLPファイルで指定するようになったから 一緒なんだと思ってたけど、違うのかな? http://java.sun.com/developer/technicalArticles/javase/6u10_applets/ とか、ちょっとURL見つからないけどAppletをデスクトップにドラッグ&ドロップすると 通常のアプリのようにアイコンダブルクリックで起動できるようになる(JWSとしてインストールされる?) みたいなデモも昔見たことあるんだけど、こういうのみたときAppletとJWSって実質 同じものなのかなー、なんて思ったんだけど。 >>54 これかな? http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/javaws/developersguide/syntax.html#applet_desc ごめん、多分 > Appletをデスクトップにドラッグ&ドロップすると > 通常のアプリのようにアイコンダブルクリックで起動できるようになる(JWSとしてインストールされる?) は記憶違い。 そして>>55 はJWSのことを言ってるわけじゃないことにも気付きました… GWTってWAVEと同じでもうオワコンなんでしょ? JavaFXがmobile&tabletでも動けばなぁ。 ここの部分は切り捨てなくてよかったと思うよJavaFX。 つかAndroidで動くCDC/PPがいるか。 javaでRIAがもっとしっかりしてればウェブトップ開発に使えたのに java質問スレとどっちに書くか迷ったのですが、こちらで 質問させてください。 BorderLayoutなJFrameのCENTER位置にJTabbedPaneを 置いて、MouseListener#mouseExitedを仕込みその中で setCursorsしています。 すると、JTabbedPaneから周りのcomponentにゆっくり カーソルを出した場合は、さらにwindow外にポインタを 出してもsetしたカーソルを維持してくれます。 が、マウスを早く動かして周りのcomponent上での滞空時間が 短くなるようにカーソルをwindow外に出した場合は、カーソルが 変わってくれなかったり、windowの大きさ変更のカーソルに なったりします。 これをゆっくり動かしたときと同じようにすることは出来ない でしょうか。 (mouseExitedイベント自体はちゃんと発生してます) (window外で発生するmouseDraggedイベント内でsetCursors してもカーソルは変わってくれませんでした) (setCursorsはRootPaneのGlassPaneにおこなっています) setCursorのjavadocに、「このコンポーネントの contains メソッドが 現在のカーソル位置に対して true を返」さないと駄目って書いてある じゃんorz マウスの動きが速くてsetCursor前にコンポーネント外に出てしまうと きかなくなっちゃう、って話ですね。 完全にawtの問題でした。質問すれに行きます。すれ汚しすまんかったです。 >>66 RIAとAndroidになんの関係があるんだ? SwingUtilities.invokeAndWait() が invocationTargetException をスローするとEDTが終了してくれないようなのですが、 何かいい対処方法ないでしょうか… ttp://javafaq.jp/S065.html#S065-37 ああ、ここらへんみたいです。自己解決しました。 5か6で必要なくなったけど全部のケースじゃなかったのか? >>71 EDTの生成、終了ってユーザが管理するものではないと思うが… 死んでも勝手に復活するぞ? SwingでmouseClickedの中でnew JDialog(...)してsetVisible(true)すると、 そこで処理が止まっちゃうんだけど、どうしたらいいの? class HogeListener extends MouseAdaptor { public voud mouseClicked(MouseEvent ev.) { JDialog dialog = new JDialog(...); System.out.println("1"); dialog.setVisible(true); System.out.println("2"); } } setModalityType()とかでモードレスに設定するか 普通にJFrameでも使おう。 さんくすです。 モーダルダイアログだとsetVisible(true)すると setVisible(false)かdisponse()するまで処理が止まるんですね。 http://pastebin.com/4qH6Adke 上記のようなTableTest.javaというjavaのソースファイルを実行すると、 下図のように、表の部分にマダマダ余白があるにも関わらずスクロールバーが現れてしまうUIとなってしまいます http://uproda.2ch-library.com/475736Up9/lib475736.jpg このレイアウトで余白がなくなるまでスクロールバーが表示されないようにするにはどうすれば良いでしょうか? また、初心者なので他に変な所があれば指摘頂けるとありがたいです >>81 35,36行目、JSplitPaneにつっこむところのJScrollPaneを消す。 >>82 出来ました!それすると表の項目名(xとy)が表示されないものとばかり思ってました ありがとうございます JTableの選択モードで ・クリックしたセルを含む行全体を選択(ハイライト) ・同時に選択できる行は1行のみ のようにするにはどう選択モードを設定すればよいですか? JTable table; table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.setCellSelectionEnabled(false); JEditorPaneにHTMLフォームを表示しsubmitボタンでフォームデータを表示するプログラムを ↓を参考に作成しましたが、submitボタンでNullPointerExceptionが発生します。 ttp://www15.plala.or.jp/kichijitsu/java/jeditorpane_submit.html どこがおかしいのでしょうか? editorPane.setEditable(false); editorPane.setContentType("text/html"); editorPane.setText(content); ((HTMLEditorKit) editorPane.getEditorKit()).setAutoFormSubmission(false); editorPane.addHyperlinkListener(new MyHyperlinkListener()); class MyHyperlinkListener implements HyperlinkListener { @Override public void hyperlinkUpdate(HyperlinkEvent event) { System.out.println("HOGEHOGE"); //←マウスがリンクに重なると表示されます。 if(event instanceof FormSubmitEvent) { System.out.println("PIYOPIYO"); //←submitボタンを押してもここまできません。 ・・・・ } ・・・・ ↓発生する例外 Exception occurred during event dispatching: java.lang.NullPointerException at javax.swing.text.html.FormView.submitData(FormView.java:376) at javax.swing.text.html.FormView.actionPerformed(FormView.java:356) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) ・・・・ ポップアップメニューで選択されたのをトリガーとして なにか重い処理を行う場合(サンプルコードのdoSomethingメソッドのような)、 ポップアップメニューが表示されたまま、画面が固まったようになってしまいます。 画面が固まるのは仕方ないとして、別処理の前にポップアップメニューを 非表示にすることはできないのでしょうか。よろしくお願いします。 サンプルコードは以下です http://ideone.com/zIVRZ >>87 別スレッド立てて、そのなかで重い処理すればいいよ。 今時はスレッドを直接使うんじゃなく、swingworker使うのが普通かな。 http://uproda.2ch-library.com/484203UfN/lib484203.png Windows環境(XP/7)の文字入力で変換候補ウィンドウが入力文字に重なってしまうのを、 重ならない様に表示する方法があれば教えてください。 AWTでの表示のようになって欲しいです。 >>89 Sunの実装が手抜きで未確定文字左下のx,yしかwindowsに送ってないのが原因だから、 Java側からじゃどうしようもないと思う。 BugDatabase行くか、Swing使うの諦めるか、我慢するか。 どうしようもないですか… 分かりました、ありがとうございました。 GUIスレッドとファイル・通信を行う2つスレッドのがあります。 ファイル・通信を行うスレッドでイベントを発生させて、GUIスレッドでイベントをキャッチしたいのです。 どのようにすればイベントを発生させることができますか SwingUtilities.invokeLater あるウインドウAのメニューからそのウインドウの設定パネルBを出して、ウインドウAの位置や 大きさの現在値を表示したいのですが、設定パネルBを生成するのがウインドウAのコンストラクタ内 (Aの部品のメニューにaddActionListener()を設定して,その中でnew ActionListener(), さらにその中でactionPerformed(ActionEvent)として,その中で new B() を呼ぶ) なので,Aへの参照をBのコンストラクタに引数で渡して B(A instanceOfA) のようにしても instanceOfAには常にnullしか入っていません。(つまりAのコンストラクタが完了して完全にAを 生成した状態になる前の時点でB(A)を呼び出してしまっているのだと思います) こういうときSwingではどういうふうにするのが常套手段なんでしょうか? Aのコンストラクタ内以外でBのデータを更新して表示する方法があるのかわかりません。 お教えいただきたくお願いします。 どうみてもメニューが押されて初めてBが生成されてるようにしか読めないのだが。 Bのコンストラクタにthisを渡したらthisがnullだったわけ? >>95 そうれす。 この場合のthisはAなんだけど、Bのコンストラクタを呼び出すのがAのコンストラクタの内部だから Aがまだ生成されていないのでthisはまだnullのままなんだと思う。 JavaはそこそこやってるんだけどSwingは最近始めたばかりなので感覚がわからん。 ウインドウA への参照を aRoot として取得できるかと思って B を生成するメニュー項目 menuItemB を使い final JFrame aRoot = (JFrame) SwingUtilities.getRoot(menuItemB); みたいなのをイベント発生前に入れてみても、所詮 A のコンストラクタ内なのでaRoot==nullなんだな。 目的とする処理はありがちなので常套手段があるんだと思う。引き続きお願いします。 this 自身はたとえコンストラクタの中でも null にならないよ! きっと何か勘違いしてるよ! 本当にコンストラクタのせいだと思うならコンストラクタであれこれ初期化するのをやめればいいだけじゃない! init メソッドとか別に作ってそこで色々やればいいと思うよ! 内部クラスでのthis参照は色々と落とし穴があるので要注意。 解らなかったらとりあえず内部クラス使うのやめてみよう。 いや、thisがnullとかありえないから。 >>98 >>99 ついでに>>97 確認のために内部クラスを使わずに単純なクラスA,Bを作り、Aのコンストラクタ内部で BのコンストラクタB(A)を呼び出してみましたが,たしかにAには非null値がちゃんと渡されていました。 >>99 さんのご指摘のとおり、やはり内部クラスからのthis参照がまずいようです。 >>98 さんのご指摘のようにコンストラクタ以外のinit()メソッドのようなものを作って呼び出したいのですが どのタイミングで呼び出せば良いかがわかりません。 「パネルBを開いた」というのを、Bのコンストラクタでもなく、actionPerformed()ブロックの中でもなく 呼び出すには、Swingではどのようなからくりを使うんでしょう?初心者でサーセン。 read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる