【初心者】Java質問・相談スレッド94【大歓迎】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/21(火) 06:11:54質問をする前に、貴方が見なければならないサイトについての情報は、
下のwikiのページにまとめてあります。
http://www.wikiroom.com/java/
これからJavaでプログラミングを始めたいが、何をすればいいかわからない人も、
wikiからのリンクをおたどりください。
よくある質問
・「コマンドまたはファイル名が違います」
「'javac' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
「Exception in thread "main" java.lang.NoClassDefFoundError: 」
http://www.wikiroom.com/java/?path,classpath
・String に == は使うな。equals を使え。
・「\12288 は不正な文字です。」
文字リテラル以外で全角スペースは使えません。半角スペースに。
前スレッド
【初心者】Java質問・相談スレッド93【大歓迎】
http://pc8.2ch.net/test/read.cgi/tech/1149349035/
/* 既出の質問や、他に適切なスレが存在する質問は、容赦なく無視されます。
質問をする前にwikiで過去ログ、関連スレ、FAQをチェックしてください。 */
また、当スレで質問をするかたは、回答をもらえたときに、
wikiの更新をして頂ければ、忝なく存じます。
JavaScript, Ajaxの質問は、ここでは受け付けていません。
Web製作板をご利用ください。http://pc5.2ch.net/hp/
次スレは>>980あたりで。
0153デフォルトの名無しさん
2006/11/24(金) 18:53:040154デフォルトの名無しさん
2006/11/24(金) 19:02:260155デフォルトの名無しさん
2006/11/24(金) 19:26:03どうやるの?
0156デフォルトの名無しさん
2006/11/24(金) 19:58:59} catch (...) {
}
を使う。
じゃなくてほんとは、文字列をプログラム断片として評価する方法をしりたいんじゃないのか?
0157デフォルトの名無しさん
2006/11/24(金) 20:03:44アプレットからCGIにデータをPOSTしたいのですが
try{
// URL指定
URL MyUrl=new URL(svUrl);
// コネクションの設定
HttpURLConnection connection = (HttpURLConnection)MyUrl.openConnection();
connection.setRequestMethod("POST");
// 出力フラグのセット
connection.setDoOutput(true);
(データの出力)
}
catch(Exception e){}
のように記述して自宅鯖で試したところ
なぜかアクセスログにはGETでアクセスしたと記録されてしまいます
WEBで調べたところsetDoOutputが必要とあり、試したのですが効果ないようです
正しい形式で送信するには、まだ不足があるのでしょうか?
0158デフォルトの名無しさん
2006/11/24(金) 20:08:25現在JPanel上にJTable とその他多数のコンポーネントが配置されています。
TableCellRendererインターフェースを使ってテーブルのレンダラーを自作で書いていたんですが、
他のコンポーネントがフォーカスを掛けられない状態のときはJTableもフォーカスを掛けられない状態でも
ちゃんと望んだデータを表示するのですが、どこか他のコンポーネントにかかっているとデータを変えても、
JTable上をクリックしないと表示がされません。TableCellRendererを明示的にコールする方法があれば教えてください。
クリックをしなくてもレンダラーをコールする方法を教えてください。
0159158
2006/11/24(金) 20:17:020160デフォルトの名無しさん
2006/11/24(金) 22:11:40javaで、ある特定のフォルダ内にあるファイル名だけを全部取得する
というようなことはできるのでしょうか?
0161デフォルトの名無しさん
2006/11/24(金) 22:14:16File[] files = new File("特定のフォルダ").listFiles()
0162デフォルトの名無しさん
2006/11/24(金) 22:27:22ありがとう!!
0163デフォルトの名無しさん
2006/11/24(金) 22:35:39//Java版eval()
import java.io.*;
class Eval{
private static int execProcessBuilder(ProcessBuilder pb){
try{
Process p = pb.start();
BufferedReader stdIn = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader errIn = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line;
while ((line = stdIn.readLine()) != null) System.out.println(line);
stdIn.close();
while ((line = errIn.readLine()) != null) System.out.println(line);
errIn.close();
return p.waitFor();
}catch(Exception e){
e.printStackTrace();
return 1;
}
}
0164163の続き
2006/11/24(金) 22:37:06try{
File tempJavaSource = File.createTempFile("javaEval", ".java");
String tempSourceFileName = tempJavaSource.getName();
String className = tempSourceFileName.substring(0, tempSourceFileName.length()-".java".length());
PrintStream ps = new PrintStream(tempJavaSource);
ps.print("class " + className + "{public static void main(String[] args){" + str + "}}");
ps.close();
ProcessBuilder javacProcessBuilder = new ProcessBuilder("javac", tempJavaSource.getAbsolutePath());
execProcessBuilder(javacProcessBuilder);
ProcessBuilder javaProcessBuilder = new ProcessBuilder("java", "-cp", "\""+tempJavaSource.getParent()+"\"", className);
return execProcessBuilder(javaProcessBuilder);
}catch(Exception e){
e.printStackTrace();
return 1;
}
}
public static void main(String[] args){
eval("System.out.println(\"Hello, world!\");");
}
}
0165デフォルトの名無しさん
2006/11/24(金) 23:11:11カスタムドックレットを作っています。
DocletAPIって
javadocコメントやタグ以外の
ソース本体を参照することってできないのですか?
特定のリテラルやクラスの参照があるかどうか
チェックしたいんですが。
0166デフォルトの名無しさん
2006/11/24(金) 23:48:030167デフォルトの名無しさん
2006/11/25(土) 00:13:291.5以前では標準ライブラリに含まれてないけど、
BeanScriptingFramework とかもあるよ。
まぁ、スクリプト言語と違って、コンテキスト渡そうとすると
凄く面倒だからスクリプト言語と同じ感覚で使うのは無理かもだけど。
0168157
2006/11/25(土) 01:16:53結論から言うと、そもそもデータが送れていなかったようです
値を渡したいだけの場合でもインプット側のストリームも開かないと通信してくれなかったらしく
それを追加したら問題なく動作してくれました
0169デフォルトの名無しさん
2006/11/25(土) 02:23:22実行中に状況に応じて変更することは可能なのだろうか。
0170ぴゅあ
2006/11/25(土) 03:32:04いちおSystem.out.println()は標準出力へということであるから
使える場面は限定されたりするだろうけど
例えばWinに限定するなら
String esc = new String(new byte[] { 0x1B });
System.out.println(esc + "[18m" + "ABC");
なんかやだから試してはないけど
「コマンドプロンプト エスケープシーケンス」でググッたひとつ
http://kasai86.ld.infoseek.co.jp/dos/esc.htm
とかを参考にしてみればできるかも知れない
それより、それらしきコンポーネントを作ったりして
使いまわせるようにした方が
(自前で作らなくてもあったりしない?
手軽に…というところでは作ることになるのかもだけど)
Javaらしく使えるんじゃないかと思うけど。。。
0171デフォルトの名無しさん
2006/11/25(土) 03:54:14「書き込むと、文字列をスタイル付きでそのTextPaneにappendする」
という働きをするOutputStreamが得られるものを作ったことがあるんだが、
どこかに埋もれてるorz
System.setOutとかに設定してやればそのままprintlnとか出来た。
0172デフォルトの名無しさん
2006/11/25(土) 05:47:37pure javaじゃなくなるけどJava Cursesとか
>>170
windowsに限定してもエスケープシーケンスはcmdでは使えなかった気がする
0173デフォルトの名無しさん
2006/11/25(土) 09:55:13それは楽しみですね
0174ぴゅあ
2006/11/25(土) 13:29:45>cmdでは使えなかった気がする
ということをリンク先に書いてあるみたいですよ
でもそこに書いてあることが何処までできるのかは判らないけど
(起きてから簡単にやってみてはみたけどそれっぽくならない感じだし…
NT系ではシーケンスが変わったとか何処かで見たような気がする?のは
気の所為のような気もする。。。)
0175JAVO
2006/11/25(土) 13:49:44<input type=button value="Roll" onClick='
var randomValue;
randomValue= Math.floor(Math.random()*6)+1;
document.myForm.ValueofDice.value=randomValue;
var totalNumberOfRolls;
totalNumberOfRolls=parseInt(document.myForm.totalrolls.value);
document.myForm.totalrolls.value=totalNumberOfRolls+1;
if(randomValue==1)
{
var 1rolll;
1rolll=parseInt(document.myForm.1isrolled.value);
document.myForm.1isrolled.value=1rolll+1;
}
if(randomValue==6)
{
var 6rolll;
6rolll=parseInt(document.myForm.6isrolled.value);
document.myForm.6isrolled.value=6rolll+1;
}
'>
0176JAVO
2006/11/25(土) 13:51:141、ボタンを押した回数。
2、ランダムナンバー1〜6のうち1が出た回数。
3、ランダムナンバー1〜6のうち6が出た回数。
が出るようにしたいのですがどうしてもうまく作動してくれません。
何が問題なのでしょうか?
問題だと思われる箇所を抜き出して載せてみました。
よろしくおねがいします。
0177デフォルトの名無しさん
2006/11/25(土) 14:11:260178デフォルトの名無しさん
2006/11/25(土) 14:11:45> が出るようにしたいのですがどうしてもうまく作動してくれません。
> 何が問題なのでしょうか?
「プログラムは思ったとおりに動かない、書いたとおりに動く」
初心にでも戻るんだね
0179デフォルトの名無しさん
2006/11/25(土) 14:15:21JavaScriptはスレ違い。ここはJavaスレなんで。
0180デフォルトの名無しさん
2006/11/25(土) 15:13:591 Beansをコンパイルする
2 -classpath $TOMCAT_HOME/common/lib/servlet-api.jarをつけてサーブレットをコンパイルする
という順でしているのですが2をやろうとすると
シンボルが見つけられませんとメッセージが出ます
Beansを参照していないような気がします
どうすればいいのでしょうか?
ぐぐったのですが解決しませんでした
0181デフォルトの名無しさん
2006/11/25(土) 15:18:03-classpath $TOMCAT_HOME/common/lib/servlet-api.jar:$PATH_TO_BEANS とかやんないとダメ。
-classpath は、既存のクラスパスに追加するんじゃなくて上書きだから、
-classpath に指定されてない場所にあるクラスはコンパイル時に使用されない。
0182JAVO
2006/11/25(土) 15:31:26ども。解決しました。
variable,text nameに数記号使えないなんて知らなかったもんで。
スレ違いということすらわからない初心者なもんで、、失礼しました。
0183デフォルトの名無しさん
2006/11/25(土) 15:39:04さっそくのレスありがとうございます
Beanが同じフォルダにある場合、
-classpath .:$TOMCAT_HOME/common/lib/servlet-api.jar
でもいいのでしょうか?
ちなみにこれをやると
Beanのクラスは参照してるが、今度はjavax.servletやjavax.servlet.httpが
存在しないと表示されます
どうしたもんでしょうか?
0184デフォルトの名無しさん
2006/11/25(土) 16:07:33Ballクラスをいじって実行したらボールの描写が汚くなったのですが
ボールの動きが見えるようにするにはどうしたらいいですか?
むしろこれは宿題スレに行けですか?
0185ぴゅあ
2006/11/25(土) 16:08:37":"でセパレートされているところを見るとUNIX/Linux上だろうと思いますけど
$TOMCAT_HOME/common/lib/servlet-api.jarのパスが合ってないとか
$TOMCAT_HOMEが展開されていないとかいうのはないんですよね?
0186184
2006/11/25(土) 16:17:12HashSet<Ball> hs= new HashSet<Ball>();
を使うあたりです
0187デフォルトの名無しさん
2006/11/25(土) 16:34:21基本的なことだけど、
Beansとのつなぎ、データの出し入れはJSPのプロパティを利用する。
すなはちServlet-JSP-<jsp:useBean・・・-Beansと繋ぐ(MVCの基本だけど)
また、EJBに関しても直接ServletやJSPとつなげないから、JSPのJavaBeans経由(JSPのJavaBeansプロパティ経由)でつなぐ。
他にやり方があるのかどうかは知らないけれど、こういう基本的なことだったら、
ttp://www.amazon.co.jp/gp/product/4774114111
が良く整理されてて分かりやすいよ。蛇足だったらスマソ。
0188ぴゅあ
2006/11/25(土) 17:00:13>>184
>汚くなった
とはどういうところが?
なんかジックリ真面目に読まないと問題点が探し難そうだけど
気になったりしたところは…
BallクラスとBFrameクラスでそれぞれThread使ってるところや、この2つのクラスが互いに作用しあっていたりするところ
(それぞれのクラスの目的が分離されていないのがまた読み難くさせている気が…)
Ballクラスはフィールドr,c,x,y,dx,dyくらいを持ってて
BFrameはフレーム(描画…Ballオブジェクトを移動させるタイミングも作ったり)と
フィールドhs(Ball群を持つ)を持つくらいにした方が(何故HashSetを選択したのかは判らないけど)
考えるにも楽そうな気もしないでもないけど
(互いのrun同士で悪さしあっているとかいう影響はでてきていたりしない?
Ballを移動させる処理としてBFrameクラスに1個runメソッドがあったりしたのでもいいんじゃないかと思うけど…)
dx,dyは移動量のつもりだろうと思うけど、その間を繋ぐ描画がなさそうなところとかが
>汚くなった
ということになっていたりなんでしょうか
0189ぴゅあ
2006/11/25(土) 17:03:49Mainクラスの
>(引数を書かなければ,ボールは1個だけとなる。)
はそうなってないんでは?
またmainメソッド内のfor文
>i!=n;
とかは、ちょっとだけ気になったりします。。。
0190デフォルトの名無しさん
2006/11/25(土) 20:54:24細かい機能についての質問で申し訳ないのですが、
階層に合わせてスペースを入れて位置を揃えてくれる機能はありませんでしょうか?
0192デフォルトの名無しさん
2006/11/25(土) 21:35:55できました!かなり便利になりました。
ありがとうございました!
0193デフォルトの名無しさん
2006/11/25(土) 23:04:21public void AAA(String src, String src2, ....... )
と行きたいんですが。。
お願いします。
0194デフォルトの名無しさん
2006/11/25(土) 23:25:22AAA("a", "b", "c");
}
public static void AAA(String src, String... srcs) {
System.out.println("src: " + src);
for (String s : srcs) {
System.out.println("srcs: " + s);
}
}
0195デフォルトの名無しさん
2006/11/25(土) 23:25:310196デフォルトの名無しさん
2006/11/25(土) 23:28:49解決しました、ありがとうございました。
0197ぴゅあ
2006/11/25(土) 23:36:24Java2 5.0以降なら
public void AAA(String src, String ... src2)
という書き方が
それ以前の場合には残念ながらできないです
ならばどうするか
よく見ていたりするだろうメソッド宣言
public static void main(String[] args)
を参考に考えてみてはどうでしょうか
Java2 5.0以降で書ける
public void AAA(String src, String ... src2)
は
public void AAA(String src, String[] src2)
と書いたのと同様になります
0198デフォルトの名無しさん
2006/11/25(土) 23:51:20たのむから Java2 5.0 なんて書きかたしないでくれよ
0199デフォルトの名無しさん
2006/11/26(日) 00:07:070200デフォルトの名無しさん
2006/11/26(日) 01:20:57とりあえずはかけたのですが(数値は適当です)
class Loop {
public static void main(String[] args){
double a0=3;
double d=4;
int number=100;
double a;
for(int i=0;i<number;i=i+1){
a=a0+d*i;
System.out.println(a);
}
System.out.println("END");
}
}
この解を配列としてあつかうにはどう書き足したらいいか
分かりません。教えて頂きたいです・・・
0201デフォルトの名無しさん
2006/11/26(日) 01:47:32あとnextIntにおけるseedとはどういう意味があるのでしょうか?
よろしければご教授ください。
お願いします。
0202デフォルトの名無しさん
2006/11/26(日) 01:57:37(自分にとって)とても奇妙な事に遭遇しました。是非下のコードを(VisualEditorで書きました)
コピペして、このオブジェクト保持する main クラスを書いて実行ボタンを押してみて下さい。
ProgressBar の見た目が、test() メソッドの実行が終了するまで変化しません。
ところが、この test() メソッドを main クラスから実行すると、なんと動くのです。
いったいどうしてこんな動きをするのでしょうか?
また、実行ボタンから ProgressBar を正常に動かす方法があればどうか教えて下さい。
宜しくお願いします。
0203202
2006/11/26(日) 01:58:33import javax.swing.JFrame;
import java.awt.FlowLayout;
import javax.swing.JProgressBar;
import javax.swing.JButton;
public class Test2 extends JFrame {
private JPanel jContentPane = null;
private JProgressBar jProgressBar = null;
private JButton jButton = null;
public Test2() {
super();
initialize();
}
private void initialize() {
this.setSize(300, 200);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
}
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new FlowLayout());
jContentPane.add(getJProgressBar(), null);
jContentPane.add(getJButton(), null);
}
return jContentPane;
}
0204202
2006/11/26(日) 01:59:05if (jProgressBar == null) {
jProgressBar = new JProgressBar();
jProgressBar.setMaximum(10000000);
}
return jProgressBar;
}
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setText("実行");
jButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
test();
}
});
}
return jButton;
}
public void test() {
int j = 0;
for (int i = 0; i <= 10000000; i++) {
j++;
jProgressBar.setValue(j);
}
}
}
0205デフォルトの名無しさん
2006/11/26(日) 02:11:23double a;ってのを配列にしてしまえばOK
例えばこんな感じ
class Loop {
public static void main(String[] args){
double a0=3;
double d=4;
int number=100;
double[] a = new double[number]; //配列の宣言
for(int i=0;i<number;i=i+1){
a[i]=a0+d*i; //配列に格納
System.out.println(a[i]); //一応出力したいなら配列の要素で
}
System.out.println("END");
}
}
0206デフォルトの名無しさん
2006/11/26(日) 02:36:55たぶんJProgressBarのsetValueメソッドを呼ぶところを
SwingスレッドにinvokeLaterで渡してやるといいはず。
0207202
2006/11/26(日) 02:50:01レスして下さってありがとうございます。
でも何をどうして良いのか何にもわかりません・・・。
Swing スレッドが何で、何をどう渡すのでしょう・・・?
ごめんなさい、本当の初心者で。
宜しかったら詳しく教えてくれませんか?
何かを読め、と言われたら読みますのでどうか・・。
0208デフォルトの名無しさん
2006/11/26(日) 02:58:56俺>>206じゃないけどワープはいかんと思うよ。
いきなりGUI使おうって思っても正直凄く難しい。
自分も前いきなりGUIやろうと思ったけど全くわからなかった。
最近やっとAPIの読み方わかってきたし少しくらい考えて書けるようになってきた。
それでもまだGUIを作るのには何日も掛かるし考えも中々まとまらない。
悪いことは言わないから何か作りたいならやさしいJavaくらいは読んでおけ。
GUIが使いたいならSwingの本何かしら読んでおくといいと思う。
0209206
2006/11/26(日) 03:11:57Swingではイベントディスパッチスレッドというスレッドが裏で走ってて、
GUI上の見た目を変化させる処理はすべて
このスレッドから実行しないといけないことになってるんだ。
そのために使うメソッドがSwingUtilities.invokeLaterな。
引数で指定した処理をイベントディスパッチスレッドで実行してくれる。
だから jProgressBar.setValue(j)の代わりに
SwingUtilities.invokeLater(new Runnable() { jProgressBar.setValue(j); })
とかすればいいはず。
0210202
2006/11/26(日) 03:12:08確かに GUI は簡単にかじっただけなので難しいです・・。
言われた通り、足元をもっと踏み固めて進んだほうが良いですよね。
ほんとそう思います。せめて難しい事にチャレンジしながらでも基礎は固めようと思います。
208さんのように考えながら作れる頑張りたいですもんね。忠告ありがとう。
ところで今、ちょっとスレッドに付いて調べていました。そして Runnable ってインターフェースを
見つけたんですが、これを Test2 に実装すればいいのでしょうか?
足元も緩いのですが、今からチャレンジしてみます。
208さん重ねてですが本当にありがとう。頑張りますね!
0211202
2006/11/26(日) 03:16:10レスがニアミスしました。親切で丁寧ににありがとうございます!
Runnable はインナークラスなんですね!勉強したつもりでも自分の頭で思いつきませんでした・・。
でも良い所まで言っていたみたいで少しうれしいです。
早速やってみます。本当にありがとうございました!
0212デフォルトの名無しさん
2006/11/26(日) 04:02:12スレッド越しについて色々調べてきてね
0213202
2006/11/26(日) 04:25:03自分であっぷした>>204の test() メソッドもちょっと間違ってるし、
Runnable() インナークラスも上手くいきませんでした。
run() メソッド内の jProgress.setValue(j); の引数 j がアウタークラス
の変数なので final しないと参照できないのです。それで、Runnable()
のクラス定義する部分を他のメソッドに置いて、そのメソッドに final
した j を渡して実行してみました。でも結果は同じでした。
やっぱり足元が緩い自分には荷が重いのかもしれません。残念です。
今日はもうダウンします。
お付き合い頂きありがとうございました。
>>212
スレッド越しですね。一応調べてみます。
0214デフォルトの名無しさん
2006/11/26(日) 06:39:20jButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
test();
}
});
を
jButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
new Thread() {
public void run() {
test();
}
}.start();
}
});
に
actionPerformedの処理はイベントディスパッチスレッドの中で行われるので
時間がかかる処理は別スレッドで行わないとグラフィック描画処理が固まる。
これだけでもそれなりに動くと思うが安全のために
jProgressBar.setValue(k);
はSwingUtilities.invokeLaterに食わせてやるべきだろうね
0215デフォルトの名無しさん
2006/11/26(日) 06:40:37簡単な計算(足し算)ソフトを作ってるんですが
ボタン、テキストフィールド3つ(txt1 txt2 txt3) を表示させることが出来たんですが
ボタンをおせばtxt3のところに txt1 + txt2 の答えを表示させるにはどうすればいいんですか?
分かりにくい文章かもしれませんがお願いします
0216デフォルトの名無しさん
2006/11/26(日) 06:49:03ボタンにaddActionListenerでActionListenerを実装したクラスを登録。
そのクラスのactionPerformedメソッドの中で、
txt1 + txt2の答をtxt3のsetTextメソッドで設定する。
0217デフォルトの名無しさん
2006/11/26(日) 07:00:13ありがとうです
0218デフォルトの名無しさん
2006/11/26(日) 07:09:33jがローカル変数なのでfinalでないとうまくいかない。
jをインスタンス変数にしてやればアクセスできるようになる。
private int j;
public void test() {
j = 0;
for (int i = 0; i <= 10000000; i++) {
j++;
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() { jProgressBar.setValue(j); }
});
}
}
でも真面目にがんばるから思った通り遅いね、こりゃ。
内部クラスだからうまくいかないというより
匿名クラスだから外側の変数の受け渡しがうまく書けない。
内部クラスでもこんな感じで
public void test() {
int j = 0;
class Hoge implements Runnable {
int k;
void setValue(int k) { this.k = k; }
public void run() { jProgressBar.setValue(k); }
}
Hoge hoge = new Hoge();
for (int i = 0; i <= 10000000; i++) {
j++;
hoge.setValue(j);
javax.swing.SwingUtilities.invokeLater(hoge);
}
}
0219デフォルトの名無しさん
2006/11/26(日) 07:34:18nextInt()というのはjava.util.Randomのメソッドのこと?
Math#random()に対応するのはRandom#nextDouble()
どちらも0〜1の範囲の乱数を返す。
Math#random()は1を含まないけど、Random#nextDouble()が1を含むかどうかは忘れた。
Math.random()は乱数の種をこちらから指定できないので、
検証その他の目的で同じ乱数列を何度も使いたいときには使えない。
その用途にはjava.util.Randomの方を選択。
もちろん乱数列を全て保存するのなら別だが。
乱数の種seedは擬似乱数を生成するときの初期値として使う。
0220デフォルトの名無しさん
2006/11/26(日) 10:24:48アフォな事を質問します。
javaランタイム入ってないのに、なんでjavaアプレットが動作するのでしょうか?
javaアプレットはランタイム不要?
0221デフォルトの名無しさん
2006/11/26(日) 10:40:08以下のどれかだろう。
・実はこっそりとSun JREがプリインストールされている。IBMとかDellとかのPCにはプリインストールされてる。
・アプレット起動時にJREがインストールされたが、それに気づかなかった。
・Microsoft製のJRE(化石時代の古い代物)ががんばってる。Windows XP SP1(?)以前まではインストールされていた。
0222デフォルトの名無しさん
2006/11/26(日) 10:43:110223デフォルトの名無しさん
2006/11/26(日) 10:54:52つか
> javaランタイム入ってないのに
はどうやって確信を得たんだ?
0224デフォルトの名無しさん
2006/11/26(日) 11:29:40java.util.Randomの事です。エスパーありがとうございます。
Random.nextDouble()の方も1.0は含まないと思います。
Rando.nextInt(5)としても0〜4までしか生成されませんので。
普段使いでは(int)(Math.random()*5);のように使っているのですがJ2MEだと
Math.random()は使えずにRandom.nextInt()のみだったので気になりました。
両者比べても大して違いは見られないようなので擬似乱数として
使わないのならimportしない分Math.random()の方が手軽に使えますね。
ありがとうございました。
0225デフォルトの名無しさん
2006/11/26(日) 11:41:090226デフォルトの名無しさん
2006/11/26(日) 12:21:44フリーの「SUN ONE STUDIO 4」を ttp://www.sun.co.jp 上で探したんですが
指定された該当ページにいくと404になっいて、いくら探索しても見つかりません
どこにあるか教えていただけませんか?
0227ぴゅあ
2006/11/26(日) 12:54:58イベントが起こった中で長い処理(test()メソッドの中の)をやっているから他のイベントが処理できなくなっている
なのでその処理(test()メソッドの中の)が終わるまでバーの表示も更新されない
(比べてみれば判ると思うけど実行ボタンはその処理が終わるまで押されたままの表示)
ボタンが押されたイベントは処理(test()メソッドの中の)を起動するトリガとして捉えて
スレッドを起こしてtest()メソッドの中の処理を実行してやるようにすればいいです
そこまでは>>214も挙げているようなところ
SwingUtilities#invokeLaterは必要ないと思う
例えばJProgressBar#setValueとかの中の奥底の方でやっているようなところ
test()メソッドをそのままスレッドを起こして遅いというのは
JProgressBar#setValueを10000000+1も呼んでいるのと
その処理の殆どがJProgressBar#setValueで費やされているから(検証の仕方の問題)
例えば
jProgressBar.setMaximum(100);
とし
if (i%100000 == 0) {
jProgressBar.setValue(i/100000);
}
とかするのでもいいと思うし
実際に進捗モニタとして使われる場合には
JProgressBar#setValueが一連の処理の中で占める割合は僅かなものになるでしょうから
"遅い"というようなことにはならないと思いますよ
0228デフォルトの名無しさん
2006/11/26(日) 13:22:02「疑似乱数として使わないのなら」てどういう意味?
0230デフォルトの名無しさん
2006/11/26(日) 14:24:55java.lang.Math#random()もjava.util.Randomクラスのメソッドが返すものも
放射性物質とか熱雑音とか使って乱数を生成するような実装になっていない限りは
生成されるのは普通は擬似乱数
てか少なくともjava.util.Randomの方はseedを指定できる点で真の乱数ではない
そしてMath#random()はjava.util.Randomを呼んでるし両者は同じものと考えていい
使い勝手が違うだけ
0231デフォルトの名無しさん
2006/11/26(日) 14:30:35あの処理であのサイズの進捗バーの表示を10000001回更新することの無意味さが分かってる上でのコーディングだからね。
進捗バーを使って202が実際にやろうとしている処理は"遅い"ということになる。
やるなら227が例示しているように100000回に1回程度の更新でいい。これだと表示は十分スムーズになる。
でも、実際に動作するかどうか別として、invokeLaterが必要ないと言い切るのは非行だ。
> Once a Swing component has been realized, all code that might affect or depend on the
> state of that component should be executed in the event-dispatching thread.
はSwingでの基本ルールだし、setValueには「このメソッドはスレッドに対して安全です」表示がない。
例えば218の後半の方法を使うなら、
jProgressBar.setMaximum(10000000);
はそのままで、
for (int i = 0; i <= 10000000; i++) {
j++;
hoge.setValue(j);
if (j % 100000 == 0)
javax.swing.SwingUtilities.invokeLater(hoge);
}
のようにinvokeLaterを使うべきじゃないかね? 処理が遅くなることはない。
この場合、jProgressBar.setMaximum(100);でsetValue(i/100000)でも同じ効果なのでそれでもいいが、
どうせ進捗バーの中でスケーリングされるんだから素直にjの値を使うということで。
0232デフォルトの名無しさん
2006/11/26(日) 14:39:330233デフォルトの名無しさん
2006/11/26(日) 14:44:14ついでに内部クラスHogeを使う方法はこれまずいね。
こうすべきか。
public void test() {
int j = 0;
class Hoge implements Runnable {
private int k;
Hoge(int k) { this.k = k; }
public void run() { jProgressBar.setValue(k); }
}
for (int i = 0; i <= 10000000; i++) {
j++;
if (j % 100000 == 0)
javax.swing.SwingUtilities.invokeLater(new Hoge(j));
}
}
>>232
SwingWorker?
0234ぴゅあ
2006/11/26(日) 15:49:18最近のチュートリアルにはSwingWorkerが出てきているみたいですけど
最新はまだ触ってないので代わったわけとか見れてないけど
触るならEventQueue#invokeLaterとかなのかなとも思えたりもするけど
深く追えてはないし(ついさっき例が出てきて触ってみてるだけだし)
今のところはまだ微妙な気もしていたりするけど…
0235ぴゅあ
2006/11/26(日) 16:01:42(5.0のソースコードで)その先のfirePropertyChangeメソッドで
イベントキューに溜めて処理してるんじゃないかと思ってて
JProgressBar#setValue自身がスレッドセーフかというのは
別途JProgressBar#setValueを扱う側で考えるのかな…
(SwingUtilities#invokeLaterを使うとかいうのではなく)
とか思ってたりしてますけど。。。
0236220
2006/11/26(日) 21:58:41>>222
>>223
レス有難うございます。
まず223の回答から
>> > javaランタイム入ってないのに
>> はどうやって確信を得たんだ?
プログラムの追加と削除からIBM-Java Runtime 32bit〜削除。
そしてOSはXP_SP2の為、Microsoft VMも無いこと確認。
222の回答
>>・実はJavaアプレットではなくflashだった。
Javaアプレットでした。
となると221の
アプレット起動時、javaのロゴが表示されて、
何かダウンロード中みたいだったのがJREのインストールだったのかな?
>> ・アプレット起動時にJREがインストールされたが、それに気づかなかった。
が正解な感じがします。
>>221
>>222
>>223
ありがとうございました。
0237202
2006/11/27(月) 00:11:33イベントディスパッチスレッドはシングルスレッドだから固まるんですね。
(知ったように書いていますが実はまだ危ういです)
それだから actionPerformed(ActionEvent); でスレッドを作って test() をよびだすんだと
今やっと分かりました。(スレッド越しと言うのは、一つのスレッド実行中に新しい別の
スレッドを作ることを指すのでしょうか?)
SwingUtilities.invokeLater(...); が必要か、な議論はルールだから守らなきゃくらいしか
自分には分かりませんでしたが、Runnable を実装したクラスをイベントディスパッチ
スレッドに渡して(安全に?)スレッドを起こしてもらうためのものなんですかね?
でも、とりあえず使い方は分かりました。無事動きましたしほんとに助かりました。
また、余計な話ですが、内部クラスからローカル変数を参照するのに final が必要でも、
イスタンスフィールドならそのまま参照できるのを知って自分の素人さも痛感しました。
なぜそうなるのか、また自分で調べてみます。そして書き方もいろいろあるのが面白くて
楽しかった。深い人に教えてもらえて嬉しかったです。余裕ができたら SwingWorker も
知りたいですが、208さんが言った Swing 本も近々探して早く勉強したいです。
ありがとうございました。
0238デフォルトの名無しさん
2006/11/27(月) 00:19:56つ SwingWorker
0239デフォルトの名無しさん
2006/11/27(月) 02:12:40スレが殺伐としてまいりました・・・!!!タタタタ・・
0240デフォルトの名無しさん
2006/11/27(月) 11:25:04同じファイル内のクラスにアクセスするのと同じでしょうか?
sample1とsample2があってこの中でクラスを共有したいのですが、
参照しようとすると
Exception in thread "AWT-EventQueue-0
このようなエラーが出てきます。
0241デフォルトの名無しさん
2006/11/27(月) 11:28:570242デフォルトの名無しさん
2006/11/27(月) 12:05:500243デフォルトの名無しさん
2006/11/27(月) 12:48:10packageの概念についてもっと勉強した方が良い
0244デフォルトの名無しさん
2006/11/27(月) 18:29:29public static void main(String[] args){
double a0=3;
double d=4;
int number=100;
double a;
for(int i=0;i<number;i=i+1){
a=a0+d*i;
System.out.println(a);
}
System.out.println("END");
}
}
すみません。前にも似た感じの質問したんですけれど、
今度はこの等差数列の初めと終わりの解を3個づつ表示
したいんですが、配列を使ってどうしたらいいか教えて
くださいです。
ちなみに配列として扱ったものならば>>205で答えていただきましたが
ここに書き足すものが何か分からないです・・
0245デフォルトの名無しさん
2006/11/27(月) 19:34:14LinkedHashMap<Integer,LinkedHashMap<Integer,String>> table;
今、こんなのを作って使っているのですが・・・
0246デフォルトの名無しさん
2006/11/27(月) 20:21:35二次元テーブルならArrayList<ArrayList<String>> table;でいいんでないかい?
スパースなのならメモリ効率悪いが
0247デフォルトの名無しさん
2006/11/27(月) 21:33:20独自クラス書いた方がよくないか?
縦で抽出したり、横で抽出したりするだろうから
>>246のArrayList入れ子を縦横と横縦で持つような。
0248デフォルトの名無しさん
2006/11/27(月) 22:18:12Person[] p = new Person[2];
p[0]=new Person("UDO","SUZUKI");
p[1]=new Person("TAKAAKI","ISHIBASHI");
/*略*/
}
class Person{
String first;
String second;
Person(String first,String second){
this.first = firtst;
this.second = second;
}
}
としたら
Temp.java:3: ']' がありません。
p[0]=new Person("UDO","SUZUKI");
^
Temp.java:3: <identifier> がありません。
p[0]=new Person("UDO","SUZUKI");
^
Temp.java:4: ']' がありません。
p[1]=new Person("TAKAAKI","ISHIBASHI");
^
Temp.java:4: <identifier> がありません。
p[1]=new Person("TAKAAKI","ISHIBASHI");
^
エラー 4 個
とエラーが出てしまうのですが何が原因か分からないです。。。
0249デフォルトの名無しさん
2006/11/27(月) 22:23:17FullnameクラスをTemp.javaファイルに保存しているのが敗因その1。
クラス名とファイル名は一致させること。
0250デフォルトの名無しさん
2006/11/27(月) 22:26:31すいません、直したやってみましたが駄目です。。
0251デフォルトの名無しさん
2006/11/27(月) 22:47:18p[1]=new Person("TAKAAKI","ISHIBASHI");
ここはメソッドの中じゃないとまずいんじゃないか
0252デフォルトの名無しさん
2006/11/27(月) 22:56:41解決しました!メソッドの中じゃないと駄目なんすですか。。知らなかったです。ありがとうございました!
■ このスレッドは過去ログ倉庫に格納されています