【初心者】Java質問・相談スレッド120【歓迎】

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2008/11/15(土) 19:57:53
>>951
どこにも作らなくて良いです。
953デフォルトの名無しさん:2008/11/15(土) 20:41:44
わろす
954デフォルトの名無しさん:2008/11/15(土) 20:50:28
java EEの本によく出てくるEnumeration型って何なんですかね・・・
java SEのコレクションと何か違うんでしょうか?
955デフォルトの名無しさん:2008/11/15(土) 20:59:57
956デフォルトの名無しさん:2008/11/15(土) 21:02:48
>>919
ちゃんとイベントディスパッチスレッド上でやってる?
957デフォルトの名無しさん:2008/11/15(土) 21:50:40
>>951
アプレットのことかな?mainメソッドっていうのは、いわゆる普通のアプリケーションで
どこからプログラムをスタートさせるのか書かないと実行マシン(仮想マシン)が、どこからはじめたらいいか
わからないからmainメソッドを書くんだよ。必ずmainメソッドから始まるようにするんだ。これはC言語とかC#でもいっしょ。

アップレットやサーブレットは決まった処理は決まったメソッドを呼ぶようにしてるから
メインメソッドがなくても、きまった処理が必要になったときに決まったメソッドが呼ばれるようになっているんだよ。
958デフォルトの名無しさん:2008/11/15(土) 22:23:31
>>957
ありがとうございました
959デフォルトの名無しさん:2008/11/15(土) 23:18:09
>>931です
ウイルスキラーを削除したらインストールできました。
ウイルスキラーは終了するだけでは無理でした。
960デフォルトの名無しさん:2008/11/16(日) 00:42:18
eclipseで

import javax.media.opengl.GL;
import javax.media.opengl.glu.GLU;

ってパッケージのimportができないんだ
eclipseでパスの追加はしてある

/usr/lib/jvm/default-java/jre/lib/ext/jogl.jar
/usr/lib/jvm/default-java/jre/lib/ext/jogl-natives-linux.jar

なんでダメなんだろ
961デフォルトの名無しさん:2008/11/16(日) 00:48:47
jogl.jarの中を見ると

GL.classがあるのは

/net/java/games/jogl/GL.class

という場所だ
ひょっとしてパッケージ宣言とimportが
かみ合ってないんだろうか
962903:2008/11/16(日) 00:57:51
>>956
イベントディスパッチスレッドで実行しても同じ現象が発生してます。
JavaVMのバグなのか自分のプログラムのバグなのか切り分けができません。
正直疲れました。

SwingUtilities.invokeLater(new Runnable(){
 public void run(){
  try{
   for(int i = 0; i < 1000; i++){
    TestJFrame frame = new TestJFrame();
    frame.display();
    Thread.sleep(1000);
   }
  } catch(InterruptedException e){
   e.printStackTrace();
  }
 }
});

963デフォルトの名無しさん:2008/11/16(日) 01:13:34
>>962
for文の中の前2行(new と display)を invokeLater に実行させたら?
964デフォルトの名無しさん:2008/11/16(日) 01:18:50
>962
イベントディスパッチスレッドをスリープで止めてるから他のものが描画されない。
965デフォルトの名無しさん:2008/11/16(日) 01:26:23
どうしてもすぐ再描画したいなら、
RootPaneのpaintImmediatelyを使いなはれ
966デフォルトの名無しさん:2008/11/16(日) 02:08:28
イベントディスパッチスレッドは止めちゃダメ。
Swing コンポーネントの描画も EDT で行われる。
どうしても1秒間止めたいなら
javax.swing.Timer で1秒後に display() を
呼ぶようにすればいい。
967903:2008/11/16(日) 02:32:32
>>963
>>964
>>965
>>966
ありがとうございます。
Thread.sleep(1000)をはずしてTimerでやってみたましたが、
やはり数十回に1回は真っ白なウィンドウが出てしまいます。
その時のウィンドウはキーイベントを受け取っている(KeyListenerで確認)ので、
完全に固まっているわけではなく、描画だけが追いついていない様子です。
そんなに重い処理でもしているのでしょうか?私はそうは思えないです。

