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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
過去ログ、関連スレッド、よくある質問とその回答、
質問をする前に、貴方が見なければならないサイトについての情報は、
下のwikiのページにまとめてあります。
http://www.wikiroom.com/java/

これからJavaでプログラミングを始めたいが、何をすればいいかわからない人も、
wikiからのリンクをおたどりください。

以下のエラーが表示されて、途方にくれているあなたは、下のページへ。
「コマンドまたはファイル名が違います」
「'javac' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
「Exception in thread "main" java.lang.NoClassDefFoundError: 」
http://www.wikiroom.com/java/?path%2Cclasspath

前スレッド
【初心者】Java質問・相談スレッド54【大歓迎】
http://pc5.2ch.net/test/read.cgi/tech/1096548618/

/* 既出の質問や、他に適切なスレが存在する質問は、容赦なく無視されます。
質問をする前にwikiで過去ログ、関連スレ、FAQをチェックしてください。 */

また、当スレで質問をするかたは、回答をもらえたときに、
wikiの更新をして頂ければ、忝なく存じます。

JavaScriptの質問は、ここでは受け付けていません。
Web製作板をご利用ください。http://pc5.2ch.net/hp/
0153デフォルトの名無しさんNGNG
>>149
GUIコンポーネント完全制覇という本によると
「AWTを知らずしてSwingなし」だそうです。
0154955こと...なんと名乗れば?NGNG
昨日はどうもありがとうございました。
先日のPGMにつきましては、Closeという事でお願いします。
これで指定した文字列を変えることで、欲しいレコードを抜けますので。
本当は、このレコードを編集しようかと思いましたが、入力レイアウトが保証
されている訳ではないので編集PGMは機能分割することとしました。
またご相談させていただくやもしれませんがその節はよろしくお願いいたします。
m(__)m
0155デフォルトの名無しさんNGNG
完璧なソースとやらを見せてくれ。
0156955こと...なんと名乗れば?NGNG
あ!!!
一つだけお伺いしたいことがありました。すみません!!m(__)m
今のPGMでは、"指定した文字列を部分検索してHitしたレコードを
出力"していますが、これを"指定した文字列を部分検索してHitしたレコードの
「Hitした文字列の先頭からレコードの終末まで出力する」ということはできるものなのでしょうか?
(指定した文字列の前にある文字列は意味がないので)
これくらいの編集はしたいです。
何卒よろしくお願いいたします。
0157デフォルトの名無しさんNGNG
>156
できるけど。
APIドキュメントのjava.lang.Stringの項を端から端までよーく読んで
ちっとは自分で考えてから聞きんさい。
0158デフォルトの名無しさんNGNG
setAcceleratorでメニューにショートカットキーをつけたんですが
一つの処理が終わるまでキーを受け付けないようにするにはどうすればいいですか?
アクションはAbstractActionでヤッテマス
0159デフォルトの名無しさんNGNG
>>158
AbstractAction#setEnabled(boolean)
かな、
俺は使ったことないけど
0160デフォルトの名無しさんNGNG
アクション開始でfalseにして終わりでtrueにしてみましたが駄目でした
0161955こと...なんと名乗れば?NGNG
>157
乏しいスキルから、
(1)条件に合ったレコードの長さを取得 length()
(2)条件に合ったレコードの先頭から終端まで、切り取り substringで。
いう手順でできました。
このコーディングで良いか悪いのかはまったくわかりません。
ありがとございました。
0162デフォルトの名無しさんNGNG
>>161
それ晒してみ?採点してくれる人がいるかもしれん。
0163デフォルトの名無しさんNGNG
>>160
ひょっとしてその処理って
Swingのイベント処理のスレッドで実行してる?

その処理を別スレッドでやるか、
setEnabled(false)した後で
SwingUtility.invokeLater()で実行すればいい気がする
0164デフォルトの名無しさんNGNG
>>161
晒すんだったら こっちでやってね
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1098287653
0165デフォルトの名無しさんNGNG
>>955
String#indexOf
0166144NGNG
>>150
インタフェースこそ、抽象クラスのメソッドだけ版、つまり特殊版だと思ってました。
重宝するときってどうやって使ってるんですか?

