1 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 01:09:54 ] プログラミング言語Javaに関する質問スレです。 JavaScript, Ajaxの質問は、ここでは受け付けていません。 Web製作管理 pc11.2ch.net/hp/ Webプログラミング pc11.2ch.net/php/ をご利用下さい。 よくある質問 ・「コマンドまたはファイル名が違います」 「'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 「Exception in thread "main" java.lang.NoClassDefFoundError: 」 www.wikiroom.com/java/?path,classpath ・String に == は使うな。equals() を使え。 ・「\12288 は不正な文字です。」 文字リテラル以外で全角スペースは使えません。半角スペースに。 ・その他の質問→「APIのjavadoc見ろ」 前スレッド 【初心者】Java質問・相談スレッド120【歓迎】 pc11.2ch.net/test/read.cgi/tech/1223603727/ 次スレは>>990 あたりで。 過去ログ、関連スレッド、よくある質問とその回答など、 質問をする前に、貴方が見なければならないサイトについての情報は、 下のwikiのページにまとめてあります。 www.wikiroom.com/java/
76 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 11:49:57 ] >>72 >コンボボックスって表示させるデータ以外のデータも保持できますか? そもそも JComboBox は任意のデータを保持できます addItem 等の引数が String じゃなく Object になってるでしょう 項目をどう表示するかを決めるのは ListCellRenderer であり、JComboBox#setRenderer で設定できます デフォルトでは単に toString した文字列を表示するだけですが、自分で好きなレンダラを書けばよいです ところでGUI関連はSwingスレの方がよいかも
77 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 11:57:17 ] それで安心しました。rmiもあるみたいですけど、 Serializable はwebアプリのようなデータの転送で使っても実用に得るのでしょうか? クライアントの設定情報をeventと交えて直列化して、相互に転送するときとかですが、 例えば検索ボタンを押して3秒ぐらいまでなら実用と考えていますが実用的でしょうか。 それとも、上のwebアプリの例えだとメソッド呼び出しじゃないんですが、rmiとかの方がよいのでしょうか。
78 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 11:59:22 ] -5.6 % 3.3 5.6 % -3.3 5.6 % 3.3 -5.6 % -3.3 の答えがそれぞれ -2.3 2.3 2.3 -2.3 なんですが、これをどなたか解説していただけないですか
79 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 12:02:02 ] >>76 ありがとうございます。 setRendererでレンダリングを設定ができるんですね。 >ところでGUI関連はSwingスレの方がよいかも そうですねスレ違いでしたね。ご迷惑をおかけしました。
80 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 12:14:44 ] >>78 Java言語仕様書に書いてある通りです つまり、そういう仕様です java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.17.3 > the result of the remainder operation can be negative only if the dividend is negative (訳) 被除数が負の場合に限り結果が負になります
81 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 12:19:13 ] >>77 RMI も中では Serializable 使ってるから同じじゃない?
82 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 12:28:09 ] >>80 どうもです
83 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 13:27:28 ] [aaaa]ssssssという文字列から aaaaを取り出したいんですがsubStringを使おうにも、[aaaa]の長さは変動しますので subStringが使えません。なにかいい方法は無いでしょうか?
84 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 13:34:07 ] >>83 String s = "[aaaa]ssssss"; int start = s.indexOf('[') + 1; int end = s.indexOf(']'); String r = s.substring(start, end); System.out.println(r);
85 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 14:18:12 ] >>84 たすかりました
86 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 14:37:05 ] >>83 この機に、java.util.regex 辺りをマスターするんだ
87 名前:デフォルトの名無しさん [2008/11/20(木) 14:43:44 ] swingスレッドがないのでここでお聞きしますが、 guiでのpaintやrepaintはシングルスレッド設計が多いのですがこれはどうしてなのでしょうか? プロパティに反応してrepaintするときなど、シングルスレッドのままだと順番まちのためpaintがされずに、 ボタンが押されっぱなしのような固まったような状態が0.5秒ぐらいなってしまいこっとの方が大問題だと思います。 似たような現象は今でもfireforxとかでたまにあります。 それでもguiをマルチスレッドにしないのはなにかほかにデメリットがあるのでしょうか。
88 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 15:30:41 ] >>87 java.sun.com/products/jfc/tsc/articles/threads/threads1.html の最後あたりに書いてある
89 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 15:59:34 ] 個人的には、あらゆるイベント処理を漏らさず synchronized でガードしなければならないことを考えると、今のままでいい
90 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 16:59:54 ] >こっちの方が大問題 何と比べて大問題なんだよ。 例えばデッドロックよりも大問題なのか?
91 名前:デフォルトの名無しさん [2008/11/20(木) 17:21:56 ] そのリンクですけど、guiプログラマーにはthreadの深い理解は不要だとかオーバーヘッドどうとかですけど、 プログラム処理でこれといったデメリットではないと思いますがこの程度が原因でマルチスレッドを捨ててるんですか? これからguiやデスクトップアプリは2dやnetなどの通信などどんどん大規模になっていって、ほとんどの処理にスレッドの同期・非同期処理が必要になるとおもうのですが、 それでもシングルスレッドなのは何か他に理由があるのでしょうか? jdkがいくら進化してもシングルスレッドのままだと昔のシングルタスクOSの限界と同じかとおもいます。 デッドロックとかcuiでもあるわけでなくなるわけではないし、guiとなにか関係あるんですか。 仮に全てのメソッドをsynchronizedにしても今のCPUなら全く遅くならないんですけど、それよりも先のようにシングルスレッドの処理待ちのほうが大問題だと思いませんか?
92 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 17:36:40 ] synchronized万能主義者か synchronizedで囲うだけでマルチスレッド化による問題が解決すると思っているようなら勉強し直すことだ フレームワークがシングルスレッドであることによるシンプルさを捨てさせてまで マルチスレッドヘルに飛び込まないといけないほど反応時間を気にしないといけないのなら 自分が作ろうとしているものの設計の方をこそ見直すべきだ
93 名前:デフォルトの名無しさん [2008/11/20(木) 17:40:27 ] DOMに関する質問です。 あるDTDにvalidなXML文書からDOM木を作成するとします。 普通にXML文書をparseすると文章中の改行やタブもTEXTノード としてDOM木の中に表現されますよね(規格通り)。 こういった改行等のTEXTノードは削除して、DTD中に定義された CDATAやPCDATAに対応するTEXTノードのみを残す、小粋な お掃除方法は無いでしょうか?
94 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 17:41:46 ] GUIってユーザープログラムからだけでなく、OSからの処理も受け付けないといけないんだから、 つーかOSの一部の機能を借りている状態で実行してるんだから、 イベントディスパッチがシングルスレッドってのは納得しやすいと思うんだけど。 別にマルチで自前で書いてもスレッドセーフかどうかさえ気をつければ良いんじゃないの?
95 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 17:44:07 ] >>91 通信のような処理はGUIと無関係なんだから単純にGUIと別のスレッドでやればよかろう そのことでGUIをマルチスレッドにする必要はないと思うが 仮にこれからそれらが必要になるとしても、swingが作られたのは10年も前なわけだが、 10年後の未来を予測して設計しておくべきだったと? 設計当時の理由はそのリンク先の通りで、 残念ながら(?) 今後来るかもしれないメニーコア時代のことまで考慮されて作られてはいなかった synchronizedで遅くなることよりも、synchronizedし忘れてバグったり、デッドロック起きたりする方が俺は怖い それに単純にすべてsynchronizedするんならシングルスレッドと同じじゃまいか synchronizedかける場所を慎重に取捨選択するのはなかなか面倒な作業だと思うが
96 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 17:53:15 ] 最近設計されたGUIでマルチスレッドなものってなにがあるっけ?SubArctic ? 日本語情報が少なすぎて全く使ってないからよくわからん。
97 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 18:51:20 ] JTableってデータを更新する際初期化とか必要ですか? [1111] [2222] [3333] [4444] こんな感じでデータが入ってて そこからsetModelでデータを上書きしたら [5555] [] [7777] [] 見たいな感じになります。
98 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 19:10:44 ] >>97 試してみたけど大丈夫だったよ (import省略) public class Test{ public static void main(String[] args){ final Object[] columns = { "x" }; final Object[][] dataA = {{ "1111" }, { "2222" }, { "3333" }, { "4444" }}; final Object[][] dataB = {{ "5555" }, { "6666" }, { "7777" }, { "8888" }}; final JTable table = new JTable(dataA, columns); JButton button = new JButton("update"); button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ table.setModel(new DefaultTableModel(dataB, columns)); }}); final JFrame frame = new JFrame(); frame.add(table); frame.add(button, BorderLayout.PAGE_END); SwingUtilities.invokeLater(new Runnable(){ public void run(){ frame.pack(); frame.setVisible(true); }}); }}
99 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 19:11:48 ] GUIツールキットの多くがシングルスレッドなのは、伝統だと思います。 非同期にやってくるイベントをキューにためて、後はイベントループを 回して順繰りに処理していく方法は一つの成功した設計モデルとして とても長い伝統と実績があります。 ソースが公開されているGUIツールキットを幾つかバらしてみれば、 多くの場合はイベントループ等の根っこの設計がどれもよく似通って いる事が分かるかと思います。 また他の部品の振る舞いをあまり意識せずに個々の部品にイベント ハンドラを書いてイベントを投げるだけでGUIの振る舞いが定義出来 るのも、イベントがシーケンシャルに処理される事を仮定出来る点が 大きいと思います。 そういう意味では、ツールキットを利用するプログラマに「楽をさせる」 良い設計ともいえます。 時代遅れとの見方もありますが、むしろこれに代わるリーズナブルな 設計モデルがまだ無いという辺りではないかと思います。
100 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 19:36:48 ] >>98 すいません・・・別の箇所で問題が原因でした。 ご迷惑をおかけしました。
101 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 19:55:17 ] >>99 イベントがどのタイミングで処理されるのかを マルチスレッドだと制御できるとは思えないからなぁ。 シングルスレッドだからこそ、予測しやすいわけで。 まぁ、予測ができるだけで、確実にシーケンシャルに実行されるかどうかはわからんのだけど。
102 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 19:56:55 ] どう考えてもシンプルでコストが安いしな。 今のマシンなら楽勝って考えるてるなら、 自分で作ったらいい。環境はあるんだから。
103 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 20:19:49 ] UIがマルチスレッドなら、特別な仕掛けがない限り UIコンポーネントから取得するデータは、取ってきた時点で 既に古いものになっていると考えなければならない。 こんなもので何を決められようか?
104 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:50:54 ] 複数のインターフェースを使ってボタンをクリックすることで 画面の切り替えをしたいのですが、この場合CardLayoutを使うと思うんですが 本を読んでもイマイチ分からないので、使い方を教えていただけませんか? それともCardLayout以外にも画面の切り替えを行う方法はありますか? よろしくお願いします
105 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:57:06 ] JTabbedPaneはどう?
106 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:29:15 ] >>105 教えていただきありがとうございます タブを使うやり方もいいんですが、 できれば、ボタンをクリックしてカードを 切り替える感じのものがいいのですが ありませんでしょうか?
107 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:29:35 ] private static final String TEISUU = "定数"; と定義された定数に対して インスタンスメソッドの中から、クラス名を付けずにTEISUUにアクセスしてもエラーになりません。 これは何故でしょうか? 具体的には、 class Test{ private final static String TEISUU = "定数"; public void method(){ String var; var = TEISUU; System.out.println(var); } と書けてしまいます。 文法的には var = Test.TEISUU; とすべきではないのですか? private final String TEISUU = "定数"; としても解決すると思うのですが、 自分が勉強した限りではどの本見ても定数にはstaticを付けてるんですよね。 定数にはstaticを付けるというのがお決まりなのでしょうか?
108 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:45:57 ] Javaでどの様にハッキングするの? どの位の所まで分かる様になったらハッキング系の事出来るの? JavaでLAN周りを調べる事何て出来るの? どの様にJavaにネットと通信出来るように書くのか気になる。
109 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:52:45 ] >>107 TestクラスのTEISUUの値は,インスタンスの状態にかかわらず常に"定数"になるんでしょ? それならstaticにするのが自然。メソッドの場合も同様の考え方をする。 Test.を省略できるのは同じクラス内だから。そういうルールだから仕方ない。
110 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:53:14 ] >>107 書けてしまうのは文法的に誤っていないから。 文法的に誤っているということだがJLSのどこに書かれているの? static finalが付いているものは変更不可のクラス変数。 インスタンスごとの変更不可変数であればstaticは不要。
111 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:39:55 ] >>109 >>110 ありがとうございます! 自分のクラスのstaticフィールドにアクセスする場合は クラス名省略できるんですね。知りませんでした。 よく考えてみたらインスタンスごとの定数ってあまり考えられないですね。。 単純に例が少なかったのかな。
112 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:43:04 ] >>73 レスサンクス。 同じブラウザで一度フォームデータをsubmit、ブラウザの戻る、またsubmit っていう操作を何回もしていると、不定期でおきているから、 cookieが未設定とか、ブラウザで無効にしているってのはなさそうなんだよね。 CookieはsetMaxAge(-1)でブラウザが閉じられるまでは消えないから、有効期限ってのも 関係なさそうだし・・・。 Hoge test = new Hoge(HttpServletRequest); って感じで、Hogeクラスのprivateメンバに保持しておいて、 Hogeクラスのメソッド内で使おうとすると、時々nullになるんよ。 よくわからなかったから、メンバに持たせるのはrequestそのものじゃなくて、 コンストラクタ内でgetHeader("cookie")やってStringメンバに入れておくことにしますた。
113 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:43:40 ] 定数をインスタンス毎に持っても意味ないからstaticにするぐらいにしか考えてないぜ
114 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:46:52 ] Javaが趣味って奴いるの? 個人レベルで何する気なんだ?Javaで
115 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:17:07 ] >>112 待て、おまえはServletにおけるオブジェクトのライフサイクルをちゃんと理解してるのか??? そのHoge testはどこに定義されている?
116 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:43:27 ] >>115 Hoge testはHttpServletのdoPost内でインスタンス化されて、 threadとして動いてます
117 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:10:01 ] スレッドってよくわかんねーーー スレッドセーフなクラスって何だよ… 横槍ごめんなさい。
118 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:19:43 ] >>116 よくわからん。該当部分のコードを見せろ。Hoge testの定義位置も含めて。 HttpServletRequest/HttpServletResponseの生存期間はHTTPのリクエストを受け付けてからレスポンスを返すまでってことは理解してるよな?
119 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:51:32 ] >>114 Javaが趣味でもおかしくはないと思うが それより、趣味の何らかの計算とか集計とかに使うと非常に便利>Java
120 名前:デフォルトの名無しさん [2008/11/21(金) 01:52:00 ] 引数の戻り値について、質問です。 class Cara{ int num; double gas; int setNum(int n){ num = n; System.out.println("車のナンバーを" + num + "にしました"); return n; } double setGas(double g){ gas = g; System.out.println("車のナンバーを" + num + "にガソリンの量を" + gas + "にしました"); return g; } void show(){ System.out.println("車のナンバーは" + num + "です"); System.out.println("ガソリンの量は" + gas + "です"); } }
121 名前:デフォルトの名無しさん [2008/11/21(金) 01:57:03 ] class Sample_return{ public static void main(String args[]){ Cara car1 = new Cara(); car1.show(); car1.setNum(1234); car1.setGas(20.5); //戻り値 int nums = //←戻り値を代入したい double gass = //←戻り値を代入したい System.out.println("サンプルから車を調べたところ"); System.out.println("ナンバーは" + nums + "ガソリンの量は" + gass + "でした"); } } これらの、ソースで "int setNum(int n){" や"double setGas(double g){"のメソッドように 引数の受け取りメソッドに戻り値を付けて、返す事はできないのでしょうか? 要するに、引数の受け取り処理とreturnの処理を、同時に・・・ 因みに、そうした場合、どうすればいいかわかりません "//戻り値 int nums = //←戻り値を代入したい double gass = //←戻り値を代入したい " ご教授、お願い致します。
122 名前:120-121 [2008/11/21(金) 02:04:00 ] やはり、このように class Cara{ int num; double gas; void setNumGas1(int n, double g){ num = n; gas = g; System.out.println("車のナンバーを" + num + "にガソリンの量を" + gas + "にしました"); } int getNum1(){ //int型の値を返すメソッドです System.out.println("ナンバーを調べました"); return num; //呼び出し元に値を返します } double getGas1(){ //double型の値を返すメソッドです System.out.println("ガソリンの量を調べました"); return gas; //呼び出し元に値を返します } void show1(){ System.out.println("車のナンバーは" + num + "です"); System.out.println("ガソリンの量は" + gas + "です"); } }
123 名前:120-121 [2008/11/21(金) 02:07:29 ] class Sample_return{ public static void main(String args[]){ Cara car1 = new Cara(); car1.setNumGas1(1234, 20.5); int number1 = car1.getNum1(); //戻り値を持つメソッドを呼び出します、戻り値を変数numberに代入します double gasoline1 = car1.getGas1(); //戻り値を持つメソッドを呼び出します、戻り値を変数gasolineに代入します System.out.println("サンプルから車を調べたところ"); System.out.println("ナンバーは" + number1 + "ガソリンの量は" + gasoline1 + "でした"); } } 受け取り処理のメソッド"void setNumGas1(int n, double g){" 戻り値の処理メソッドは、"int getNum1(){" "double getGas1(){" のように分けないと、ダメなのでしょうか?
124 名前:デフォルトの名無しさん [2008/11/21(金) 04:02:00 ] 万能主義はあなたの方でしょw 実際は、シングルスレッドすることは全てのメソッドをsynchronizedにするのとほとんど変わりませんよ。 それにsynchronizedは同期のことでしょ?あなたはスレッドを分かってないようですね。 勘違いしているようですけど別にswingのスレッドとかの設計に文句があるんじゃなくて、 どうしてシングルスレッドにこだわるのかって事です。もともとswingはコンポーネントなのであってguiが前提なわけで、マルチスレッドで設計するものかと思います。 swingはピュアjavaというよりも全てpaintで済ますって理念なんで分からなくもないんですけど・・・
125 名前:デフォルトの名無しさん [2008/11/21(金) 04:11:01 ] >>95 通信の処理とかがGUIと関係あるかではなくて、処理の結果をGUI(のコンポネント)が受け取ります。 それで、計算や処理など既にハード上の能力は十分ですぐ結果が出ても、肝心の表示の方がイベントまちとか シングルスレッドで0.5...1秒待たされるようじゃそのコンポネント(swing)を使うにはストレスがあります。 たまに複雑なJTableでもあるでしょ、少しもたつくことが。 swing workerにもありますが、計算結果や通信結果の受信はguiと関係なので次のswing frameworkでは切り離したわけで、 だから描画とは関係ないeventやproperty fireとかもシングルスレッドにしてるのはどうしてなのかということです。 将来が予測できるかどうかじゃなくて、マルチスレッドにしてviewを独立させないことは自分自身で未来を潰しているようにみえませんか。
126 名前:デフォルトの名無しさん [2008/11/21(金) 04:33:04 ] >>99 伝統的に、イベント処理がシングルスレッド(シーケンシャル処理)だからですか。 なんかcui(今ではwebアプリとかサーブレットとか)ではThreadを導入していても、 gui(swingツールキット? invokeLaterなど)の設計の発想は昔のcのシーケンシャル処理・構造処理のままでOO指向じゃなかったんですね。 guiの(コンポネントじゃなくて)次のツールキット設計は、その古いシーケンシャル処理からの分離してコンポネント間の独立で 正しくOO指向のツールキットでしょう。最近guiやMVCなどの概念を使って、自作のコンポネント開発してみてるんですけど、 awtパッケージやawt.Toolkitはマルチスレッド設計ですよね?それで開発しているとよく気になって、swingは描画と 関係ない処理・イベント受付が絡み合ってるみたいなんでその辺りをすっきし指せれば別に遅くもないし、 透明かも擬似的に出来るし、逆に洗練され使いやすいんですけど。 SUNがswingに関心をもたなくなって次に向いている理由もなんとなく分かります。
127 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 08:44:26 ] >>126 お前は、Sunが何故GUIのマルチスレッド化を諦めたのかをちゃんとしらべたほうがいい。 AWTは失敗だった、マルチスレッドでGUIを「正しく」実装するのは現実的には不可能だ、と言ってるんだから。
128 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 09:23:05 ] AWTはマルチスレッド対応じゃねーし、 マルチスレッド対応だから失敗したわけじゃないでしょ。
129 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 10:59:18 ] こんなGUIのフォームを作りたいんですが、 その中でいくつか質問があります。 テーブルA ボタン テーブルB ID Name ID Name [1 ][A ] [1 ][E ] [2 ][B ] (追加) [2 ][F ] [3 ][C ] (削除) [3 ][G ] [4 ][D ] [4 ][H ] 1.テーブルID項目は非表示にさせたいけどできますか? 2.テーブルAセルを選択した状態で追加ボタンをおしてテーブルBに追加したいんですが、 選択したセルの情報を取得する方法はありますか? 以上です。よろしくお願い致します。
130 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 11:16:02 ] >>129 できますか、ありますかといわれたら、できますありますと答えるしかないw
131 名前:デフォルトの名無しさん [2008/11/21(金) 11:19:12 ] >>130 やり方を教えてほしいです。
132 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 11:23:06 ] あげてすいませn
133 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 11:27:23 ] Java低速GUI Swing 8 pc11.2ch.net/test/read.cgi/tech/1227234261/
134 名前:31 [2008/11/21(金) 11:35:33 ] エクリプスにアプレットプラグイン追加してやってみたのですが >>32 と同じエラーがでます。 どうやら画像が読み込めてないようなのですがどうしたらいいのでしょうか?
135 名前:デフォルトの名無しさん [2008/11/21(金) 11:44:25 ] >>127 SUNはどうしてGUIのマルチスレッド化を諦めたんですか? GUIとマルチスレッドはあまり関係ないんで当然だと思うんですが、何を正しく実装するんでしょうか?
136 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 11:51:34 ] 起きたばっかりで書き込んで所々重大な誤字がありますね。 少し誤解があるみたいなんで直しておきましたw 計算結果や通信結果の受信はguiと関係ないので、次のswing frameworkでは切り離したわけで、 古いシーケンシャル処理からの分離してコンポネント間の独立で、まさしくOO指向のツールキットでしょう。
137 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 12:01:27 ] それでJavaFXの方はJavaとは独立してリッチ何とかと宣伝してるんでけど、結局は新しいツールキットなんですか? それともswingみたいなコンポネント(デベロパ)の延長なんでしょうか? nativeピアで透明化が可能なawt.Windowが(ネイティブ依存でも)取得できれば、 awtとjava2d,3dでなんとでも出来る感じがしますけど。ただswingがなくなる事はないでしょうけど、 java seはOS依存と思われるシステムトレイもサポートしたので、そのうちそんなwindowの取得も出来るんでしょうか。
138 名前:31 [2008/11/21(金) 12:08:34 ] 読み込み方法を変えたら無事に動きました。
139 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 13:02:16 ] >>126 webアプリがマルチスレッドになってるのはwebアプリにはクライアントが複数あるから。 基本的には 1クライアントに対して、一度に 1スレッドしか動かないようにするわけで。
140 名前:デフォルトの名無しさん [2008/11/21(金) 13:25:22 ] それと同じような構造でgui toolkit frameworkを作ればいいんじゃないですか? 今のハードならスレッドにしたところでたとえすべて同期にしたとしても全く問題ないわけで。 webやデータベース問い合わせはすぐ処理が終わりますが、paintは少し計算が必要なだけでそんなのは今のハードなら屁でもないでしょw 今の時代のguiコンポネントは、テキストフィールドとか情報表示程度なので多少もたつく程度であまり気にならいのでしょう。 プロパティ更新などのイベントとpaintは全く関係ないのでこの辺りを切り離なせばswingはかなり有用なコンポネントになるんじゃないでしょうか。 問題もわかったことなので作るのはそんなに難しくはないのですが、どっちにしてもこんな根底部分の機構は私一人ではどうにもならないものなので、誰かjava.net辺りのプロジェクトで提案してリードしてくださいなw
141 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 13:32:07 ] 不満があって知識があって明確な目標があるのに何で自分で実装して提示してみないんだろう。 最初から実用に供することのできるGUIフレームワークなんか期待していないけれど、 スレッドセーフな小規模実装を出して技術的実現性とその有用性を示して見せれば否定的意見は減ると思う。 俺としてはGUIのスレッドセーフ化をsunが諦めたのは分からんでもない。
142 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 13:33:58 ] 言いだしっぺがやるべき
143 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 13:38:11 ] >>140 それを自分自身で提案すればいいじゃないか 文句を垂れてみせるだけでもいろいろ意見が出てくるはずだぜ だれも>>140 自身にコード書いてみせろとは言わんよ
144 名前:31 [2008/11/21(金) 13:40:14 ] プログラムは>>31 と同じです。 画像を変更したら、うまく赤い枠で囲むことができなくなりました。 もっと精度よく検出するにはどうしたらいいでしょうか? 実行した画像 www2.uploda.org/uporg1799104.jpg
145 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 14:08:09 ] Executors.newSingleThreadExecutor();で処理すれば マルチスレッドの勉強しなくてもよくない?って思ったんですけど 考えが甘いですか?
146 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 14:21:16 ] 勉強しないで取捨できるって天才だな
147 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 14:21:38 ] 例えば メッセージ: 「実行時にフォーマットを行いますか?」 ラジオボタン: 「はい(デフォルト)」「いいえ」 ボタン: 「実行」 なんてダイアログがあって、次のイベントが入ってくるとします。 (1)「ラジオボタン[いいえ]をクリック」 (2)「[実行]をクリック」 この場合、入力イベントがシーケンシャルに処理されるのであれば (2)のイベントを処理する段階では(1)が既に処理されている事を概ね 仮定出来ます。ラジオボタンの現在状況を気にせず、選択状態を示す 内部変数を参照して処理を開始できます。 ところが、このラジオボタンはとても重要なので"シャッキーン"とか 派手なビジュアルエフェクトの後に内部変数を[いいえ]側に倒す実装の 場合はどうでしょう。 となると[実行]ボタンの側では処理を開始する前に、ラジオボタン等々の 処理内用に関連する全てのGUI部品向けのイベントが全て処理済みで あるか確認する必要があります。 もし個別のGUI部品が非同期にイベントを受領して処理する事が可能 なのであれば、プログラマは常に部品間の依存関係に注意して適切に ロックなどを設計する必要があります。これが結構大変。 あるいは、高度なユーザーであれば、ダイアログボックスの生成に要 する0.5秒より短い時間でいいえ「付近」と実行「付近」をカンでクリック してくるかも知れません。 ラジオボタンの生成やpaintが完了する前に[実行]ボタンがイベントを 受領してしまうと、どうでしょう。
148 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 14:22:41 ] いずれにしても上記の(1)->(2)というイベント「順」で表現された 「フォーマットはしないで、実行」という「文脈」を正しくとり 扱う必要があります。GUIの側は非同期処理で実装されていてもOK ですが、その処理内容は常に上記のイベントの入力順番を意識する 必要があります。 まとめると、ユーザー操作のイベントは個々が単発で存在している のではなく、「[いいえ]をクリック」「[実行]をクリック」とその イベント列で表現された文脈の中に存在しています。 さらにGUIを持つアプリケーションは、多くの場合内部状態をもって いるステートフルなアプリケーションです。 ステートフルなアプリケーションは非同期に入力されるイベントを 適切に取り扱うためにキューやロックを慎重に設計する必要がある、 これはGUIのみならずアクセンスカウンターからAmazonに至る 全てのウェブアプリケーションについても同じ事です。 ただGUIは内部状態の更新を引き起こすイベントの粒度がウェブに 比べより細かく、数も多いです。 また前述のようにイベント列は文脈をもっています。 この問題に対してイベント列をキューにためて順繰りに処理を行う 方法がプログラマが管理しやすい「現実的な」解として長らく支持 されてきたのだと思います。 もし現在の実装よりマルチスレッドなGUIツールキットの開発を目指 しているのであれば、個人的には入力イベントの文脈依存性をどの ように取りさばくのか、その実装アイデアに興味があります。
149 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 14:57:13 ] >>147 一つのアイデアとして、そういうことはやらない、ってのはどうかな?
150 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 15:27:18 ] >>147 1.フェイルセーフの観点からは、「フォーマットしない」をデフォルトにすべき 2.内部変数のセットは、「シャッキーン」の前に実行すべき
151 名前:デフォルトの名無しさん [2008/11/21(金) 16:23:06 ] >>150 いや・・・全くそのとおりなのですが・・・ 要はイベントの入力順を気にせず処理できるものからパクパク 処理していくと時に致命的な結果を招きかねませんよ、という事を 説明するために無理矢理作った例です。寝ないで考えたのに〜。
152 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 16:29:09 ] マルチスレッドGUI君は、自分の答えやすいレスへしか返事してないな。 なんというチキン。
153 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 16:49:31 ] >俺としてはGUIのスレッドセーフ化をsunが諦めたのは分からんでもない。 デッドロックとかも心配しるようですが、スレッドセーフは同期の問題なので、guiのpaintとは全く関係ありませんよ。 これでもまだ分からないなら、たぶんスレッドの本質部分があまり分かってないんじゃないでしょうか。 少なくともguiやpaintを上手く設計したところで、デッドロックがなくなるわけではないでしょw せっかくOO指向をサポートしている言語なのに、paintを従来型のツールキットにあるイベント処理(ロジック)か何か勘違いしてるんでしょうね。
154 名前:デフォルトの名無しさん [2008/11/21(金) 16:57:41 ] >>147 たぶんそれは、jsr提案で次のswing frameworkにあるSwignWorkerで分離してると思うんですけど。 イベント処理つまりイベントのデータの取得、計算、結果の過程と、描画paintを区別・分離した実装 のことを書いてあるんですがお分かりになりませんでしたか? 実装にもよると思いますが、OO指向的には、計算とその表示は別に連動している必要はありませんよ。 どうしても連動させたいならsynchronizedでしょうかね。といってもスレッドのことわかってないみたいなんで、 そういう方はリンク先にもありましたけど、you do not have to understand the thread or sync deeply.とかなんですかねw
155 名前:デフォルトの名無しさん [2008/11/21(金) 17:11:25 ] >>148 あなたに技能があり、そのようなツールを開発してたりオープンソースに多少でも関係してるなら答えてもいいんですけどね。 というよりも、もし個人そういうことをやってたり考えてるなら、オープンソースのグループに参加してみると今までのあなたの狭い見識が一気に変わりますよw 私が見たところ、従来型のシーケンシャル処理とイベントキューから抜け出せず、さらに計算結果とその表示を連動させようと四苦八苦しています。 まさに、cuiやcの時代の思考方法でしょうかw >さらにGUIを持つアプリケーションは、多くの場合内部状態をもって いるステートフルなアプリケーションです。 例えばこの一文でも、OO的な極端なところでは、その内部フィールドを全てクラスにして同期にすればなんとでもなりますよw イベントキューの順次処理はそれが一番単純で確実で実装も容易なので問題ないのですが、 この順次処理とguiのpaintは連動している必要はないので、そういった発想の転換が求められてるんじゃないですか? アイディアとかも、別に私より上の方々が既に実験実装してるんで、そっちに参加した方が面白いですよw java 2d程度の数学知識があれば、flushのライブラリとかも普通に作れるし、そんなに難しくないんですけど、 とにかくイベントキューでpaintがもたつくのは数学では解決できずawtやswingなどツールキットの問題です。
156 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 17:39:39 ] swingの設計について不満があるのはわかったが、 ここで何を言っても開発者に届くわけじゃないし意味ないと思うよ
157 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 17:48:28 ] swingの開発者にこんな訳分からんのが届いちゃってもマズいと思うが。 時間の無駄だしストレス増加するだろうし。 swing開発者がハゲちゃったらどーすんだよ。
158 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 18:04:23 ] >>155 う〜ん、なので私自身は最初に「伝統です」と答えたのです。 正直あなたがどの程度の知識を持ち合わせているのか分からなかった ので、「どうしてそのような伝統なのか」という事情を具体例を挙げて 説明しようと試みました。 どうやら完全にスキルを読み違えた返答になってしまったようで申し訳 ありません。 確かに私はGUI方面からは暫く離れた古い人間で、しかも当時の専門 はどちらかというとVRとかいったやや特殊な表示方面でした。 ちょっと昔の事例ですが、CaveLib辺りを弄くっていました。 で、同期には大変苦労しました。 確かに仰る通り計算と表示は必ずしも同期する必要はありません。 (特にVRでは「しない」前提でないと設計できない事が多いです) 問題は、ユーザの操作シーケンスと計算(というかアプリケーションが 実現する処理一般)の内容は一致させる必要がある、という点です。 で、これを実現するためには描画は別CPUに丸投げ、とは案外いか ないなというのが実感でした。 少なくとも再描画周りであればLayoutまではきっちり首に縄を付けて おかないと、「座標xyzをクリック」というイベントを「部品Aをクリック」 といった論理イベントに解釈するところで大いにハマります。 でも分散しないとフレームレートが上がらない、ので苦労しました。 なので、仮に最近のOOを用いたアプローチでより洗練された設計 モデルが実現されているのであれば大変興味があります。 (興味、ですよ。今はこの分野からは離れているので。) もしある程度確立したモデルがあれば教えていただけると幸いです。 あるいは参考になる実装なりプロジェクトがあれば幾つか挙げて もらえないでしょうか?
159 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 18:05:52 ] なんで2chでやるかな
160 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 18:13:46 ] やっぱSwingよりSWTだよね! ・・・SWTに詳しいサイト教えてください><
161 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 18:14:28 ] 「Java並行処理プログラミング」に、その辺の事情が説明されている イベントドリブンモデルでは、リソースに適切な順序でロックをかけるのが非常に難しい Swingも当初はマルチスレッドを狙ったらしいが、 途中で無茶だと分かりシングルスレッドに変更とのこと 「マルチスレッドのGUIフレームワークは、非常に慎重に設計すれば無理ではないだろうが、 マルチスレッドの専門家しか扱えない代物になるだろう(大意)」とは、Sunの偉い人の弁
162 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 19:33:38 ] >>161 どこで読んだか思い出せず、よーやく発掘したと思ったら先を越されたorz まー、これだけでは何なので、p.214より一部抜粋。 > マルチスレッドのGUIフレームワークを作る試みは過去にいろいろありま > したが、どうしても競り合い状態やデッドロックの問題に付きまとわれる > ので、結局全員があきらめてシングルスレッドのイベントキューを使う > 方式に落ちつきました。《略》(AWTは最%8
163 名前:162 mailto:sage [2008/11/21(金) 19:37:11 ] 途中で切れたorz 以下続き。 >《略》(AWTは最初、相当本格的なマルチスレッド > アクセスをトライしましたが、その失敗の経験に基づいてSwingはシングル > スレッド方式になりました。) 何故うまくいかなかったかについては、上記以降のパラグラフに書いてある が、ここに引用するには量が多いので、詳しくは該当書籍をあたってくれ。 まぁ、上記の問題については、>>140 が画期的な案を持っているようだから、 ここで開陳すると乗ってくるやつがいるかもしれんぞ。過去のGUI専門家が 皆諦めたくらいだし。
164 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 20:09:19 ] おまいら、 >実際は、シングルスレッドすることは全てのメソッドをsynchronizedにするのとほとんど変わりませんよ。 こう書いてある時点で、釣りであることに気づけ。
165 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 21:05:38 ] マルチスレッドなGUIのメリットってなんだろ?? シングルスレッドなデメリットってほとんど回避できそうなんだけど。
166 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 21:32:02 ] 結局そこに尽きる 苦労しても実入りが少ないから誰もやらない
167 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 22:52:17 ] >>135 素人考えだが、マルチスレッドにしたらそれぞれがフリーダムに動いて フリーダムなの動きがお互いに悪影響で、 それを回避するためにあれこれしてたらあはーんなんじゃないだろうか
168 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 22:56:38 ] どうでもいいことで盛り上がってるな!
169 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 23:38:36 ] マルチスレッドはマルチコアと関係ありますね?
170 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 00:27:36 ] >>118 今手元に無いのでちょっと出せませんが >生存時間 これを理解してなかった・・・。 Hoge testが動き始めたときには、すでに呼び出し元の Servletはレスポンスを返し終わってるから、だめってことか。 ありがと
171 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 02:34:23 ] オブジェクトの再利用ってのは test a = new test() test b = new test() っていう風に同じオブジェクトをインスタンスしたということですか?
172 名前:デフォルトの名無しさん [2008/11/22(土) 02:37:47 ] スレッドだいぶ勉強したんで、なんかソースみたいんだけど あんまりネット上にないね。マルチスレッドを実務でつかうことも ほとんど俺の場合ないから、無駄というか、不満なんだ。 スレッドを使った面白いアプリを組んでみたいなあ。だれかソースくれ。
173 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 02:39:31 ] >>171 毎回newし直さずに一度newしたインスタンスをずっと取っておいて何度も使いまわすことを指すんだと思いますが
174 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 03:16:32 ] >>172 つWebサーバ ……に限らず、Javaで書かれたサーバ系のソフトはふつーマルチスレッドと思われ。
175 名前:デフォルトの名無しさん [2008/11/22(土) 04:53:56 ] >>158 VRというと1995年頃のあれでしょうか。 たぶんどんなに有用なりソースを紹介したところで、あなたの脳みそが順次処理(フローチャートw)に染まってるようなのでいくらUMLやOOを勉強しても無駄だと思います。 今でもまだ理解が足りませんが、私もOOの発想に切り替えるのに苦労したんでw 今教えて差し上げられる事は、先も書きましたがVRっぽくいえば、「大量の頂点座標の計算結果は、とくに描画せずに破棄してもよい」ということでしょうか。 ただ、同期しないといけないところは当然そのオブジェクトが有機体として一つになっているので、 例えば、首は右を向いた(イベント)なのに、胴体だけはpaintが追いつかず、表示しても首が180度回っちゃっているオーメンの呪われた少女wみたくなってるわけです。 これは、上のswingのように、胴体だけは座標計算は終わっているがイベントキューのためにpaint命令がつまっていてpaintが追いてないわけです。 ただこれも解決法がいくつもあるんで、こういうのは(数学上・手続き上で解決できる程度の)アルゴリズムとかですかねw 従来と同じ問題がありますが、100人でやる2人3足のように、そういう足が遅いものは他のオブジェクトからすると迷惑だと思いませんませんか?
176 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 05:25:20 ] >問題は、ユーザの操作シーケンスと計算(というかアプリケーションが 実現する処理一般)の内容は一致させる必要がある、という点です。 3Dとか複雑なアプリを作るぐらいになっているなら、プログラムをその場しのぎの独学でやるんじゃなくて、 ちゃんと数学知識の裏づけを持って作ってみたらどうでしょうか。 たぶんこの一文から見てもあなたは小技をいっぱい知ってるが・・・って程度なのが分かります。 例えば、1秒で60フレームとかにこだわらず、10フレームでいいんじゃないでしょうか。それが今のソフト上の限界なのかもしれませんが、あなたの発想は、数学ではなくて、その限界を飛び越えようとする哲学か何かをもってるんじゃないですか? しかしその小技もシーケンシャル処理だと通用しても、オブジェクト指向だとまったく通用しなくなるんで、その辺りの発想が抜けてないんじゃないかと思います。 別に小技がダメだとかOOがいいんだとか言うのじゃなくて、class数が多くなったアプリだと一人のデベロパがそれを理解することや管理するのが不可能で、もう既にシーケンシャルの発想のままじゃ無理ですよ。 >なので、仮に最近のOOを用いたアプローチでより洗練された設計 javaなら、javafxとかですかねwまだアルファみたいですけど、このプロジェクトが完全中止になる事はないでしょう。 他には、頑張ってるみたいですけど、adobe flashとかも正当な2d guiの進化をしている気がします。