試しにpaintImmediately()やrepaint()を実行しても現象変わらずです。
968デフォルトの名無しさん:2008/11/16(日) 04:36:58
サーブレットの仕様でインクルードというのがありますが
インクルードすることによって何が出来るようになるんですか?

ServletDispatcher(サーブレット名).include(req,res)
これで指定したサーブレットのメソッドが使えるようになったりするんでしょうか?
969デフォルトの名無しさん:2008/11/16(日) 09:19:03
>>967
実行可能な最小ソースコード見せて
970デフォルトの名無しさん:2008/11/16(日) 17:26:07
>>968
include っていうのは、そのファイルに色々サーブレットの処理を書いておいて
それを表示するってことだよ。

たとえば、エラーページなんか表示したいとき、ひとつのページごとに違うエラーページつくってたら
めんどくさいでしょ?上の君の貼った例ServletDispatcher(サーブレット名).include(req,res) だと
色々なページでエラーがおきたら、そこのURLに飛ばしてそこでinclude文使ってあるファイルをインクルードすると
エラーページは1つ書いておけばいいだけになるんだよ。

サーブレットのメソッドもつかえるようになるんだけど、ページの取り込みというのが目的だよ。includeファイルにエラーのページの内容を書いておけば
そこで処理すればいいからね。ひとつのインクルードファイルだけですむんだ。include文でよまれたインクルードファイルは処理して
表示されるんだ。たとえば、a.classでb.classをインクルードするとa.classの中のb.classをインクルードした場所に
bのサーブレットで書いた部分が表示される。
971デフォルトの名無しさん:2008/11/16(日) 18:56:35
以下の条件のようなクラスDollarを作成しています。
1.Moneyのサブクラスである。
2.コンストラクタにdouble型で値を入れるとその値を持つオブジェクトを生成する。
3.toStringメソッドを使うと、「$(コンストラクタに入れた値)」となる文字列を得る。

この特に条件2をどうしても実現できません(この場合のオブジェクトを生成する方法がわからない)。
アドバイス、ヒント等よろしくお願いします。
972デフォルトの名無しさん:2008/11/16(日) 18:58:30
private double value;
public Dollar(double value) { this.value = value; }
でいいの?
973デフォルトの名無しさん:2008/11/16(日) 19:05:08
>>972
すいません。クラスMoneyが抽象クラスなんです。。
abstract public class Money {
private double value;
protected Money(double value){
this.value = value;
}
abstract protected String getPrefix();
abstract protected String getPostfix();
@Override public String toString(){
return getPrefix()+String.valueOf(value)+getPostfix();
}
abstract public double getYenRate();
public double getValue(){
return value*getYenRate();
}
@Override public boolean equals(Object obj){
if(this == obj) return true;
if(!(obj instanceof Money)) return false;
Money m = (Money) obj;
return this.getValue() == m.getValue();
}
@Override public int hashCode(){
long v = Double.doubleToLongBits(getValue());
return (int)(v^(v>>>32));
}
}
974はんしょう:2008/11/16(日) 19:07:50
先の方に割り込む形になるのでしたら ごめんなさい
JAVAのJBUILDER2005を見ています(正直使っているという状態ではまだないのです)が、
JPX(プロジェクト)ファイルを再BulidするのとMakeをするのとがメニューにあります。
1:この違いはなんでしょうか?一見どうちらを選択しての既存のものは実行できるか
できないのか について言えば変わりはなかった。
2:幾つかのサンプルの内、上のようにJbuliderで実行をすると絵が出ますので、実行できるようになるですが
Jbuliderのソフトを介さないで 実行できることはないでしょうか。
Javaは実行ファイル(正確な用語でないかもしれませんが)というものはないでしょうか?
例えばWindowsで言えば、拡張子.exeのファイルは直に、
あるいは FLASHの.swfファイルはIEで(ブロックは外して)開くことが出来る。同じflashの.flvファイルはWeb上で、起動ファイルを導入してしか見えない(Youtubeのように)。
JAVAはどうでしょうか?
それと.JAVAという拡張子ファイルはソースファイルと理解してよいでしょうか?

975デフォルトの名無しさん:2008/11/16(日) 19:09:25
>>973
なんで条件を後出しするの?
馬鹿なの? 死ぬの?