>>152
(´・ω・`)ショボーン

再び。
抽象クラスとかインタフェースはソースを読みやすくするもの
って理解でOK?
(他にも利点あるんでしょうが、1つの利点って意味で)
0167デフォルトの名無しさんNGNG
>>163
スレッドじゃないです
JMenuItemをActionに登録(?)して、そのメニューをsetAcceleratorしてます

0168955こと...なんと名乗れば?NGNG
さらしてみました。(´・ω・`)
0169デフォルトの名無しさんNGNG
前スレ最後のほうで「Swing コンポーネントのアイコンってどうやって取得してるの?」と質問したものです。
調べたら解決しましたので報告します。

SDK ディレクトリ /lib/dt.jar
というファイルの中に Swing コンポーネントのアイコンデータが入っています。
(AWT は入っていませんでした)

JAVA_HOME 環境変数から SDK の位置を取得すれば各自のアプリから使えると思われます。
0170デフォルトの名無しさんNGNG
質問です。
SwingのJDesktopPaneとJInternalFrameを使って、簡単なMDIを作ろうとしているのですが、
JInternalFrameを継承したクラスのコンストラクタ内で、内部フレームのサイズをsetSize(int,int)を使って変更したのに、
JDesktopのインスタンスにその内部フレームをaddして表示させてみると、そのサイズが反映されていません。
どのような原因が考えられるでしょうか?

ちなみに内部フレームのクラスのコンストラクタは以下の通りです。

public Workspace(){
super("untitled"+ ++count,true,true,true,true);
this.getContentPane().add(new JScrollPane(new JTextArea("")),"Center");
this.reshape(0,0,default_new_width,default_new_height);
this.setVisible(true);

}
0171170NGNG
訂正です

二行目
× setSize(int,int)
○ reshape(int,int,int,int)
0172デフォルトの名無しさんNGNG
>>170
setSize()でザイズ設定するのでなく、
setPreferredSize()にしてみてください。
0173159NGNG
>>158
その場合Swingによるイベントの処理はこうなる
1.ユーザがショートカットキーを押す
2.Actionが呼ばれて処理を始める
3.ユーザがまたショートカットキーを押す
4.2の処理がおわる
5.3の入力に対するActionの処理が始まる

なので2でsetEnabled(false)しても
4のところでsetEnabled(true)すれば
5の処理はそのまま行われる、と。

長い処理は別スレッドでやるべし。
0174デフォルトの名無しさんNGNG
PATHを設定したのでスタートメニューからコマンドプロンプトを開き、javacを実行すれば可能なのですが
ランチャーからコマンドプロンプトを開いた場合、javacを実行してもPATHを設定していないのと同じ、
「'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
が表示されます。
ランチャー側にコマンドプロンプトのexeファイルを直接入れても、スタートメニューのものと同じショートカットを入れてもダメでした。
直接Javaのことでは無いのでスレ違いかもしれませんが、よろしければ理由と解決法を教えてください。
0175デフォルトの名無しさんNGNG
>>173
それが4で2の処理が反映する前に次の処理が起きてる気がするんですけど
setEnabled(false)していればそれはないのでしょうか?

