トップページ⇒tech
1001コメント322KB

【初心者】Java質問・相談スレ4【大歓迎】

■ このスレッドは過去ログ倉庫に格納されています
00011NGNG
JAVA初心者の方はこちらのスレで質問をしましょう。そして誰か教えてあげてください。

なお、ソースを貼るときには、半角空白が消える仕様のため、タブ1つを全角空白2つに
置換してから投稿しましょう。雑誌や宿題などの疑問を質問するときは出展を明記した
ほうが解決が早いです。

関連情報は >>2-10 あたりにあります。 (一部 dat落ちやHTML化待ち)


JavaScriptの質問はWeb製作板へどうぞ。
web制作管理
http://pc.2ch.net/hp/

パソコンの基本操作に関しては、PC初心者板や、各OS板などで質問しましょう。
パソコン初心者@2ch掲示板
http://pc.2ch.net/pcqa/

上級者の方で教える技術が無い方は下記スレでダベりましょう。
初心者無視! Java相談室 その9
http://pc.2ch.net/test/read.cgi/tech/1021555964/


基本的にsage進行でおねがいします。
0383デフォルトの名無しさんNGNG
JAVA1001Tipsか?
JAVA Program in a Nutshellか?
0384デフォルトの名無しさんNGNG
>>382
アプレットから勧めるべきだろうか?
じゃあJava2は避けさせた方がいいのだろうか?
0385デフォルトの名無しさんNGNG
>>384
間を取ってJAppletだ!
0386デフォルトの名無しさんNGNG
せっかくだから、どんな入門書がいいか吹いてください。
・DOS窓の正しい使い方が載っている
・PATH / CLASSPATH の正しい説明が載っている
・コンパイル時・実行時のトラブル対策が載っている
とか。

>383
それは入門書じゃないと思います…

>384
アプレット本だから悪いって事はないと思うんだけどな。
まぁ、HelloWorld ぐらいはやっといてもらいたい気もするが。
File だ、Stream だ、なんてのは次のレベルだと思うし。
Java2 かどうかは関係ないっしょ?
最近の本はどっちのイベントモデルで書いてあるんでしょうかね?
0387デフォルトの名無しさんNGNG
アプレットでMIDIを鳴らそうと思ってとりあえず
・・・
AudioClip ac = new AudioClip(getDocumentBase(),"test.mid");
ac.play();
・・・
とやってみたんですが、
ふつうのmidiプレイヤーで再生して出る音量と違って、Maxボリュームにしても
殆ど聞こえない!です。ボリュームを管理するにはどうすればいいか教えてください。
アプリの方には独自のクラスとボリューム調節用メソッドがあるようですが、、、

0388デフォルトの名無しさんNGNG
>>386
JAVA Program in a Nutshellは入門書だと思ったのだが・・・
0389デフォルトの名無しさんNGNG
>>387
ちょっと待て。AudioClipはインタフェースではないか。
new出来るのかと小一時間・・・


少なくとも
AudioClip ac = applet.getAudioClip(getDocumentBase(),"test.mid");
ではないのか?
正確なコードを切り張りして再挑戦。
0390訂正NGNG
あ、よく見たらgetDocumentBase()とかやってるから、Appletのサブクラスか。
ならば正確には
AudioClip ac = getAudioClip(getDocumentBase(),"test.mid");
だな。
0391デフォルトの名無しさんNGNG
>>387
判明。
× getDocumentBase()
○ getCodeBase()

理由
getDocumentBase() はアプレットの載っているHTML文書のファイル
のurlを返している。


とか書いてたが、試しにやってみたら・・・音が出た・・・


とするなら、HTML文書のurlにtest.midが無い、もしくは名前間違い。
ではないのか?例外起きないから。

import java.applet.*;
import javax.swing.*;