public Dollar(double value) { super(value); }
@Override protected String getPrefix() { return "$"; }
@Override protected String getPostfix() { return ""; }
976デフォルトの名無しさん:2008/11/16(日) 19:12:03
>>975
申しわけございません。
ちなみにオブジェクトを生成っていうのはnew演算子を使う以外方法はないんですか?
977デフォルトの名無しさん:2008/11/16(日) 19:23:43
ジェネリックスで行き詰まってしまったので助けていただけないでしょうか?
今作っているのは(例え話として)「引き出しクラスを指定できる可変長タンス」です。

public class Tansu {
Class<? extends IHikidashi> hikidashiClass;
ArrayList<IHikidashi> hlist;

public Tansu(Class<? extends IHikidashi> hikidashiClass)
{ this.hikidashiClass = hikidashiClass; }

public void addHikidashi() throws Exception
{hlist.add(hikidashiClass.newInstance());}
}

Tansu tansu = new Tansu(ConcreteHikidashi.class); tanse.addHihidashi();
でタンスを作成して引き出しを追加します。ここまではOK。
ここでタンスの引き出しの中身を任意のクラスに差し替え可能にしようとしました。

public class Tana<NAKAMI> {
Class<? extends IHikidashi<NAKAMI>> hikidashiClass;
ArrayList<IHikidashi<NAKAMI>> hlist;

public Tana(Class<? extends IHikidashi<NAKAMI>> hikidashiClass)
{ this.hikidashiClass = hikidashiClass; }
...

で、中身が整数型なタンスを作成しようと
Tansu<Integer> tansu = new Tansu<Integer>(ConcreteHikidashi<Integer>.class);

とすると、".class"近辺が文法エラーで怒られてしまいます。
つまりジェリックスを利用して宣言されたクラスのClassオブジェクトを
入手したいのですが、これはどのようにすれば良いのでしょうか?
978デフォルトの名無しさん:2008/11/16(日) 19:43:54
>>977
ConcreteHikidash の代わりに IntegerHikidash implements IHikidasshi<Integer> 使うとか。
979デフォルトの名無しさん:2008/11/16(日) 20:16:59
>>978
あぁ、確かに出来ました。コードの何処かで

class IntegerHikidashi extends ConcreteHikidashi<Integer>{}

とか宣言しておいて、

Tansu<Integer> tansu = new Tansu<Integer>(IntegerHikidashi.class);

でエラーも警告も無しでコンパイルが通ります。助かりました。

しかし上記のような空の継承クラス宣言無しでスマートに出来る方法は
無いでしょうかね。
また以下のように引き出しのインスタンスを生成してそのクラスを渡して
も怒られるなど、まだまだ私にとってジェリックスには謎が多いです・・・

IHikidashi<Integer> prototype = new ConcreteHikidashi<Integer>();
Tansu<Integer> tansu2 = new Tansu<Integer>(prototype.getClass());

-> The constructor Tansu<Integer>(Class<capture#4-of ? extends IHikidashi>) is undefined
980デフォルトの名無しさん:2008/11/16(日) 20:55:52
えっと、

SomeClass method(Class klass, String arg) {
< xxxx を呼ぶだめの前処理 >
Class ? x = new klass(<前処理結果 1>);
return klass.any_method(arg, <前処理結果 2>);
}

てな事を書きたい場合、どうすればええの?
981980:2008/11/16(日) 21:09:56
説明が足りないと思われるので
ぶっちゃけ Lisp 系の言語で良く定義される

(with-open-file (ファイルオープン処理) 本体)
(with-disable-interrupt 本体)

外側の () から抜けるときは exception だろうが何だろうが,
ファイルクローズなり, 割り込み許可の処理をおわってブロック
から抜けてくるような作りにしたい

本体は, 戻値と引数がマッチしていれば何でも OK みたいな………
982デフォルトの名無しさん:2008/11/16(日) 21:34:18
>>981
つ無名クラス
クロージャ持つ言語に比べてめちゃめちゃ冗長になるけどな。
983デフォルトの名無しさん:2008/11/16(日) 22:15:01
>>976
リフレクション
984980:2008/11/16(日) 22:24:53
>>982 やっぱそうか
>>983 速度的にどうなのよ?
985デフォルトの名無しさん:2008/11/16(日) 22:31:23
ジェネリックス難しいお
勉強中
986デフォルトの名無しさん:2008/11/16(日) 22:32:10
>>976
DI
987デフォルトの名無しさん:2008/11/16(日) 22:51:37
すごい基本的なんだけど・・・
コンパイルは、どうやるんですか?
OSは、Windouwsです。
入門書を買ったんですか・・・コンパイルの方法が書いてない・・
988デフォルトの名無しさん:2008/11/16(日) 23:03:32
989デフォルトの名無しさん:2008/11/16(日) 23:15:22
>>984
何千個もインスタンス作るとかじゃなきゃ
速度は問題にならないっしょ。
990デフォルトの名無しさん:2008/11/16(日) 23:20:11
>>985
使うだけなら比較的簡単。
言語仕様については理解することを放棄した。
(理論的背景がさっぱりだ)
991デフォルトの名無しさん:2008/11/16(日) 23:31:46
ジェネリクスを分かりやすく解説しているサイトはあまりないからね。
992デフォルトの名無しさん:2008/11/16(日) 23:47:41
MoneyCollection クラスに格納されている各 Money のオブジェクトに対して、日本円に換算した合計金額を
Yen オブジェクトで返す public Yen total() メソッドを実装するのですが、
格納されているのはMoneyのオブジェクトで返す時はYenオブジェクトにするという場合どのように
すればいいですか?下のようにpublic Yen total()メソッドを実装しようとしたんですが、
失敗続きで。。。アドバイスお願いします。
import java.util.*;
public class MoneyCollection extends ArrayList<Money> {
public MoneyCollection(){
super();
}
  public Yen total(){
    ???

public void show(){
for(Money m : this){
System.out.println(m);
}
}
}
993デフォルトの名無しさん:2008/11/16(日) 23:53:04
>>992
>>971と同じ人?宿題は宿題スレへ。
>>971のときもそうだったけど条件は全部書こうぜ。
994デフォルトの名無しさん:2008/11/17(月) 00:26:31
>>987
http://www.smg.co.jp/seminar/java/でインストールすましたら(かならずPATHは設定する事)
コマンドプロンプト開いてcdコマンドで自分のソースファイルを保存したディレクトリに移動して
javac ファイル名とコマンドするだけ。cdはコマンドプロンプトが作業するディレクトリを移動するコマンド。
たとえば、c:\javaフォルダにソースファイルを保存したら、コマンドプロンプトを開いてcd c:\javaとすれば
移動できる。そこで、javac 保存したファイル名 とコマンドをうてばコンパイルできる。コンパイルの仕方は
→を参照。http://www.stackasterisk.jp/tech/java/java01_03.jsp
ちなみに、PATHっていうのは、
C:\Program Files\Java\jdk1.5.0_16\bin
            ↑
            Javaのバージョン
と設定するんだけど、binフォルダにあるjavacがjavaコンパイラのこと。
だから、コンパイルするときjavac ソースファイル名 とするんだけど
コマンドプロンプトでプログラム起動するときはPATHに設定しておくと
プログラム名だけで起動できる。
PATHっていうのは、そういうもの。
995994:2008/11/17(月) 00:29:10
訂正
jdk1.5.0_16 ← これがJavaのバージョン。
だから、質問者がダウンロードしたバージョンにより、このフォルダ名が
変わっているはずだから、自分のフォルダ名をしっかり書くこと。
一度、マイコンピュータから順々にJavaのインストールしたフォルダ階層をくぐっていくといいよ。
996デフォルトの名無しさん:2008/11/17(月) 01:11:34
おやすみ。

【初心者】Java質問・相談スレッド121【歓迎】
ttp://pc11.2ch.net/test/read.cgi/tech/1226851794/
997デフォルトの名無しさん:2008/11/17(月) 01:55:39
>>996
乙。
998デフォルトの名無しさん:2008/11/17(月) 02:00:47
>>996
999デフォルトの名無しさん:2008/11/17(月) 02:24:22
ume
1000デフォルトの名無しさん:2008/11/17(月) 02:29:05
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。