例えばCtrl+A一回押すごとにでボタンの色が赤→青→黄→赤(以下ループ)になるはずなのに
Ctrl+Aを長押しすると押してる間は色が変わらず、離した時に幾度も処理された結果が反映されると言う感じなのですが
これはスリープ(?)みたいなのをやればいいんでしょうか?
ボタンの色を変えた後にsetEnabled(true)をやればうまくいくかと思ったんですが変わりませんでした
0176デフォルトの名無しさんNGNG
やっぱ955ってプログラミング初心者だったか
こんなのが「それはASMをやってた頃の名残ですね」なんて偉そうに言うんじゃ
他のASM経験者が可哀想すぎる
0177デフォルトの名無しさんNGNG
>174
いずれにせよPATHの設定方法に問題があると思われ。
2k/XPなら[システム]-[詳細設定]-[環境変数]で設定。
9x/MeならC:\autoexec.batに記述。
(Meは何か設定用のユーティリティがあるんだよな……覚えてないが)
0178174NGNG
>>174
環境変数のトコで名前がPATH、値もbinフォルダに合わせました。
だからまぁ、普通にコマンドプロンプトを開けばできるのです。
ただランチャーから開くと…。
0179174NGNG
×>>174
○>>177
0180デフォルトの名無しさんNGNG
>178
そーなるとランチャのCreateProcessの使い方がおかしいのかも。
ランチャの乗り換えをお勧めする。
0181170NGNG
>>172
reshape()からsetPreferredSize()に替えて実行してみましたが、
やはりサイズの変更は反映されませんでした。
あと、手動で内部フレームのサイズを変更しようとしたのですが、それも反映されず、
サイズを変更しようとすると強制的に最大化されてしまいます。
0182144NGNG
抽象クラスやっと意味わかりました。(と思います)

抽象クラスX内に抽象メソッドget()を定義しておいて
AとBっていう2つの具象クラスにXクラスを継承させたときに、
A、Bのそれぞれの具象クラス内での実装方法によらず
A、Bのオブジェクトに対して
Xクラスのメソッド経由で使えるっていう利点があるんですよね?

書いててに日本語わけわからなくなったw
ひとまず答えてくれた人ありがとう。
0183デフォルトの名無しさんNGNG
>>182
それはabstractメソッドの説明だと思われ。
0184デフォルトの名無しさんNGNG
>>182
いい感じだ
0185デフォルトの名無しさんNGNG
>>182
抽象クラスっつーよりインターフェイスになってる罠
0186174NGNG
>>180
見た目だけで使ってるSKランチャーだから普通にそれありそうです。
となるとどうしようもないですね。ありがとうございました。
0187デフォルトの名無しさんNGNG
コンソールで[Enter]を押さずに、キーをタイプするごとに処理させたいんだけど
System.inでは対応できないようですが、どうしたらいいですか?
0188デフォルトの名無しさんNGNG
>>186
そのランチャーの作者に
スタートメニューから起動したときと環境変数が違うんですけど、ってバグレポートだせば?

乗り換えるのは良いとして。
0189デフォルトの名無しさんNGNG
>>182
まあそんな感じでいいと思う。
インタフェースと抽象クラスの使い分けはそのうち何となくわかってくるよ。
0190デフォルトの名無しさんNGNG
>>187
自分でテキストエリア作る
0191デフォルトの名無しさんNGNG
>>187
標準APIじゃ無理。
JNI で curses だったかをラップしてるライブラリとか使えばできるかも。
0192デフォルトの名無しさんNGNG
基本的すぎることかもしれませんが、
lengthとString#length()の違いはなんですか。
動作の違いなどを教えてください。
0193デフォルトの名無しさんNGNG
> lengthとString#length()の違いはなんですか。
length って何の length だ?
0194デフォルトの名無しさんNGNG
lengthは配列のフィールドだと思えばいい。
length()はメソッド。
0195デフォルトの名無しさんNGNG
>>194
配列の length はフィールドです。

http://www.y-adagio.com/public/standards/tr_javalang2/arrays.doc.html#64347
> 配列構成要素の数を含む,public finalなフィールドlength。(lengthは,正又は0であってもよい。)
0196192NGNG
>>193
>>194
レスありがとうございます。
String#lengthは文字列内の文字数をカウント、
lengthは配列のフィールド数をカウントする
というとこでOKですか?
0197192NGNG
>>196
ありがとうございました。
0198デフォルトの名無しさんNGNG
>>196
> String#lengthは文字列内の文字数をカウント、
合成文字やサロゲートペアがあるので String#length() は必ずしも文字数と一致しない。
char の数とは一致するけど。

