|
View:
New views
8 Messages
—
Rating Filter:
Alert me
|
|
|
Swing Application FrameworkでSocketが作成できない。はじめまして.
情報が見つからないので、バグなのかよくわからないのですが、 Java Desktop Application(Swing Application Framework)で Socketをnewするとそのままwait状態で何も操作できなくなってしまいます。 [再現方法] New ProjectでBasic Applicationを作成したあとfileMenuにMenuItemを追加し、Labelを1つ 追加した状態にして、event処理を追加して private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { // test try { jLabel1.setText("start"); jLabel1.paintImmediately(jLabel1.getVisibleRect()); java.net.Socket socket = new java.net.Socket(適当なサーバ, 80); jLabel1.setText("OK"); jLabel1.paintImmediately(jLabel1.getVisibleRect()); } catch (Exception e) { jLabel1.setText("Exception:" + e.getMessage()); jLabel1.paintImmediately(jLabel1.getVisibleRect()); } } とするとItemを選ぶとstartと表示したまま何も操作できなってしまいます。 固まった状態でスレッドダンプをとると、 "AWT-EventQueue-0" prio=6 tid=0x02b66400 nid=0x100 runnable [0x0405f000..0x0405f a14] java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at java.net.SocksSocketImpl.readSocksReply(SocksSocketImpl.java:85) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:429) at java.net.Socket.connect(Socket.java:519) at java.net.Socket.connect(Socket.java:469) at java.net.Socket.<init>(Socket.java:366) at java.net.Socket.<init>(Socket.java:180) at test.TestView.jMenuItem1ActionPerformed(TestView.java:218) at test.TestView.access$800(TestView.java:22) at test.TestView$4.actionPerformed(TestView.java:144) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:19 95) となっています。 私の環境は以下のようになっています。 Product Version: NetBeans IDE 6.0 (Build 200711261600) Java: 1.6.0_03; Java HotSpot(TM) Client VM 1.6.0_03-b05 System: Windows XP version 5.1 running on x86; MS932; ja_JP (nb) 以上 --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
|
|
Re: Swing Application FrameworkでSocketが作成できない。こんにちは。
Swingは下記のようなActionPerformedのようなイベントを イベント処理専用のスレッドで実行します。このため、Socketを 開く等、イベント処理スレッドを止めてしまうと、Swingアプリ全体が イベントを処理できなくなります。 今回のように、Socketを使ったり、その他"重たい"処理をしたいので あれば別のスレッドにその処理を委譲する方法を選択するのが Swing流になります。 スレッドを直接扱うのは面倒なので、SwingWorkerという クラスを利用するのがいい方法だと思います。Java SE 6なら 標準で入っています。 http://java.sun.com/javase/ja/6/docs/ja/api/javax/swing/SwingWorker.html それ以前のJDKの場合は別途ダウンロードして、クラスパスに 追加して利用できます。 https://swingworker.dev.java.net/ ご参考まで。 岡崎 harada さんは書きました: > はじめまして. > > 情報が見つからないので、バグなのかよくわからないのですが、 > Java Desktop Application(Swing Application Framework)で > Socketをnewするとそのままwait状態で何も操作できなくなってしまいます。 > > > [再現方法] > New ProjectでBasic Applicationを作成したあとfileMenuにMenuItemを追加 > し、Labelを1つ > 追加した状態にして、event処理を追加して > > private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { > // test > try { > jLabel1.setText("start"); > jLabel1.paintImmediately(jLabel1.getVisibleRect()); > java.net.Socket socket = new java.net.Socket(適当なサーバ, 80); > jLabel1.setText("OK"); > jLabel1.paintImmediately(jLabel1.getVisibleRect()); > } > catch (Exception e) { > jLabel1.setText("Exception:" + e.getMessage()); > jLabel1.paintImmediately(jLabel1.getVisibleRect()); > } > } > とするとItemを選ぶとstartと表示したまま何も操作できなってしまいます。 > 固まった状態でスレッドダンプをとると、 > "AWT-EventQueue-0" prio=6 tid=0x02b66400 nid=0x100 runnable > [0x0405f000..0x0405f > a14] > java.lang.Thread.State: RUNNABLE > at java.net.SocketInputStream.socketRead0(Native Method) > at java.net.SocketInputStream.read(SocketInputStream.java:129) > at java.net.SocksSocketImpl.readSocksReply(SocksSocketImpl.java:85) > at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:429) > at java.net.Socket.connect(Socket.java:519) > at java.net.Socket.connect(Socket.java:469) > at java.net.Socket.<init>(Socket.java:366) > at java.net.Socket.<init>(Socket.java:180) > at test.TestView.jMenuItem1ActionPerformed(TestView.java:218) > at test.TestView.access$800(TestView.java:22) > at test.TestView$4.actionPerformed(TestView.java:144) > at > javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:19 > 95) > となっています。 > > 私の環境は以下のようになっています。 > > Product Version: NetBeans IDE 6.0 (Build 200711261600) > > Java: 1.6.0_03; Java HotSpot(TM) Client VM 1.6.0_03-b05 > > System: Windows XP version 5.1 running on x86; MS932; ja_JP (nb) > > > 以上 > > --------------------------------------------------------------------- > To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... > For additional commands, e-mail: nbdiscuss_ja-help@... > --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
|
|
|
|
|
Re: Swing Application FrameworkでSocketが作成できない。ども原田さん。shinsanと申します。
横からつっこみさせていただきます。 これは確かにマルチスレッドではありますが、プロパティの変更を外部スレッドから 行うことになるのでいわゆる危険なコードになります。 AWTイベント用のスレッドがありまして、その上でキューに突っ込んで実行してもらわ なくてはいけません。 SwingWorkerを使いたくないのなら javax.swing.SwingUtilities#invokeAndWaitを使うといいでしょう。これはAWTスレッド のキューに突っ込んで、それが実行完了されるまで待つという命令です。 Socket部分でとまっているということですが、同じようにイベント内でソケット接続 させてみましたがが、問題はありませんでした。 java.net.Socket socket = new java.net.Socket("www.google.co.jp", 80); これでいいのですよね? クライアントソケットですから固まることはまずないと思います。 あと、アプリケーションフレームワークを使うときはアクションイベントは @Actionを使うのが一般的だと思います。 一応@ActionとActionPerformedと両方試しましたが問題はありませんでした。 ところでDesktopApplicationFrameworkで生成されるEntityが他のプロジェクトと違い ますね。プロパティイベントを生成してくれるので非常に便利です。ですが、他の プロジェクトでこの生成方法がないのはちょっと困り者です。 これはウィザードでプロパティイベントを生成させるかどうかいれてほしいですね。 "harada" <harada.Kazuy-02@...> wrote: > 原田です > > 返事が遅くなり申し訳あありません。 > 別スレッドにして試したのですが、画面が固まることはないですが、 > 処理はstartのままで改善されません。 > ☆の行を削除するとOKとなります。 > > ちなみに現在の私のプログラムは通常のApplicationで作って > 同じ処理を行っていますが、それで問題なく動作しています。 > > private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { > // test > MyThread t = new MyThread(); > t.start(); > Thread.yield(); > } > > private class MyThread extends Thread { > private MyThread() { > > } > public void run() { > try { > jLabel1.setText("start"); > jLabel1.paintImmediately(jLabel1.getVisibleRect()); > ☆ java.net.Socket socket = new java.net.Socket(適当なURL, 80); > jLabel1.setText("OK"); > jLabel1.paintImmediately(jLabel1.getVisibleRect()); > } > catch (Exception e) { > jLabel1.setText("Exception:" + e.getMessage()); > jLabel1.paintImmediately(jLabel1.getVisibleRect()); > } > } > } > > 以上 > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... > For additional commands, e-mail: nbdiscuss_ja-help@... > > > > __________ NOD32 2735 (20071220) Information __________ > > This message was checked by NOD32 antivirus system. > http://canon-sol.jp/product/nd > --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
|
|
Re: Swing Application FrameworkでSocketが作成できない。原田です
ありがとうございます。 invokeAndWaitはあとで検討してみます。 Java Desktop Applicationのときに java.net.Socket socket = new java.net.Socket("www.google.co.jp", 80); でとまってしまうのは、私の環境だけのようですね。 Java Applicationで作成したら問題がないので、 詳しい原因をすぐに追及しようとは思わないですが、 原因がわかったらまたメールします。 (外部サーバはproxy経由になるので、上のURLだと実際は Exception:www.google.co.jp という表示になります) private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { の行は生成されたものなので、その前に@Actionなどを 入れるとは思っていませんでしたが、入れるようにしてみます。 以上 ----- Original Message ----- From: "shin" <shinsan@...> To: <nbdiscuss_ja@...> Sent: Thursday, December 20, 2007 3:08 PM Subject: Re: [nbdiscuss_ja] Swing Application FrameworkでSocketが作成できない。 > ども原田さん。shinsanと申します。 > > 横からつっこみさせていただきます。 > > > これは確かにマルチスレッドではありますが、プロパティの変更を外部スレッドから > > 行うことになるのでいわゆる危険なコードになります。 > > AWTイベント用のスレッドがありまして、その上でキューに突っ込んで実行してもらわ > なくてはいけません。 > > SwingWorkerを使いたくないのなら > javax.swing.SwingUtilities#invokeAndWaitを使うといいでしょう。これはAWTスレッド > > のキューに突っ込んで、それが実行完了されるまで待つという命令です。 > > > Socket部分でとまっているということですが、同じようにイベント内でソケット接続 > > させてみましたがが、問題はありませんでした。 > > java.net.Socket socket = new java.net.Socket("www.google.co.jp", 80); > これでいいのですよね? > クライアントソケットですから固まることはまずないと思います。 > > > あと、アプリケーションフレームワークを使うときはアクションイベントは > @Actionを使うのが一般的だと思います。 > > 一応@ActionとActionPerformedと両方試しましたが問題はありませんでした。 > > > > ところでDesktopApplicationFrameworkで生成されるEntityが他のプロジェクトと違い > ますね。プロパティイベントを生成してくれるので非常に便利です。ですが、他の > プロジェクトでこの生成方法がないのはちょっと困り者です。 > > これはウィザードでプロパティイベントを生成させるかどうかいれてほしいですね。 > > > > "harada" <harada.Kazuy-02@...> wrote: > >> 原田です >> >> 返事が遅くなり申し訳あありません。 >> 別スレッドにして試したのですが、画面が固まることはないですが、 >> 処理はstartのままで改善されません。 >> ☆の行を削除するとOKとなります。 >> >> ちなみに現在の私のプログラムは通常のApplicationで作って >> 同じ処理を行っていますが、それで問題なく動作しています。 >> >> private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent >> evt) { >> // test >> MyThread t = new MyThread(); >> t.start(); >> Thread.yield(); >> } >> >> private class MyThread extends Thread { >> private MyThread() { >> >> } >> public void run() { >> try { >> jLabel1.setText("start"); >> jLabel1.paintImmediately(jLabel1.getVisibleRect()); >> ☆ java.net.Socket socket = new java.net.Socket(適当なURL, >> 80); >> jLabel1.setText("OK"); >> jLabel1.paintImmediately(jLabel1.getVisibleRect()); >> } >> catch (Exception e) { >> jLabel1.setText("Exception:" + e.getMessage()); >> jLabel1.paintImmediately(jLabel1.getVisibleRect()); >> } >> } >> } >> >> 以上 >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... >> For additional commands, e-mail: nbdiscuss_ja-help@... >> >> >> >> __________ NOD32 2735 (20071220) Information __________ >> >> This message was checked by NOD32 antivirus system. >> http://canon-sol.jp/product/nd >> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... > For additional commands, e-mail: nbdiscuss_ja-help@... > > --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
|
|
Re: Swing Application FrameworkでSocketが作成できない。どもshinsanです。
> private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) > { > > の行は生成されたものなので、その前に@Actionなどを > 入れるとは思っていませんでしたが、入れるようにしてみます。 @Actionやその登録は自動生成されるのでいじる必要はないです。 つまり、DesktopApplicationFrameworkを使った場合はボタンを右クリックして イベントの生成をするということです。 引数も何もない通常のメソッドをクリックなどのイベントに割り付けることが出来ます。 今までのSwingの基本であったプロパティのイベントのとこは触らないというわけです。 プロパティの中のプロパティの一番上にあるActionというところが設定されます。 標準でQuitやShowAboutBoxなどがはいってるはずです。 つまり、GUIコンポーネントの細かい部分は従来どおりのイベントを扱いつつ ウインドウの流れや処理等、物事の本質部分を抜き出すという意味合いが強いと 思います。 Socketに関してはとりあえずローカルに対して接続してはいかがでしょうか? パーソナルファイアウォール等でとまっているかもしれませんし。 NetBeans付属のTomcatもインストールしてある場合、サーバータブのTomcatを 右クリックして起動してみましょう。標準でポート8084で接続できるはずです。 "harada" <harada.Kazuy-02@...> wrote: > 原田です > > ありがとうございます。 > invokeAndWaitはあとで検討してみます。 > Java Desktop Applicationのときに > > java.net.Socket socket = new java.net.Socket("www.google.co.jp", 80); > > でとまってしまうのは、私の環境だけのようですね。 > Java Applicationで作成したら問題がないので、 > 詳しい原因をすぐに追及しようとは思わないですが、 > 原因がわかったらまたメールします。 > (外部サーバはproxy経由になるので、上のURLだと実際は > Exception:www.google.co.jp > という表示になります) > > private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) > { > > の行は生成されたものなので、その前に@Actionなどを > 入れるとは思っていませんでしたが、入れるようにしてみます。 > > 以上 --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
|
|
Re: Swing Application FrameworkでSocketが作成できない。原田です
Set Actionを選ぶやり方があったんですね。 Socketの方ですが, "localhost"だとSocketを作れますが、 IPアドレスで接続しようとするとやはり同じ現象となります。 とりあえずSwingWorker使ってみましたが、現象は同じで固まります。 Windowsファイアーウォールを一時的に無効に して実行してみましたが、やはり同じでした。 -------- @Action public void test() { new MyThread().execute(); } private class MyThread extends SwingWorker<Exception, Object> { private Exception m_exception; private MyThread() { } @Override public Exception doInBackground() { return(m_exception); } @Override protected void done() { try { jLabel1.setText("start"); jLabel1.paintImmediately(jLabel1.getVisibleRect()); java.net.Socket socket = new java.net.Socket(); java.net.InetSocketAddress address = new java.net.InetSocketAddress(適当なURL, 8080); socket.connect(address, 1000); jLabel1.setText("OK"); jLabel1.paintImmediately(jLabel1.getVisibleRect()); } catch (Exception e) { jLabel1.setText("Exception:" + e.getMessage()); jLabel1.paintImmediately(jLabel1.getVisibleRect()); m_exception = e; } } } 以上 ----- Original Message ----- From: "shin" <shinsan@...> To: <nbdiscuss_ja@...> Sent: Thursday, December 20, 2007 6:14 PM Subject: Re: [nbdiscuss_ja] Swing Application FrameworkでSocketが作成できない。 > どもshinsanです。 > >> private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent >> evt) >> { >> >> の行は生成されたものなので、その前に@Actionなどを >> 入れるとは思っていませんでしたが、入れるようにしてみます。 > > @Actionやその登録は自動生成されるのでいじる必要はないです。 > つまり、DesktopApplicationFrameworkを使った場合はボタンを右クリックして > イベントの生成をするということです。 > > 引数も何もない通常のメソッドをクリックなどのイベントに割り付けることが出来ます。 > > 今までのSwingの基本であったプロパティのイベントのとこは触らないというわけです。 > プロパティの中のプロパティの一番上にあるActionというところが設定されます。 > > 標準でQuitやShowAboutBoxなどがはいってるはずです。 > > つまり、GUIコンポーネントの細かい部分は従来どおりのイベントを扱いつつ > ウインドウの流れや処理等、物事の本質部分を抜き出すという意味合いが強いと > 思います。 > > > > Socketに関してはとりあえずローカルに対して接続してはいかがでしょうか? > パーソナルファイアウォール等でとまっているかもしれませんし。 > > NetBeans付属のTomcatもインストールしてある場合、サーバータブのTomcatを > 右クリックして起動してみましょう。標準でポーート8084で接続できるはずです。 > > > "harada" <harada.Kazuy-02@...> wrote: > >> 原田です >> >> ありがとうございます。 >> invokeAndWaitはあとで検討してみます。 >> Java Desktop Applicationのときに >> >> java.net.Socket socket = new java.net.Socket("www.google.co.jp", 80); >> >> でとまってしまうのは、私の環境だけのようですね。 >> Java Applicationで作成したら問題がないので、 >> 詳しい原因をすぐに追及しようとは思わないですが、 >> 原因がわかったらまたメールします。 >> (外部サーバはproxy経由になるので、上のURLだと実際は >> Exception:www.google.co.jp >> という表示になります) >> >> private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent >> evt) >> { >> >> の行は生成されたものなので、その前に@Actionなどを >> 入れるとは思っていませんでしたが、入れるようにしてみます。 >> >> 以上 > > --------------------------------------------------------------------- > To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... > For additional commands, e-mail: nbdiscuss_ja-help@... > > --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
|
|
Re: Swing Application FrameworkでSocketが作成できない。原田です
以前Application Frameworkのアプリで Socketを作ろうとしたら動作しなくなって件ですが、 引っ越しをして建物を替わったあと、 試すと動作するようになっていました。 原因はわかりませんでしたが、LAN環境により 問題が発生していたようです。 以上 ----- Original Message ----- From: "harada" <harada.Kazuy-02@...> To: <nbdiscuss_ja@...> Sent: Thursday, December 20, 2007 7:40 PM Subject: Re: [nbdiscuss_ja] Swing Application FrameworkでSocketが作成できない。 > 原田です > > Set Actionを選ぶやり方があったんですね。 > > Socketの方ですが, "localhost"だとSocketを作れますが、 > IPアドレスで接続しようとするとやはり同じ現象となります。 > とりあえずSwingWorker使ってみましたが、現象は同じで固まります。 > > Windowsファイアーウォールを一時的に無効に > して実行してみましたが、やはり同じでした。 --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
| Free Forum Powered by Nabble | Forum Help |