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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/10/22(日) 13:42:10
過去ログ、関連スレッド、よくある質問とその回答、
質問をする前に、貴方が見なければならないサイトについての情報は、
下の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質問・相談スレッド92【大歓迎】
http://pc8.2ch.net/test/read.cgi/tech/1159700963/

/* 既出の質問や、他に適切なスレが存在する質問は、容赦なく無視されます。
質問をする前にwikiで過去ログ、関連スレ、FAQをチェックしてください。 */
また、当スレで質問をするかたは、回答をもらえたときに、
wikiの更新をして頂ければ、忝なく存じます。

JavaScript, Ajaxの質問は、ここでは受け付けていません。
Web製作板をご利用ください。http://pc5.2ch.net/hp/

次スレは>>980あたりで。
0369ぴゅあ2006/11/02(木) 19:57:38
>>366
>>166の話と同じ

ところで…

書いてある範囲に限定した話で
>もう一個のプログラムで
>soc = new Socket("localhost",****)
って関係ないから・・・

>この程度ならセキュリティも何もないんですかね?
がどっちの意味を指して言っているのか判らないけど…
・セキュリティ度外視状態
・セキュリティ無関係状態

あとはレスしてくれた人たちのを理解すればいいだろうから省略
0370ぴゅあ2006/11/02(木) 20:02:32
>>360
APIリファレンスでマウス周りのクラスを一通り見てみるつもりでも見れば
きちんと説明されてるみたいですよ
(>>362が解説してくれたところまでもが)
0371デフォルトの名無しさん2006/11/02(木) 20:38:05
最近Javaを勉強しはじめて、C/C++の知識があったので
基本データ型以外の変数は全て参照型ということで納得していたのですが、
String a = "aaa";
String b = "aaa";
でa==bがtrueになったり、
b = a.substring(1);
だとa==bがfalseで
b = a.substring(0);
だとa==bがtrueだったりするのが不自然に思えました。
これは書き換えを行わないという前提のStringクラスだけの特別な仕様で
一つの文字列につき一つのStringインスタンスしか作らないような仕組みになってるんですか?
0372デフォルトの名無しさん2006/11/02(木) 20:52:07
>>371
Yes.
だだしnew String("aaa")すると新しくStringが生成される
03733712006/11/02(木) 21:22:46
試してみたら確かにそうなりました。ありがとうございます。
0374ぴゅあ2006/11/02(木) 21:39:52
>>373
でもまだ微妙かも?

"=="は文字列"aaa"を見てるんじゃないよ
というのとかをまず理解できた方がいいんじゃないかと思う
(>>371に対しては長くなったので割愛しました@色々やれば色々と判ってくると思うし)
0375デフォルトの名無しさん2006/11/02(木) 21:50:47
iアプリでゲームを作っているのですが
質問なのですが、DoJa 4.0以降でAACもしくはPCMは再生できるのでしょうか。
ADPCMもDoJa 4.0世代での対応周波数が分からないので…。
よろしくお願いします。
0376ぴゅあ2006/11/02(木) 22:04:48
>>373
あ いや…
Stringオブジェクトについて見ようとしていたのかも知れないし
"aaa"の方かな。。。

結局はStringと"=="の話に到達してそうな気もするけど…
0377デフォルトの名無しさん2006/11/02(木) 22:41:09
>>368
>>369
どうもありがとうございます
0378デフォルトの名無しさん2006/11/03(金) 03:17:00
>>371
必ずそうなる訳ではないので、内容比較はequals使いましょう

Integerとかも、場合によってはインスタンス使い回すし。
不変オブジェクトはそういうインスタンス使い回しがよくされる。
でも、それは実装依存だからね。
03793712006/11/03(金) 04:57:09
参照型の変数はC/C++のポインタと同じようにとらえていたので、
内容比較にならないのはわかっていたんです。
"hoge".instanceMethod()という構文ができるということは
文字列リテラルを書いただけでインスタンスが作成されていて、
更に>>371の二回目の"aaa"では新たに作成せずに
自動的に一回目と同じインスタンスになっているんですよね。
そのあたりのJavaの挙動が不思議だったんです。

ところで>>378のような文脈での「実装」という言葉の定義がよくわからないのですが、
ソースから処理実行までの過程のどの部分のどういった差異の事を指すんですか?
0380デフォルトの名無しさん2006/11/03(金) 05:49:36
>>314
メディエータだろ。
0381デフォルトの名無しさん2006/11/03(金) 05:59:53
>>371
C/C++でも静的文字列は使いまわされる実装が多い気がするが
Javaでは文字列リテラルはVMだかクラスローダだかで一意の
Stringオブジェクトになることが仕様で決まっている。
(たとえ複数のクラスにまたがって書いてあったとしても!)