> lengthは配列のフィールド数をカウントする
配列の要素数ね。
0199144NGNG
>>183-185>>189
ども。
ちょっとわかってきたってところです。
>>189さんの言うようになることを祈って勉強続けます。
0200187NGNG
>>190-191
標準APIにはないですか。了解
0201デフォルトの名無しさんNGNG
意味合いとしては
・インタフェース→それを実装したクラスが特定のメソッドを持つことを保証する
・抽象クラス→メソッドの具体的な内容は子クラスに任せる
てな感じか。
0202デフォルトの名無しさんNGNG
JavaでのO/Rマッピングを勉強したいと思ってるのですが、
EJBとかHibernate?とかあるみたいなんですが、
何がよさそうですか?
0203デフォルトの名無しさんNGNG
JavaじゃなくてJavascriptのほうで質問があります。
正規表現でRegExpを使用しているのですが
\が見つけるにはどのように行えばよいでしょうか?

var a = new RegExp("[#-&]|[\]");
↑だと\入ってた場合でも見つけれなくて・・・

すいません、誰か教えてください・・・
0204デフォルトの名無しさんNGNG
すいません1の下読んでませんでした・・・
吊ってきます
0205デフォルトの名無しさんNGNG
パーサのXercesを利用するためのjavaプログラムを作成しようと
しているのですが、プログラム内で、次の指定をすると、
import org.apache.xerces.parsers.DOMParser
「org.apache.xerces.parsers.DOMParseを解決できません」という
メッセージが出ます。

バージョンは、Xerces.2.5.0を使っております。
Xerces-J-bin.2.5.0を落として、下記のファイルを
クラスパスに追加したのですが他に必要な設定はありますでしょうか?
・xml-apis.jar
・xercesSamples.jar
・xercesImpl.jar

eclipseを使っているのですが、eclipseでライブラリの追加が
必要だと思っているのですが。。
0206デフォルトの名無しさんNGNG
classAが大きくなりすぎるのでclassBを呼んで処理してもらおうとしたのですが
classBでclassAの変数をうまく使えるにはどうすればいいですか?

staticでない変数をstaticコンテキストから参照することはできません。と
エラーがでるのです
static変数にはしたくなく、仮引数にするにもすこし多い量なんです。
newも値が変わるので駄目でした。
0207デフォルトの名無しさんNGNG
>>205
eclipse の使い方は Eclipse スレで聞いてくれ。

【Java/C/PHP/他】統合開発環境Eclipse M14
http://pc5.2ch.net/test/read.cgi/tech/1093787515/l50
0208デフォルトの名無しさんNGNG
>>206
とりあえず getter 定義して使え、でいいのかな?
0209デフォルトの名無しさんNGNG
>>206
無茶言わず引数にしろ。
素で引き渡すのが嫌ならそれ用のBeanでも作れ。
0210デフォルトの名無しさんNGNG
なぜにBean・・・w
普通に構造体みたいにクラスでも作ればいいと思うのだが・・・
0211デフォルトの名無しさんNGNG
>>210
釣れますか?
0212デフォルトの名無しさんNGNG
>>206
1000行くらいあるなら200行くらいに分けて階層構造にでもしろ
0213デフォルトの名無しさんNGNG
どんなクラスなのか見てみたい。
0214デフォルトの名無しさんNGNG
>>206
・多かろうが何だろうが引数にして全部渡す
・Mapか何かにでも突っ込む
・専用のBean作る
・アクセサメソッド作って自分自身を引数に渡す
・氏ね
0215デフォルトの名無しさんNGNG
>>206
>>214の最後のコメントは気にするな。強く生きろ。
0216デフォルトの名無しさんNGNG
強く氏ね
0217206NGNG
>>213
classAから新しいウィンドウとしてclassBを作って
classBで起こった結果をclassAに反映させたいのです。
引数にして代入しなおせばいいんですが、何かいい方法ないかと質問しました。