public class AudioApplet extends JApplet {
AudioClip ac;
public void init() {
System.out.println("getCodeBase() : "+getCodeBase());
System.out.println("getDocumentBase() : "+getDocumentBase());
ac = getAudioClip(getDocumentBase(),"test.mid");
}
public void destroy() {
ac = null;
}
public void start() {
ac.play();
}
public void stop() {
ac.stop();
}
}
0392デフォルトの名無しさんNGNG
>>386
君には、このスレがあるから大丈夫ね。
「入門xx」買って、とりあえず始めなさい
まずはそれから
0393デフォルトの名無しさんNGNG
>>392
「入門酔拳」?
0394386NGNG
>389〜391
 早速レスありがとうございます。書き込みはミスでした(getAudioClip()でした。)
音は出るんですが、Maxボリュームでやっと聞こえる程度で困ってます。
今のところ"MIDIファイルをMML形式に変換していじる"しか思いつきましぇん。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.applet.AudioClip;

public class audio2 extends Applet{
AudioClip ac;
Button bt1;
public void init(){
add(bt1 = new Button("play"));
bt1.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
ac.play();
}
}
);
ac = getAudioClip(getDocumentBase(),"hikari.mid");
}
}
0395387NGNG
↑387の間違いですスミマセンスミマセン
0396デフォルトの名無しさんNGNG
>>394
>MIDIファイルをMML形式に変換していじる
ここまでできるならMIDIファイル直接いじれよ・・・。
0397377NGNG
厨質問に答えていただきみなさんありがとうございます。それでは入門書買ってきます。
0398独習Java勉強厨NGNG
誰か私に抽象クラスとインターフェースの存在意義について
説明してくれる勇者はいませんか?とくにインターフェース。
空っぽのメソッドだけ宣言していったい何になるのかがどうしても理解しがたいんです。
あとでそれを継承したインターフェースやらクラスやらでメソッドを記述するなら
大元で空っぽのメソッドなんて書かなくてもいいじゃないかと思ってしまいます。

そしてもうひとつ質問が。
定数として扱うものはクラスの先頭で宣言しなくてはいけないものですか?
public static void main(String args[])よりも前に記述してあったので少し気になった次第です。
0399初心者君。NGNG
すいません質問が有ります
抽象メソッドの宣言は、
public abstract void method();
で良いんですよね。
この場合戻り値がvoidなのでこのメソッドをオーバーライドするメソッドも
戻り値を無しにしなくてはいけないのですか?
public abstract method();
では何故いけないのですか?
0400デフォルトの名無しさんNGNG
あるハッシュ表の中身を一端ファイルにとっておき、またそのファイルから
ハッシュ表に読み込むにはどうしたらいいですか。
できれば、具体的に教えて欲しいのですが。
0401とか。。。NGNG
>>399
いけない。戻り値もオーバライドの一部で戻り値のみかえるのはいけない。戻り値を省略できるのはコンストラクタのみ。
0402とか。。。NGNG
>>398
インタフェースはジャバにない関数ポインタの替わりにつかえるっしょ。
後それなりの多重継承用。多重継承のあるC++からなぜ削られたかは
EffectiveC++っちゅう本を読むとそのやらしさ、危険さはわかる。
0403デフォルトの名無しさんNGNG
作成したスレッドの中で起きたエラーを、スレッドの作成元へ返すには、どうすればいいでしょうか?
0404デフォルトの名無しさんNGNG
>>403
パラメータとして呼び出し元の参照を受け取っておく。
0405デフォルトの名無しさんNGNG
>398
 メニューボックスから「二重丸」か「五芒星」か「文字列」を選んで、クリックした場所にそれぞれ二重丸や五芒星や文字列を書くアプレットを考えます。