なおJavaに限らず仕様で決まっていないことは *すべて* 実装依存だ。
0382デフォルトの名無しさん2006/11/03(金) 07:09:38
>>379
>ところで>>378のような文脈での「実装」という言葉の定義がよくわからないのですが
VM とか java.lang.* みたいなVMに直結したライブラリの実装。
というより、言語規定で明確に決められていないって事かな?

>>371 に関して言えば、言語規定で決められてないって意味では
"aaa" == "aaa".substring(0) が true になった事ぐらいのような気もするけど。
0383デフォルトの名無しさん2006/11/03(金) 13:40:29
Clonableインターフェイス、Cloneメソッドについて質問があるのですが、
これらはCopyメソッドと比べて何が違うのでしょうか?
どちらもオブジェクトの情報を複製するのが目的だと思うのですが、
どのように使い分けるのでしょうか?
0384デフォルトの名無しさんNGNG?2BP(0)
FileReader fr= new FileReader(args[0]);
BufferedReader br= new BufferedReader(fr);


FileReaderとBufferedReaderの違いがよくわからないのですが
具体的に何をどう読み込んでるか教えてくだしあ><
0385デフォルトの名無しさん2006/11/03(金) 13:47:24
>>383
Copyメソッドって何だ?
それから、大文字小文字は区別しろ。
0386デフォルトの名無しさん2006/11/03(金) 13:58:38
>>385
配列を複製する時に使用するのが、copyメソッドらしいのですが
配列以外では使えないのか、cloneメソッドでは複製出来ないのかな、と。
また、Clonableインターフェイスを絡めて他のクラスからの情報を複製する場合、
どのような感じでコードを書けば良いかが分かりません。

ご指摘ありがとうございます。今後、気をつけます。>大文字小文字は区別しろ。
0387デフォルトの名無しさん2006/11/03(金) 15:03:24
>>386
配列でも clone() 使えるぞ。 それに配列に copy() なんてメソッド無いぞ。

java.lang.System#arraycopy(Object,int,Object,int,int) の事を言ってるのかもしれんが、
あれは複製じゃなくて内容を書き写すメソッドだからなぁ。
0388デフォルトの名無しさん2006/11/03(金) 15:11:52
そういやCloneableの綴りはもう一生直らないのですか?
0389デフォルトの名無しさん2006/11/03(金) 15:17:09
>>388
たぶん一生直らないと思う。
0390デフォルトの名無しさん2006/11/03(金) 15:22:02
>>384
> FileReaderとBufferedReaderの違いがよくわからないのですが
BufferedReader は readLine() が使える。
FileReader は一文字読み込みの read() やらを連発すると、
実行速度が著しく低下する可能性がある。
0391デフォルトの名無しさん2006/11/03(金) 15:23:33
JDBC1.0プログラミングについて質問です。
where句が動的に変わるSQLでPreparedStatementを使用すると、
PreparedStatement#setXXX メソッドを呼び出すときに
同じような条件判定を書かなきゃいけなくなります。
なんかうまく書く方法ってないでしょうか?
// where句の編集
if (joken1 != null) {
whereSql = whereSql + "joken1 = ?";
}
if (joken2 != null) {
whereSql = whereSql + "joken2 = ?";
}
if (joken3 != null) {
whereSql = whereSql + "joken3 = ?";
}
PreparedStatement ps = conn.prepareStatement(sql + whereSql);
// プレースホルダへ検索条件設定
if (joken1 != null) {
ps.setString(index++, joken1);
}
if (joken2 != null) {
ps.setString(index++, joken2);
}
if (joken3 != null) {
ps.setString(index++, joken3);
}
0392デフォルトの名無しさん2006/11/03(金) 15:49:02
>>391
List paramList = new ArrayList();

if (joken1 != null) {
 whereSql = whereSql + "joken1 = ?";
 paramList.add(joken1);
}

// 中略

PreparedStatement ps = conn.prepareStatement(sql + whereSql);

int index = 0;
for(Iterator paramItr = paramList.iterator; paramItr.hasNext(); ){
 ps.setObject(++index; paramItr.next());
}
0393デフォルトの名無しさん2006/11/03(金) 15:53:45
>>387
レスありがとうございます。
という事は教本等にある、シャローコピー、ディープコピーとは何に当たるのでしょうか?

cloneableインターフェイスとcloneメソッドですが、「オブジェクトの複製」をする為にあると
思って間違いはないでしょうか?例えば、