Beanっての分からないので調べてきます・・・
0218デフォルトの名無しさんNGNG
強く生きれば強く氏ねる
0219デフォルトの名無しさんNGNG
時計の針を、1秒ごとにチックタックではなくなめらかに動かしたい場合、
どうすればいいのでしょうか?
今は針描画専用の内部クラス(Threadを継承)を定義し、
public void run(){
 while(ture){ 針描画処理 }
}
というふうにrun()を実装して
そのインスタンスのstart()を呼んでいるのですが、
CPU使用率が常に100%になってしまいます。
動作そのものは期待どうりなんですが・・・。
0220デフォルトの名無しさんNGNG
>>206
お前全然わかってないじゃんかよ。
ちゃんと勉強してないからそうなる。
多分人のソースをコピペだけして来たんだろう。
newも値が変わるので駄目でした。だって。
勉強して一週間目の奴が言うような内容だな。
本とか読んでもインスタンスの話なんか最初の方に出てくるだろうが。
0221デフォルトの名無しさんNGNG
>>219
今は針描画専用の内部クラス(Threadを継承)を定義し、
public void run(){
 while(ture){ 針描画処理 }
}
というふうにrun()を実装して
そのインスタンスのstart()を呼べばいいと思うよ。
0222デフォルトの名無しさんNGNG
>>217
>>206と書いてることが違うじゃないか
0223デフォルトの名無しさんNGNG
Timerでも使えば
0224デフォルトの名無しさんNGNG
>>219
1/30秒ずつくらいの処理にすればいいんじゃない?
0225デフォルトの名無しさんNGNG
>>219
たぶん秒でとってるでしょ
ミリ秒も取ってきて適当に処理

それとsleepもいれて
0226デフォルトの名無しさんNGNG
Timerクラスは使ったことありませんでした。
Timerクラスやsleepメソッドで針描画処理の頻度を落とせる、ということですね。
試してみます。ありがとうございました
0227デフォルトの名無しさんNGNG
NTPサーバと通信して時刻合わせをするようなものを書きたいと思ってるのですが、
Javaにシステムの時刻をセットするようなメソッドorライブラリみたいなのは無いでしょうか。
SystemクラスやJakarta Commonsあたりを探ったり、ググってみたりしてもいまいち見つからず…。
0228デフォルトの名無しさんNGNG
Javaでシステム時刻設定なんてできるのかな?

Windowsだと
Runtime.getRuntime().exec("time 22:30:59.99");
とかしてtimeコマンドを実行するとかすればできるかも
0229227NGNG
今作ってるのが、Windowsでの動作前提プログラム(JNI使ってたりするんで)なので、>>228さんの方法が簡単っちゃー簡単ですが
一応、勉強も兼ねてPure Javaでなんとかならないかなーと思っていました。

とりあえず、今のところは>>228さんので実装してみます。
ありがとうございました。
0230デフォルトの名無しさんNGNG
すいません、JTableのコンポーネントのサイズを大きくしたいのですが
JTable tb = new JTable(5,5);
tb.setSize(500,500);
tb.repaint();
などやっても変わりません、なぜでしょうか?
また、表示する文字列によって列幅を変えたいのですが、情報が見つかりません、
レンダーをいじくるらしいのですが、さっぱりです。
どなたか教えてください。ちなみに、GUIはほとんどいじった事ありません。
よろしくおねがいします。
0231デフォルトの名無しさんNGNG
>>228
それいいな。
0232デフォルトの名無しさんNGNG
>>230
Swingというかレイアウトマネージャ勉強したら?
0233デフォルトの名無しさんNGNG
>>230
志村!レイアウト!レイアウト!
0234デフォルトの名無しさんNGNG
Javaで、一番下に出る棒のようなスペース、俗にいうステイタスバーは実現
できるんでしょうか?そういうコンポーネントはないようなのですが。
どなたか、よろしくです。
0235デフォルトの名無しさんNGNG
>>230
> また、表示する文字列によって列幅を変えたいのですが、情報が見つかりません、
TableColumn column = table.getColumnModel().getColumn(columnIndex);
とかして
column.setPreferredWidth(好きな幅);
とかでサイズ指定すれば出来るかも。
0236デフォルトの名無しさんNGNG
>>234
うむ。V2Cとソフトでは実現しとる。
「V2C」でググッて起動してみろ。びびるぞ。
どうやってやるかは知らん。
>>230
setPreferredSizeあたりをいじれば大概なんでもできる。
0237デフォルトの名無しさんNGNG
>>234
ステータスバーは JPanel とか、
必要なら好きな javax.swing.border.Border の実装クラスとかを使って
比較的簡単に実現できるが、
Swing には JStatusBar みたいなコンポーネントは無かったような。
0238デフォルトの名無しさんNGNG
>>236
漏れ、このコメントV2Cで見てまつ。
2chビューアの中で一番しっくり来たのがコレ。
GUIの勉強にもなる。デコンパイルしてソース見ろとまでは言わないが、
Swingの表現力とパフォーマンスについて認識を改めた一品。
>>234
BorderLayoutのSouthにステータスバーにしたいコンポーネントをはっつければOKでしょ。
0239デフォルトの名無しさんNGNG
デコンパイルってどうやるの?
0240デフォルトの名無しさんNGNG
java decompiler とかでぐぐるとデコンパイラが見つかると思うから、それ使えば?
0241デフォルトの名無しさんNGNG
>>239
jadが有名、GUIのフロントエンドもいくつかある
Eclipseを使ってるのならjadを使うプラグインがある