再描画とかがあるので、できた二重丸クラスや五芒星クラスや文字列クラスを配列に格納していくとします。
でもappletのpaint()メソッドで、いちいち
public void paint(Graphics g){
for(int i = 0;i<myVector.size();i++){
if(myVector.elementAt(i) instanceof TwinCircle){
((TwinCircle)myVector.elementAt(i)).drawTwinCircle(g);
}else if(myVector.elementAt(i) instanceof Pentagon){
((Pentagon)myVector.elementAt(i)).drawPentagon(g);
}else if・・・
とかやって「自分で」クラスによって処理を分岐させるのは面倒ですね。クラスが多くなると氏にたくなります。
pubilc interface drawable{
public void draw(Graphics g);
}というインタフェースを定義してやれば、
二重丸クラス、五芒星クラス、文字列クラスがそれぞれこのインタフェースをimplementsして、
drawメソッドを上書きしておくことで、メインのアプレットのpaintメソッドは
public void paint(Graphics g){
for(int i = 0;i<myVector.size();i++){
((drawable)(myVector.elementAt(i)).draw(g);
}
}
で済みます。つまり自動的にjavaがクラスに応じてそのクラスのdrawメソッドを呼び出してくれます。
これはインタフェースでなくクラスの継承でもできますが、例えば座標と半径を持つ円クラスを親クラスとして、二重丸クラスと五芒星クラスには半径rを適用できますが、文字列クラスには半径rは意味がありません。
振る舞いの大きく異なるクラスはインタフェースで結んだ方が良いです。

0406PolymorphismNGNG
>>398,>>402
あのな・・・多態性を忘れているぞ。
インタフェースの最大の意義である多態性を説明しなけりゃどうにもならん。
関数ポインタっーか関数オブジェクトもそれ抜きには始まるまい。


・・・「多態性」でググってみてくれ。長すぎる話になるから。
その上で分からない部分を聞きに来てくれ。スマヌ。
0407デフォルトの名無しさんNGNG
>例えば座標と半径を持つ円クラスを親クラスとして、二重丸クラスと五芒星クラスには半径rを適用できますが、文字列クラスには半径>rは意味がありません。

って言うか、

文字列は円である。

はばかげていると思わないかい?
0408PolymorphismNGNG
正直、多態性をマスターできたら初学者卒業だから、あと一歩だ。
理解すれば、なるほど!と膝を打つから。
0409デフォルトの名無しさんNGNG
>>399
よく考えれば分かると思うけど、
戻り値が不定なメソッドを作ったとしても
利用のしようが無い。
0410初心者君。(俺も独習Java)NGNG
>>409
抽象メソッドをオーバーライドしてメソッドを作る場合って引数とか戻り値を変えないと
意味が無いように思えるんですが。
う〜んイマイチ理解できましぇん。
0411デフォルトの名無しさんNGNG
>>410
そうすると多態と言うオーバーライドの目的の一つが使用できなくなります。
その考え方ならオーバーライドなんて無くてもいい。全部隠匿すればいいんだから。
0412デフォルトの名無しさんNGNG
>>410
抽象メソッドを作る時点で
役割が決まってるんだから
返り値も当然決まってる筈だろ?
0413デフォルトの名無しさんNGNG
>>410
つぅか継承も否定することになりそうな。
0414398NGNG
>405
なんとなくは分かったような気がするのですが、
分からない部分がうまく言葉にならないので、明日一日考えてみます。
皆様、ありがとうございます。
多態性についても検索してみます。
0415デフォルトの名無しさんNGNG
数値や文字がたくさん入ったTXTデータからそれを読みこんで
たとえば「DATE」というのを見つけたらその次の数値を表示させるなど)
をしたいんですが教えてもらえませんでしょうか
0416HNGNG
//ピースイメージ生成
//--------------------
for (i=24;i>=0;i--) {
image[i]=Image.createImage(20,20);
image[i].getGraphics().drawImage(imgPic,
-20*(i%5),-20*(i/5),
Graphics.LEFT|Graphics.TOP);

わかりますか??(>_<)
0417デフォルトの名無しさんNGNG
>>400

// 書き込み
Hashtable table = new Hashtable();
…
ObjectOutputStream out = null;
try{
  out = new ObjectOutputStream(new FileOutputStream("hoge.ser"));
  out.writeObject(table);
} finally {
  try{if(out != null) out.close();}catch(IOException ex){/* */}
}

// 読み込み
ObjectInputStream in = null;
Hashtable table = null;
try{
  in = new ObjectInputStream(new FileInputStream("hoge.ser"));
  table = (Hashtable)in.readObject();
} finally {
  try{if(in != null) in.close();} catch(IOException ex){/* */}
}

まぁ例外処理はお好きなように。
0418デフォルトの名無しさんNGNG
>>415
とりあえず StringTokenizer を使ってみろと言っておく。
0419デフォルトの名無しさんNGNG
JavaSDK1.4.1ってApplet作れないんですか?
ClassNotFoundになっちゃうんですけど。
0420デフォルトの名無しさんNGNG
>>416
Image は抽象クラスなので BufferedImage(20,20,BufferedImage.TYPE_INT_RGB)
でも使え。
あと、Graphics.drawImage の引数4個版の第四引数はImageObserverなので変。


内容的にはimgPicの画像を使った16パズル系のゲームのピースイメージのロード。
ピースは20×20のサイズで元絵は100×100。
5×5ピースだが24個しか無いのは右下の1ピースは移動用に開けてある為。
0421デフォルトの名無しさんNGNG
>>419
アプレットタグが間違ってないか?
0422デフォルトの名無しさんNGNG
>>419
appletviewer で ClassNotFound になるか確認すれ
0423デフォルトの名無しさんNGNG
>>415
そのデータ見せてみ
0424デフォルトの名無しさんNGNG
>>419
javac -version 1.1 Hoge.java
で試してみ
0425424NGNG
javac -target 1.1 Hoge.java
だったよ。すまそ
0426デフォルトの名無しさんNGNG
Objectの配列が格納されたVectorから、Objectの配列の配列を得るのにイイ方法ってどうよ?
つまり
Vector v = new Vector();
while (hoge.hasNext()){
  Object[] oa = new Object[hoge.getSize()];
  for(int i = 0; i < oa.length; ++i){
    oa[i] = hoge.getData(i);
  }
  v.add(oa);
  hoge.next();
}
みたいな感じでVectorにObject[]流し込むんだけど、これをObject[][]で得たいのよ。

いまのところ
Object[] oa = v.toArray();
Object[][] oaa = new Object[oa.length][];
for(int i = 0; i < oa.length; ++i){
  oaa[i] = (Object[])oa[i];
}
ってやってるんだけどね。
0427デフォルトの名無しさんNGNG
>>426
Object[][] array = v.toArray( new Object[v.size()][] );
ではダメなのか?
0428415NGNG
レスありがとうございます
>>423
--sample.txt---
〜
SampleA
1 32.1 23.4
2 11.2 21.2
SampleB
1 15
2 24
3 55
・・
・・
--------
みたいなデータでこのtxtからSampleBを呼んでそこの次の行からの二行ずつの数値を
配列に取り込みたいんです。
どうかよろしくお願いします。
0429デフォルトの名無しさんNGNG
>428
LineNumberReader使って、1行づつ読んでみればいかがでしょうか。

LineNumberReader reader
= new LineNumberReader( new FileReader("sample.txt"));

String str = reader.readLine();

みたいな感じでreader.readLine()で1行づつとってこれるから。
とりあえず、SampleBと一致するまでは簡単でしょ。
次の行からは適当にパースしてみ。
0430デフォルトの名無しさんNGNG
BufferedReader にしとけ
0431恐れながら・・・NGNG
java . lang . Object にある「 lang 」ってどういう意味ですか?
英和辞典で調べてもありませんでした・・・。
よろしくお願いします。
0432デフォルトの名無しさんNGNG
>>431
言語
0433431NGNG
>>432
どうもありがとうございます。
languageの略だったのか・・・鬱だ
0434デフォルトの名無しさんNGNG
>>431
languageのabbrriationじゃないっすかね?
0435デフォルトの名無しさんNGNG
まちがい。
abbreviation
0436デフォルトの名無しさんNGNG
>>434-435
遅レスかつ自分の知識をひけらかしたい&間違い。
0437デフォルトの名無しさんNGNG
>>436
マァマァ。
みんなそんなもんさ。
0438デフォルトの名無しさんNGNG
>>431
languageですよ。
0439415NGNG
レスありがとうございます
>>429,230
readLine()を使うのは分かるんですがそこから先が良く分かりませんでした。
やりたいこととしては、SampleBまでtxt内容を読まずにすすみSampleBの書いてある行を見つけたらそこから次の行から
処理を行えるようにしたいんです。
この「SampleBを見つけ出す」ってのはどうすればいいんでしょうか
厨房な質問ですみません。
0440デフォルトの名無しさんNGNG
内容を読まずにどうやって SampleB の位置を見つける気?
どこかにインデックスでも作っておかない限りそんなことは出来ないよ?
0441デフォルトの名無しさんNGNG
>439 じゃ何らかのBufferedReader bfは作ったとして。
import java.util.StringTokenizer;

・・・
boolean isDataHeaderFound;
int line,counter;
int dataList[] = new int[MAX];
String tmp = new String();
StringTokneizer st;
while(!(s = bf.readLine(line)) = null){
  st = new StringTokenizer(s);
  if(!isDataHeaderFound){
   if((st.nextToken()).equals("SampleB")){//文字列の比較は等号を用いない
    isDataHeaderFound = true;counter = line+1;
   }
  } else {
dataList[line-counter] = Integer.parseInt(st.nextToken());
   //Integerクラスのstaticメソッド、parseIntを呼び出している。
}
}
・・・
line++;
}
0442デフォルトの名無しさんNGNG
おセロのゲームのを作っているのですが、
ユーザーからの入力(次の指して)を待つときは
ポーリングするのがいいのでしょうか?

他にいい方法があれば教えてください。
0443426NGNG
御疎レスすまそ
Object[][] array = (Object[][])v.toArray( new Object[v.size()][] );
でイケたよ。
さんくす。引数付きのtoArrayってこうやって使うんだね。
0444426NGNG
>>443は>>427ね

>>442
イベントは使えんの?
0445デフォルトの名無しさんNGNG
>>442
イベントドリブンに頼ってみる。
0446デフォルトの名無しさんNGNG
メンバ関数はメソッドって言うけど
データメンバはなんていうの?
0447デフォルトの名無しさんNGNG
>>446
C++で言うメンバ変数はフィールド。広義のプロパティでもあるかも。
0448446NGNG
φ(・・)ほうほう
0449デフォルトの名無しさんNGNG
>>446
インスタンス変数
0450デフォルトの名無しさんNGNG
もともと「メソッド」っていうのは、オブジェクトにメッセージを
送ったときに、実行されるコードをさしてたんだよね。
オブジェクトがどのクラスのインスタンスかによって、実行される
コードが違うから。
だから「メソッド探索」っていうんだよ、「メソッド選択」じゃなくて。
探索して探し当てたものがメソッドだから。
メンバ関数を「メソッド」って言うようになったのは、Javaが出てきてからの気がする。
0451デフォルトの名無しさんNGNG
>イベントドリブン
イベントドリブンの意味はわかるんですけど、
オセロの入力にどう使うんですか?

マウスイベントが発生するまで
ポーリングするというのが、
一番普通に思いつく方法なんですが・・・・
他にいいのありますかねー?

この方法は、ソースコードが汚いので、気分的になんかいやなんですよね。
0452デフォルトの名無しさんNGNG
>>451
イベントドリブンとか、ポーリングとか、意味を本当に理解していますか?
イベントドリブンはイベントが発生するまで待っているという方式。待っている間、
居眠りしていようが、別の仕事をやっていようが構わない。
それに対して、ポーリングは常にこちらから相手のイベント送出があったかどうかを、
聞き回る方式です。通常、イベントを発生する相手は複数あり、これを巡回して注文を
聞き回り、なければ次の相手…、と進め、一巡したら(場合によっては少しインタバルを
置いて)また初めからご用聞きに回る…というやりかたですよ。
このイベントが発生したらこのプロセスが動き出すという仕掛けになっているのが、
イベントドリブンという方式です。OOの基本概念の一つと言ってもいい。これを
きちんと理解しないと、Javaは使いこなせませんよ♪
0453デフォルトの名無しさんNGNG
>>450
Java以前からも言ってた気が。
0454デフォルトの名無しさんNGNG
>>431
language
0455デフォルトの名無しさんNGNG
>>454

>>436
0456デフォルトの名無しさんNGNG
>>455
lang くらいで知識をひけらかせていると考えるヤツって、どういう知識を他にもってんだ?
0457デフォルトの名無しさんNGNG
>452
そりゃそうなんだろうけど、ロウレベルでの処理を考えてしまうと
そんなんどうでもいいや、という感じだよね。
おいら、あんまり抽象的な考えかたって出来ない…。
0458デフォルトの名無しさんNGNG
>>457
>ロウレベルでの処理を考えてしまうと
Javaで考える必要ないと思うぞ?
0459457NGNG
>>458
0460457NGNG
ごめん。途中で送ってしまった。
>>458
もちろん考える必要はないですし、むしろ考えるべきではないですね。
でも、考えてしまう自分が嫌だというか。
0461デフォルトの名無しさんNGNG
Java の GUI 使ったゲームでポーリングなんかしたら画面が
表示されないぞ。駆動はイベントディスパッチャーにまかせとけ。
0462デフォルトの名無しさんNGNG
ボーリングゲームは作れないんですか?
0463デフォルトの名無しさんNGNG
つか、Listener使わないでマウスイベント拾う方法って知らない。
知らなくてもいい事という意識で調べてもいない。
実際、あるのか?そんな方法。
0464デフォルトの名無しさんNGNG
>>463
JDK 1.0 AWT Programming
0465デフォルトの名無しさんNGNG
>>464
あれもどうかとおもうけどね。
0466デフォルトの名無しさんNGNG
Javaで平仮名→片仮名変換やら半角全角変換やらは、どうやったらできるですか?
0467デフォルトの名無しさんNGNG
>>466
unicode表を読もう。
0468466NGNG
>>467
らくらくぽんでやりたい。
0469デフォルトの名無しさんNGNG
>>468
らくらくぽんでやってください。
0470466NGNG
>>469
やりかた知らない?
イガぴょんのライブラリってどうなん?
0471デフォルトの名無しさんNGNG
>>470

>>467
0472デフォルトの名無しさんNGNG
カマって君は放置してくれる?
0473デフォルトの名無しさんNGNG
>>472
OK。>>466は放置で。
0474420NGNG
あ、5×5ピースあるじゃん・・・何見てるんだ俺。
0475415NGNG
レスありがとうございます
>>441
それを元にいろいろ試してみたんですが上手くいきませんでした。
できればここをおしえてもらいたいです。
while((s=f.readLine())!=null){
で一行ずつ読んでいって
その一行にSampleAという文字がなければ次の行、
もしあればそこでwhile文を抜けたいんです。
この書き方を教えてもらえませんでしょうか。
441さんのやつで一応やったんですがどうもエラーがでてしまいました。
よろしくお願いします
0476デフォルトの名無しさんNGNG
JavaはC厨でも身につけられますか?
0477デフォルトの名無しさんNGNG
>>476
配列はポインタのインクリメント以外で参照したくないぜー!とか言う人間には向いてない。
0478デフォルトの名無しさんNGNG
>>477
私は添え字も使いますよ!
0479478NGNG
とりあえずJavaの本を買ってくるか・・・・
0480デフォルトの名無しさんNGNG
>>478
って言うかごちゃごちゃ言う前にさわればよかろう。
必要なものは無料だ。
時間は腐るほどあるだろう。
0481デフォルトの名無しさんNGNG
>>480
本が高いので・・・・
0482名無しさんNGNG
URLに有るパラメータで、
ttp://localhost/test.html?name=xx
このnameをtest.html上に設置しているAppletで取得したいのですが、
こういうことはできるんでしょうか?
appletタグにparamをつければ動作できるのですが、
呼び出し元からパラメータを送り込んでやりたいのです。
アドバイスください。よろしくお願いいたします。
■ このスレッドは過去ログ倉庫に格納されています