public class Data implements Cloneable {

int x;

if (this instanceof Cloneable){

Data d = new Data(何かしらのデータ);
for(int i = 0; i<this.size; i++){
d.x = this.x;
return x;
} else{

throw CloneNotSupportedException;

}

こんな感じで良いのでしょうか?
0394デフォルトの名無しさん2006/11/03(金) 16:02:15
>>388
Bug ID: 1234712 Cloneable is misspelled を参照。

0395デフォルトの名無しさん2006/11/03(金) 16:10:55
>>393
> シャローコピー、ディープコピーとは何に当たるのでしょうか?
例えば、こんな配列があったとして
int[][] array = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

シャローコピーは 1階層しかコピーしない、浅いコピー。
int[][] shallow = new int[array.length][];
for(int i = 0; i < array.length ; i++) shallow[i] = array[i];

ディープコピーは、全階層を辿ってコピーする。
int[][] deep = new int[array.length][];
for(int i = 0; i < array.length ; i++){
 deep[i] = new int[array[i].length];
 for(int j = 0; j < array[i].length; j++) deep[i][j] = array[i][j];
}

シャローコピーでは、src[0][0] = 2; とかやると、shallow にも影響が及ぶ。
ディープコピーでは影響が及ばない代わりに、コピーのコストが高い。
0396デフォルトの名無しさん2006/11/03(金) 16:25:38
>>393
public Object clone() メソッドを実装しろ。それだと Cloneable である意味が全然ない。
clone メソッドの中でコピーをする方法を書くんだ。
シャローコピーでいいなら super.clone() を呼ぶだけでよい。
0397ぴゅあ2006/11/03(金) 19:21:29
>>391
"うまく"というのか、"選択"?だろうけど

1.まずその付近全体のコードを整える
2.コード全体を眺めメソッド等に抽出できるものはないか挙げてみる

>whereSql = whereSql + "joken1 = ?";
なんて"StringBuffer使えよ"とか言われてしまいそうなところから
全体を書き替えてみると何か気付くこともあるのかも知れないし
(その前の部分のコードもあるのだろうけど、
そっちはベタでそのまま文字列になってるのかもだけど)

使い捨てでもなく、ちゃんと管理できると思えるなら
StringBuilderならぬSqlBuilderみたいな形に
作ってみたりもできそうだけど
(その前にその手のものなら探せばありそうな気も…
質問部分には答えてくれないかもだけど)
0398デフォルトの名無しさんNGNG?2BP(1)
>>390
読み込む中身はファイルの文章全体であることは同じなのですか?
0399デフォルトの名無しさん2006/11/03(金) 19:51:51
>>398
> 読み込む中身はファイルの文章全体であることは同じなのですか?
基本的に同じ。

BufferedReader の readLine() を使った場合だけ、
その行の終端にある改行文字が削除される。
0400ぴゅあ2006/11/03(金) 22:16:51
>>398
FileReaderとBufferedReaderを対等に並べて比較できるか…?
というのもありそうな気もしたりですけど

(ザックリ)
・ファイル → FileReader
や
・ファイル → FileReader → BufferedReader
は、あっても
・ファイル → BufferedReader
はないですよね?

或いは"ファイル → FileReader"の代わりに
・ソケット(InputStream) → InputStreamReader → BufferedReader
とか
(FileReaderはInputStreamReaderをファイルを扱うのに特化したもの)

FileReaderやInputStreamReaderの段階で取り出す場合と
BufferedReader(Reader + Buffer…StringBuffer的?)の段階で取り出す場合とで
それぞれの段階で取り出せる形がどう違うのかとか調べてみるといいのかも
或いはFileReaderとBufferedReaderとの間で区切って考えてみるとか

探せば、これらの流れを漫画にして解説してくれているのも多数ある筈です

たぶんそれらによって
>読み込む中身はファイルの文章全体であることは同じなのですか?
とかいう疑問は解消されるのかも?

或いはその上で>>399の話を読み直してみるとか
0401デフォルトの名無しさん2006/11/04(土) 00:08:46
ゲッターがない場合、privateな変数を外から取り出すのは絶対に無理なんでしょうか?
0402デフォルトの名無しさん2006/11/04(土) 00:16:03
リフレクション使えばどうとでもなるよ
Fieldそのものはprivateでも取り出せるから
あとは無理矢理アクセス権を作ってしまえばいい。
0403デフォルトの名無しさん2006/11/04(土) 00:24:52
>>402
ありがとうございます。リフレクションのこと調べてみます。
ゲッター書かないで保存してしまってすごく困ってました(´Д`;)ヾ
0404デフォルトの名無しさん2006/11/04(土) 00:29:45
jLabelにsetIconを使ってgif画像を貼り付けています。

アプリケーションを起動したときにはきちんと表示されるのですが、
他のウィンドウが重なったり、最小化させたあとに
もう一度そのウィンドウを開くと、
画像が表示されなくなってしまいます。

きちんと表示させるためには何が必要なのでしょうか?
よろしくお願いします。
0405デフォルトの名無しさん2006/11/04(土) 07:45:29
>>404
特に必要なことはないはずだけど。
ImageIconとかの既存のIconでなく自分で実装したIconで再描画に対応できない造りになっているとか。
状況を再現できる最小限のソースがあれば指摘できる人が増えると思う。
0406ぴゅあ2006/11/04(土) 11:44:35
>>404
>他のウィンドウが重なったり、最小化させたあとに
>もう一度そのウィンドウを開くと、
>画像が表示されなくなってしまいます。
と言われると、
(Javaとか関係なく)再描画ができていない…paint/repaint周りとかを
オーバーライドして何かやってる?(何か必要なことを落としている)
とかが浮かぶのですけど・・・

>jLabelにsetIconを使ってgif画像を貼り付けています。
だけなら、>>405の言っているように特にないだろうと思うけど
0407デフォルトの名無しさん2006/11/04(土) 12:51:44
>>404
>>405
レスありがとうございます。

jPanel -- jLabel1
-- jLabel2
という構造で、jLabel1に前述の画像表示、
jLabel2ではpaint周りをオーバーライドしています。
jLabel1の方にまでjLabel2のオーバーライドの影響が及ぶものなのでしょうか?

影響がなければ、javaでなくPC環境のせいなのかもしれないのですね。
0408デフォルトの名無しさん2006/11/04(土) 13:22:04
>>407
> jLabel2ではpaint周りをオーバーライドしています。
これの所為だな。
0409ぴゅあ2006/11/04(土) 14:12:31
>>407
>jLabel1の方にまでjLabel2のオーバーライドの影響が及ぶものなのでしょうか?
は、ないだろうと思ったりはしますけど
(jLabel1はJLabelそのものをそのまま使っているということだと解釈するけど)

JPanelとか、JPanelを乗せているものとか...(更に…)には
オーバーライドとかやっていることはないんでしょうか
>>405も言っている再現される最低限のソースが用意できるなら
判りやすいでしょうね
(jLabel1とかjLabel2とか、なんか話に微妙なもの?がありそうな気もしたりするし…)
0410デフォルトの名無しさん2006/11/04(土) 16:09:10
>>407
swingの場合は paintではなくpaintComponentをオーバーライドする。
public void paintComponent(Graphics g) {
super.paintComponent(g);
 //paintする処理を記述
}
0411デフォルトの名無しさん2006/11/04(土) 16:41:02
教材通りに書いたらエラーが出ました。教材のミスでしょうか?教材のHPを
見ても何も書いていなかったので私のミスかな・・
Truth.java:3: シンボルを解決できません。
シンボル: クラス string
場所 : Truth の クラス
string right = "正解",wrong = "不正解";
^
Truth.java:7: シンボルを解決できません。
シンボル: クラス string
場所 : Truth の クラス
string right = value ? right : wrong;
^
エラー 2 個

class Truth{
public static void main(String[] args){
string right = "正解",wrong = "不正解";
boolean value;

value = true;
string answer = value ? right : wrong;
System.out.println(answer);

value = false;

answer = value ? right : wrong;
System.out.println(answer);
}
}
0412デフォルトの名無しさん2006/11/04(土) 16:47:39
教材には小文字で"string"って書いてあるのか?
だとしたら、教材のミスだ。
04134112006/11/04(土) 17:13:09
>>412
すいません、Stringでした・・・

なぜ小文字だとエラーになるのですか・・・?
0414デフォルトの名無しさん2006/11/04(土) 17:43:40
言語仕様で、大文字小文字を識別するから

VBとかは識別しないから、このへんから来た人は注意ね
0415デフォルトの名無しさん2006/11/04(土) 18:15:03
>>345
>>346

>>343を書いたんだけど、確かにソースコード書けだけではなく、文書化されている
モノも示すべきだと痛感。実際Effective Java持っているし、Java SEのAPI,,Tomcatなど
ソースコードをみてStringクラスやクラスローダの仕組み勉強したので。。。

Effective Javaより初心者向きでは、「日経BP SunJava2認定ガイド」がお勧めだと思う。
Sunの資格取るための教科書だけど、Objectクラスを継承するノウハウやequalsメソッド
などを、一般的な入門書より深く書いてある。
0416デフォルトの名無しさん2006/11/04(土) 18:43:28
てかSJC-Pの参考書が一番まともな入門書なのはある意味当たり前。
だってそういう試験だしw
04174112006/11/04(土) 18:58:45
>>412
>>414

解決しました。ありがとうございました
0418デフォルトの名無しさん2006/11/04(土) 19:23:34
ファイルの読み込みについて、
下の例のようにBufferedReaderクラスのreadLineメソッドを使って行単位で読み込むというやり方がいろんなサイトで紹介されてますが、
ループを使わずにファイルの中身全部を一括して読み込むことってできないのでしょうか?
BufferedReader br = new BufferedReader(in);
StringBuilder s;
String line;
while ((line = br.readLine()) != null) {
s.append(line);
}

それともう一点。
下のようにStringオブジェクトの初期化の時に、文字列が長いと改行して +で連結する書き方をよくするのですが、
これって、コンパイル時に"abc・・・" + "xyz"は"abc・・・xyz"として最適化されるのでしょうか?
というのも、実行時に String型オブジェクト"abc・・・"と"xyz"が生成されて、String型オブジェクト"abc・・・xyz"を生成し直して、参照変数sにセットしているというような流れになっていないのかなっと思いまして。。
String s = "abc・・・"
+ "xyz";
0419デフォルトの名無しさん2006/11/04(土) 19:28:44
こんばんは。
ちょっとお伺いしたいのですが、JSPで、セッションでのパラメーターの受け渡しが上手くいきません。
教えてもらえないでしょうか。
このページから、
http://www.wikiroom.com/java/index.php?plugin=attach&pcmd=open&file=Customer.jsp&refer=JSP%20session
このページへ、受け渡しをしたいのです。現在だと、すべて、NULLが表示されます。
http://www.wikiroom.com/java/index.php?plugin=attach&pcmd=open&file=ShipSummary.jsp&refer=JSP%20session
よろしくお願いします。
0420ぴゅあ2006/11/04(土) 19:44:41
>>418
>ループを使わずにファイルの中身全部を一括して読み込むことってできないのでしょうか?
BufferedReader#readLine()のようにというところではないんだろうと思う
テキストファイルだとしても、何十MBとかあるファイルを一度に読み込んじゃあ大変だろうし
一度に読み込んでおかないとできない処理なんてのもそうそうないんじゃないでしょうか

いや、でも読み込みたいんだということであれば
InputStreamReader#read(...)とかで一気に読んでおくとかあるでしょうけど
ホントにそれでいいのか、よく検討してみた方がいいような気がする。。。

>下のようにStringオブジェクトの初期化の時に
よく知らないんですけど、
逆コンパイラではなくて逆アセンブラみたいなツール?があるらしいのですが
それで実際にどうコンパイル(最適化)されているのか見てみるといいんじゃないかと
(バージョンによってまた違うとかもあるでしょうけど、見ておくのは安心?なのかも)
0421デフォルトの名無しさん2006/11/04(土) 19:51:20
nio使えば出来るけど、文字列を取得するならBufferedReader使っとくのがいいよ。
Decoder#decodeって速くないから意味無いと気づく。
あえてnio使うなら改行表現を勝手に修正されたくない場合とかかな。
0422ぴゅあ2006/11/04(土) 19:58:04
>>419
JSPはずっと触ってないのであまり突っ込めないと思うけど
遷移先のページでsessionて出てきてる?
というような気がする・・・
0423デフォルトの名無しさん2006/11/04(土) 20:15:20
>>422
書き換えるの忘れてました。request.getAttributeってやってました。
なんて、馬鹿なんだろう。
ありがとうございました。
04244182006/11/04(土) 20:32:56
>>420 421
ありがとうございます。
htmlファイルを読み込んで正規表現かけて欲しい情報を一発で取得したいがために
一括読み込みを考えてました。nioというキーワードをいただいたので少し調べてみます。

>逆コンパイラではなくて逆アセンブラみたいなツール?があるらしいのですが
なるほどです。失念してました><
早速jadを使って逆コンパイルしてみたら、String s = "abc・・・xyz";に置き換わってました。
0425デフォルトの名無しさん2006/11/04(土) 20:44:30
WebサーバにはWebsphere、DBサーバにはSQLServerという構成でシステムが稼動しています。
質問させていただきたいのですが、DBサーバを再起動すると
Websphereが持っているDB接続情報(コネクションプール)が変わってしまい
Websphereの方も再起動しないとDBに接続できなくなってしまうのですが
これはそういうものなのでしょうか?
それとも設定をいじれば、Websphereまで再起動する必要はないのでしょうか?
Websphereまでも再起動するというのが嫌なので改善方法があれば教えてください。
0426ぴゅあ2006/11/04(土) 20:49:15
>>424
jadでもそこは見れるんですね
よくは知らないんですけど、アセンブラコード風のリストが
見れるようなものがあるらしいようでもあるのですけど
(もしかしたらString s = "abc";の"abc"がどう処理されているか
見えたりするのかな?とか思ってみたりするのですけど
そこまでは見えないのかな。。。)

>htmlファイルを読み込んで正規表現かけて欲しい情報を一発で取得したいがために
そんなに大きなファイルとなることもないんでしょうけど
読み込みつつ・・・なんて処理ができるといいんだろうと思いますけど
ただ、一気に読み込んでおくよりはめんどくさそうだという気はしますけどね
一度作れてしまえばその仕組みを色々活用できそうですけど
0427デフォルトの名無しさん2006/11/04(土) 20:56:45
javap
0428ぴゅあ2006/11/04(土) 21:02:35
>>425
昼頃見かけたあちらのスレッドからですよね

WebSphereも触らなくなって久しいですが
>DB接続情報(コネクションプール)
と言っているのがどの辺りを指しているのかよく判らなかったりしますけど
アプリということなら、作り方なのでしょうけど

"WebSphere コネクションプール DB 再起動"とかでググッてみると出てきそうですね
例えば以下のページとか?
http://www-1.ibm.com/support/docview.wss?uid=std3d370fa45fa339dc249257000002ad030
0429デフォルトの名無しさん2006/11/04(土) 21:03:03
>>425
XAデータソースを使っていたらそんなもん。
0430デフォルトの名無しさん2006/11/04(土) 21:04:38
ちょっと教えてください。
swingであるボタンを押すとラベルが表示するように作りました。
しかし、ボタンを押すとそのラベルガ表示されません。
右上のwindowの拡大を押すと、全体のwindowが拡大されたあとに
ちゃんと表示されるのです。しかし、最初から拡大して押しても表示されないし、
縮小したままでも表示されません。ボタンをおす、拡大するの順番でやっと表示されるんです。
これはどうしてですか?
0431ぴゅあ2006/11/04(土) 21:08:13
>>427
ありがとう

以前チラと使って、あれ?とか思ったのも
再度やってみたら判った。。。(汗)
0432ぴゅあ2006/11/04(土) 21:18:14
>>430
ラベルを表示する部分のコードを示してみるとかするのがいいのかも

最大化でなくても、他のウィンドウを重ねたりとかすると表示されたりしないでしょうか
ラベルが…と言っているけど、JLabel#setText()とか呼んでいたりしているんではなくて
或いはrepaint()とかrevalidate()とかが呼ばれないようなものになっているとか

最大化することによって再描画される状態になるのでやっと表示されるという状態が
起きていたりするんじゃないだろうかと思えたりですけど
0433デフォルトの名無しさん2006/11/04(土) 21:33:10
デフォルトアクセス(package private)なクラスの、 private でも protected でもないメソッドって、
public にするのと、 package private にするのと、どちらがいいんでしょうか?

クラスと同様に package private にしとくと、 package private な interface を作って実装したときに
そこだけ public にしなきゃならなくなって、 public と package private とが混在して違和感があります。

かといって全部 public にしておいても、 package 外からはアクセスできないんだし、やっぱり違和感があります。

jdkのソースとか見るとコンストラクタだけ package private にして、メソッドは全部 public ってのが
多いみたいだったので、現在はそうしてます。

元を正せば package private な interface のメソッドは暗黙的に package private なアクセスレベルで
あるべきと思うんですが。

みなさん、どのようにしていますか?
0434デフォルトの名無しさん2006/11/05(日) 00:02:10
リスト→配列変換で下記のようなコードを書いたのですが

ArrayList<Integer> a = new ArrayList<Integer>()
a.add(1);
a.add(2);

int[] b = new int[a.size()];

for(int i=0;i<a.size();i++){
b[i]=a.get(i);
}

これを、toArray()を用いて書くにはどうしたらいいのでしょうか?

Integerとintの変換がうまくいかずエラーがでてしまいます。
0435デフォルトの名無しさん2006/11/05(日) 00:07:55
toArray使ったらInteger配列だからプリミティブで欲しいってこと?
あなた自身の書いたそのコードがベストプラクティスに見えるけど。
0436デフォルトの名無しさん2006/11/05(日) 00:25:24
>>434にあるforを使わずに
Object[] toArray(Object[] a) という関数を用いて

b=a.toArray(new Integer[a.size()]);

のように1行で書けるならそっちのほうがよりよいのかなと思ったのですが、
Integer[] → int[] へのキャストがわからずエラーがでてしまいます。

>>434のようにforで書いた方がよさげですか?
0437デフォルトの名無しさん2006/11/05(日) 00:32:30
そう書いたんだけど、何で繰り返し質問されるんだろう
0438ぴゅあ2006/11/05(日) 00:40:05
>>434,>>436
>ArrayList<Integer> a = new ArrayList<Integer>();
からArrayList#toArray()で取れるのはInteger[]まで

a.get(i)はIntegerで取れているけど
>b[i]=a.get(i);
はアンボクシングが働いているので、正確にはb[i]=a.get(i).intValue();

get()までしか扱えないので
>Integer[] → int[] へのキャストがわからずエラーがでてしまいます。
という見方もできたりするでしょう
(正しくは(?)toArray()はArrayList<Integer>をInteger[]にするまでしかしないので)

commons Langまで持ち出して
Integer[] tmp = a.toArray(new Integer[a.size()]);
int[] b = ArrayUtils.toPrimitive(tmp);
とかも考えられなくはないでしょうけど
>>435の言ってることの方がいいだろうと思います
(2回配列を作ることになるし、余計なチェックコードとかも増えることにもなる@ArrayList#toArray(),ArrayUtils#toPrimitive()内)
0439デフォルトの名無しさん2006/11/05(日) 00:43:26
>>437-438
なるほど、無理にやろうとしても逆に大変になるんですね
とても参考になりました、ありがとうざいますっ
0440ぴゅあ2006/11/05(日) 00:43:48
>>437
そうは言われても、何か手があるんではないか?と思うからでしょう
ベストと言われるところがまだ納得できていないからだろうと思う
0441ぴゅあ2006/11/05(日) 01:28:35
>>439
余計だろうけど、補足してみるなら

>Integer[] tmp = a.toArray(new Integer[a.size()]);
>int[] b = ArrayUtils.toPrimitive(tmp);
としてみてもtoArray()の分が無駄

a.get(i)はArrayListの中身elementData[i]を返す

ArrayUtils#toPrimitive()のやっているのは>>434のforループそのもの
a.get(i)の代わりに(>>438を例に)tmp[i]という感じ

ArrayUtils#toPrimitive()に渡すためにa.toArray(new Integer[a.size()])を呼んでも
(System#arraycopy()を使ったりして高速に)ベタコピーしているだけで
a.get(i)でelementData[i]を見れば済むところをにわざわざtmp[]にコピーして使う分要らぬことを…
コード量は多そうに見えるが、forループにした方がシンプルということに

毎回書くのが嫌ならメソッドに切り出すとかクラスを作ってしまうとか
そのときにはArrayListっぽい命名にはなってなかったりするのでしょうけどね
0442デフォルトの名無しさん2006/11/05(日) 14:25:24
WinClose: http://sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=28599
WinCloseAdpt: http://sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=28600

上記の例を実際に動作させ、インターフェースとアダプタクラスを比較し、考察せよ。
という問題が出されたのですが、
インターフェイスは、そのインターフェイスに抽象的に定義されている
すべてのメソッドをオーバーライドする必要がある。アダプタクラスは必要な
メソッドだけをオーバーライドするように簡略化が図られた。
ということ以外に何か書けることはありますでしょうか?
0443デフォルトの名無しさん2006/11/05(日) 14:37:31
宿題はそれ用のスレがあるのでそこでやって下さい。
0444デフォルトの名無しさん2006/11/05(日) 14:49:55
>>442
たぶん、それで良いと思う。

後は、Frame を extends しつつインターフェイスを実装できるのに対して
Frame を extends しつつ、アダプタクラスも extends はできないので
別のクラスを作ってるという点が若干違うとか、そんぐらい。
0445デフォルトの名無しさん2006/11/05(日) 14:59:49
>>434で質問したものです。別のことでもう一つ教えて頂けないでしょうか。

例えば、2つの引数(配列)を持つあるメソッドを作りたいときに、
引数にint型でもlong型でも両方使えるようにするには

static void cal(int[] a,int[] b){
処理;
}
static void cal(int[] a,long[] b){
処理;
}
static void cal(long[] a,int[] b){
処理;
}
static void cal(long[] a,long[] b){
処理;
}

のように4つ書くのは異常に面倒だと思うのですが、なにかうまい書き方ないものでしょうか?
0446デフォルトの名無しさん2006/11/05(日) 15:09:39
static void cal(int[] a, int[] b){
cal(toLongArray(a), toLongArray(b));
}
static void cal(int[] a, long[] b){
cal(toLongArray(a), b);
}
static void cal(long[] a, int[] b){
cal(a, toLongArray(b));
}
static void cal(long[] a,long[] b){
処理;
}
0447デフォルトの名無しさん2006/11/05(日) 15:38:30
>445 Array#getLong。ただし実行効率上不利になることが予測される。
0448デフォルトの名無しさん2006/11/05(日) 15:51:07
>>446-447
なるほど、そうやって処理を一つにまとめればいいんですね
型変換による効率悪化 と 処理のコーディング楽さ どっちを取るかって感じですかね。

参考になりました、ありがとうございます。
0449デフォルトの名無しさん2006/11/05(日) 16:28:39
すいません、こちらでJavaScriptの質問をして良いのでしょうか・・・
0450デフォルトの名無しさん2006/11/05(日) 16:36:23
>>449
誘導っhttp://pc8.2ch.net/test/read.cgi/hp/1161422792/
0451デフォルトの名無しさん2006/11/05(日) 16:49:18
>>450さん
ありがとうございます〜
0452デフォルトの名無しさん2006/11/05(日) 16:57:02
g.dispose(); をぐぐったら
リソースを開放すると出たのですが

開放とはどういった意味なのでしょうか?
0453デフォルトの名無しさん2006/11/05(日) 17:02:17
内部に保持してるネイティブなリソースだね。
中身見たわけじゃないから何ともいえないけど
WindowsならHGCあたりを開放してんじゃないかな。
0454デフォルトの名無しさん2006/11/05(日) 17:03:35
>>452
gというオブジェクトが使っていたメモリその他の計算機資源を、
他のオブジェクト等で再利用できるようにするという意味。
その代わりdisposeするとgは使えなくなる。
0455デフォルトの名無しさん2006/11/05(日) 17:07:02
すいません、教えてください
フルスクリーン表示して大きさ固定するにはどうすればいいでしょうか

setExtendedState(MAXIMIZED_BOTH);
setResizable(false);
ってやるとフルスクリーン化は解けてしまうし、
getMaximizedBounds()やgetBounds()は何故か0が返されてしまいます
0456デフォルトの名無しさん2006/11/05(日) 17:20:33
>>455
やりたいことはフルスクリーン化でなく最大化かな
setResizable(false);
setVisible(true);
setExtendedState(MAXIMIZED_BOTH);
の順序でやってみると?
0457デフォルトの名無しさん2006/11/05(日) 17:23:28
要素の最大があらかじめ分かってる場合のHashMapの
初期値というのはどうするのが良いのでしょうか。
ArrayListなどと違って負荷係数とかあるので最適値というのが良く分かりません。
0458デフォルトの名無しさん2006/11/05(日) 17:25:20
KeyListenerの切り替えってどうすればよいでしょうか?
たとえば、状態AのときはAKeyListenerクラスを使って状態BのときはBKeyListenerクラスを使いたいんですが。

メインフレームでは
addKeyListener(new AKeyListener());
addKeyListener(new BKeyListener());
とやってますが状況に応じてどっちを使うか切り替えたいです。
0459デフォルトの名無しさん2006/11/05(日) 17:34:52
>>458
removeKeyListenerとaddKeyListenerで状況に応じて登録しなおすとか、
AKeyListenerとBKeyListenerの方で、それぞれ状態Aか状態Bのときにしか実際の処理をしないようにするとか。
0460デフォルトの名無しさん2006/11/05(日) 17:39:58
>>459
トン。removeKeyListenerを使う線で考えてみます。
0461ぴゅあ2006/11/05(日) 17:49:58
>>457
何も触らないのが最適値でもあるのかも?
何を基準に最適値を求めたいのか判らないですけど
APIリファレンスにはいちおよく読めば書かれていると思うけど

>>460
あちしは>>459の言う後者か
AKeyListenerなり(AKeyListenerのみ)で振り分けるとかの方が
いいんじゃないだろうかと思う
0462デフォルトの名無しさん2006/11/05(日) 18:15:36
>>461
その線も考えてみたんですが状態数が多くキー処理の数がものすごく多いのでなるべく分けておきたいなぁと。
AKeyListenerのメソッドがすごく長くなりそうなので。
↓みたいな感じにしてます。

public void setGameState(int gameState) {
// ゲーム状態を変更する
this.gameState = gameState;
// 現在のキーリスナーを削除
removeKeyListener(currentKeyListener);
// ゲーム状態に応じてキーリスナーをセット
switch (gameState) {
case GameState.TITLE :
addKeyListener(title);
currentKeyListener = title;
break;
case GameState.GAME :
addKeyListener(game);
currentKeyListener = game;
break;
case GameState.BATTLE :
// addKeyListener(battle);
// currentKeyListener = battle;
break;
}
}
0463デフォルトの名無しさん2006/11/05(日) 18:44:21
>>444, 454
ありがとうございます
0464デフォルトの名無しさん2006/11/05(日) 19:16:24
>>457
最適化の肝は実測にあるので、
与えるデータや初期値や負荷係数などのパラメータを実際に変えながら、
最適ポイントを求めてみるとか。
0465ぴゅあ2006/11/05(日) 23:01:42
>>462
>状態数が多くキー処理の数がものすごく多いのでなるべく分けておきたいなぁと。
いや別にリスナそのものは状態に応じた分岐までとかでもいいんじゃないでしょうか
(AKeyListener,BKeyListenerと分けたかったメソッドを用意して状態によってそれへの分岐だけとか)

その先は好きなだけ(機能もグループ分けしたりとかでメソッド分けするとか)どうにでもなるのでは?
そうすることでより見通しがよくなりそうに思えますけど

逆にadd/removeだと、状態が変わることとadd/removeのタイミングが保証できているかとか
疑問が出てきたりもするかも?
0466ぴゅあ2006/11/05(日) 23:05:39
追記…

なので、いずれにしても状態とリスナが呼び出されるタイミングに配慮する必要は
あるだろうと思う
(たぶん、ちゃんと考えてないと、"動きが怪しい"とか後で悩むことになりやすい部分だろうと思いますよ)
0467デフォルトの名無しさん2006/11/06(月) 03:06:52
>>457
capacity の 80% くらいデータが埋まると capacity の拡張が起こったはず。
正確な値はソースをみないとわからないが。
なのでその拡張が起こる直前で収まるような inital capacity を与えれば最適になる。
0468デフォルトの名無しさん2006/11/06(月) 03:11:17
ハッシュ値が重複するからきっちり容量取るのはgetが遅くならない?
■ このスレッドは過去ログ倉庫に格納されています