これだけ情報あれば検索で見つけられるはずからがんばれ
0242デフォルトの名無しさんNGNG
 なんか、ちょっと前の本とかSwingでマックのルックアンドフィールとか使ってたりする
んだけど、今、はそのクラス自体ないようなのです。
 J2SDK1.4.0とかでもできるの?
 
0243デフォルトの名無しさんNGNG
>>236
>>237
>>238
どもです。早速やってみます
0244デフォルトの名無しさんNGNG
JavaScriptでWebページ内のFormの値を取得して、それをアプレット
に渡して、アプレットからファイル出力させるにはどうすればいいの?
いろいろ試したけど、JavaScriptかアプレットどちらかのセキュリティ権限に
引っかかって、うまくいきませんでした。無理って事?
0245デフォルトの名無しさんNGNG
クライアント側にファイル出力するのは基本的に無理。
0246デフォルトの名無しさんNGNG
>>240-241
jadプラグインでぐぐってきます。ども。
0247デフォルトの名無しさんNGNG
JFrameクラスで
setResizableを下方向のみ許可することはできますか?
0248デフォルトの名無しさんNGNG
http://ex7.2ch.net/test/read.cgi/base/1098460250/97
0249デフォルトの名無しさんNGNG
setTextメソッドで("<html>a<br>b<br>c") と指定した場合

JTextAreaクラスなら文字列がそのまま表示されるけど
JLabelクラスならhtmlで解釈されるから改行されますよね

他にJavaでhtmlを使ってテーブルを表示する方法ってありませんか?
0250デフォルトの名無しさんNGNG
>>249
PrintWriter
0251デフォルトの名無しさんNGNG
>>249
JEditPaneとJTextPane
0252r ◆r/etvCKR2A NGNG
StringTokenizerとか、String#splitとか
文字列を分割するための道具が、Javaには幾つか準備されているようですが、
エスケープが扱える物って、なんかあるでしょうか。

たとえば
1. 文字列を空白文字で区切る
2. 空白文字が連続した時は、一個の空白であると見なす
3. 大文字は小文字に変換する
4. 連続した空白、大文字を表現したい時は、"で囲む
5. "自体を表現する時は\でエスケープする
6. \自体を表現する時は\でエスケープする

などというルールを実装するには、普通どうやるのだろう。

とりあえず、一文字ずつ、状態遷移しながらパースするコードを書いてみますた。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1076074304_21/Parse.java
ルールが変わるたびに、マルコフ的な状態遷移を考えて、
新しくたくさんのコードを書いて...ってのが激めんどくさいので、
どうにか簡単に表現できると嬉しいんだが。
みなさんどうやってるのです?
■ このスレッドは過去ログ倉庫に格納されています