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

Java低速GUI Swing 5

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/10/18(水) 11:50:09
ハードウェアの高スペック化、JavaVMのホットスポットの高速化に伴い、
パフォーマンスの問題は徐々にですが改善されつつあります。
しかしながら、"Java"というだけで未だに敬遠されるのが現状。
そんなSwingと引き続き付き合っていくみんなのスレッドです。

Java低速GUI Swing 4 (前スレ)
http://pc8.2ch.net/test/read.cgi/tech/1140533866/
Java低速GUI Swing 3
http://pc8.2ch.net/test/read.cgi/tech/1121700954/
Java低速GUI Swing 2
http://pc8.2ch.net/test/read.cgi/tech/1095398949/
Java低速GUI Swing
http://pc5.2ch.net/test/read.cgi/tech/1062271447/l50
0793デフォルトの名無しさん2007/08/25(土) 15:43:42
読んで字の如くの例外ですね。
もう少し具体的にソースなど挙げないとなんとも言えません。
0794デフォルトの名無しさん2007/08/25(土) 15:44:46
java.lang.ClassCastException: javax.swing.JComboBox cannot be cast to java.awt.Button
0795デフォルトの名無しさん2007/08/25(土) 15:45:27
インスタンスチェックしてないんだろ
0796デフォルトの名無しさん2007/08/25(土) 15:50:20
インスタンスチェックってなんですか?
0797デフォルトの名無しさん2007/08/25(土) 15:54:49
自分が作った GUI とかいうクラスの actionPerformed メソッドの中で Button じゃないものを Button にキャストしてるんだろ
コードさらしてみろ
0798デフォルトの名無しさん2007/08/25(土) 19:08:09
JTreeのノードのコピペを、右クリックポップアップメニューの操作でやろうと思ったんだが。
ポップアップメニューをクリックした時に、TransferHandlerへ
Ctrl+C、Ctrl+Vの時と同じ通知をしてやりたいんだが、どうやってやればいいんだ?
0799デフォルトの名無しさん2007/08/25(土) 21:45:10
>>798
TransferHandlerのjavadoc読んで分からんなら諦めろ。お前には無理だ。
0800デフォルトの名無しさん2007/08/25(土) 22:14:34
各拡張子に関連付けられたアイコンを取得する方法ってあるかい?
0801デフォルトの名無しさん2007/08/25(土) 22:48:39
あるけど、ドキュメント化されてたっけ?
0802デフォルトの名無しさん2007/08/25(土) 22:58:36
FileSystemView#getSystemIcon とかかな
0803デフォルトの名無しさん2007/08/25(土) 23:41:46
>>802
おう、取得できたぜ!

だがしかし、小さいアイコンが取れた。
大きいアイコン取れるようにがんばってみるぜ
0804デフォルトの名無しさん2007/08/25(土) 23:59:25
>>803
Swing だけじゃ、大きいアイコンは取れなかったはず。
大きいアイコン取りたい場合は JDIC、jconfig みたいなライブラリ使うか、JNI かな。

sun.awt.shell.ShellFolder 使えば取れるかもしれんけど、内部ライブラリだから、
メソッドが変更されたり無くなったり、クラスそのものが無くなったりしても文句言えない。
0805デフォルトの名無しさん2007/08/26(日) 00:02:56
>>804
マジッスカー

チューザーが使うアイコンって言葉にちょっと引っかかってたんすけどね。
ほな、今は諦めて別の作業しまっすー
0806デフォルトの名無しさん2007/08/26(日) 02:05:59
>>799
javadoc読んで分からんかったけど、Tutorialにサンプルプログラムあったのね。
親切にありがとう。
0807デフォルトの名無しさん2007/08/26(日) 06:46:54
テキストを縦書きに出力するにはどうしたらいいのですか?
08088072007/08/26(日) 06:49:13
追加
paintComponentの内部でのGraphicsのインスタンスを使ってテキストを縦書きに描画したいんです。
普通のdrawStringだと横書きになってしまいます。
0809デフォルトの名無しさん2007/08/26(日) 08:09:30
>>807
Swing だと自前でやるしかない。
java.awt.Component#setComponentOrientation(ComponentOrientation)
java.awt.ComponentOrientation#isHorizontal()
ってのが使えそうなんだけど、これ縦書き用のインスタンス持ってないから。

OSが縦書き用フォント持ってれば
縦書き用フォントから字形ひっぱってきて 90度回転させて表示するとか、
もしくは横書き用フォントから字形ひっぱってきて
英数文字や鍵括弧のように90度回転させるか
日本語のように縦書きするか決めてながら、自前で再配置するとかしないとダメ。

フォントから字形を引っ張ってくるには
java.awt.Font#createGlyphVector
java.awt.font.GlyphVector#getOutline

回転させるには
java.awt.geom.AffineTransform#getRotateInstance
java.awt.geom.AffineTransform#getTransformedShape
あたり使え。

AttributedCharacterIterator とかの書式付きでやりたいなら
GlyphVector の代わりに TextLayout 使うと便利。
0810デフォルトの名無しさん2007/08/26(日) 09:50:11
描画前にJava2Dで文字を90度回せばいいだけ。
んであとは位置指定して文字描画。
0811デフォルトの名無しさん2007/08/26(日) 10:48:04
皆、頭を横にして読んでるんだ
0812デフォルトの名無しさん2007/08/26(日) 10:58:37
>>809
Windowsの @MS ゴシック みたいな VHEA とか VMTX とか見て作ってるフォントは
VHEA とか VMTX 無視する Java の、っつーか Sun の JRE が持ってるフォントレンダラでは
扱えないんじゃなかったっけ?

縦書きって専用フォントじゃないとカギカッコとか句読点とか再配置面倒なんだよね。
08138072007/08/26(日) 15:00:03
>>809
どうもありがとうございます。
しかし自前でやるしかないんですか。大変そうですね。
0814デフォルトの名無しさん2007/08/26(日) 22:27:10
swingの話題とは違うっすけど、windowsのデスクトップのpathを取得する方法を教えてほしいっす。
0815デフォルトの名無しさん2007/08/26(日) 22:38:23
環境変数からとる方法↓は思いつくけど、スペシャルフォルダ指定でとるのが筋だろうなぁ
System.getenv("USERPROFILE") + "\\デスクトップ"
0816デフォルトの名無しさん2007/08/26(日) 22:49:31
WSH使ったほうがいいだろうね
0817デフォルトの名無しさん2007/08/26(日) 22:56:01
>>815
それで無理やり作れるっすねぇ

>>816
WSHっすか
0818デフォルトの名無しさん2007/08/30(木) 22:08:25
JAVAでよう、フルスクリーンにするのにsetUndecoratedを使おうと思ったんだけどよう

これって、すでに動いてるフレームには使えねえのな。

なんか、動的にやっちゃう方法はないのか
0819デフォルトの名無しさん2007/08/30(木) 23:09:39
Javaでフルスクリーン・・・

これか?
http://java.sun.com/docs/books/tutorial/extra/fullscreen/index.html
0820デフォルトの名無しさん2007/08/30(木) 23:36:17
>>818
フルスクリーン用にフレームを作って元のフレームの中身を入れる…とか?
0821デフォルトの名無しさん2007/08/30(木) 23:49:18
>>819
いんや、そこまで本格的じゃないの。

コンテンツ領域をダブルクリックしたら、窓枠とタイトルバーのないウィンドウを最大化で表示する感じ

>>820
コンストラクタに元のフレームを突っ込んで、中で変数をわっしょいわっしょいしてやったぜ

次のJAVAでは動的なフルスクリーンとかサポートされるといいなぁ
0822デフォルトの名無しさん2007/08/31(金) 00:06:41
枠消しは確かisDisplayable()がfalseを返す必要があって
setVisible(false)とdispose()の後で設定し、setVisible(true)にする感じだったかと。
昔試した記憶なんで定かではないが
0823デフォルトの名無しさん2007/08/31(金) 00:27:44
dispose → setUndecorated → setVisible で出来たよ
0824デフォルトの名無しさん2007/08/31(金) 01:24:48
>>823
それって質問者の解決になってないんじゃない?
動いているものってのがリソースの破棄を示すとはおもえんし

とはいえ>>821のコンストラクタでというのはナンセンスすぎ
モデルと分離するのがよかろう
0825デフォルトの名無しさん2007/08/31(金) 04:22:19
>>821の場合、カスタムWindowクラスをスクリーンサイズいっぱいに広げればいいんじゃない?Frameじゃなくて。
0826デフォルトの名無しさん2007/08/31(金) 11:58:54
通常フルスクリーン化したい場合ってのは解像度を固定化させたいとか
フィルレート稼ぐためとかだな
0827デフォルトの名無しさん2007/08/31(金) 12:02:49
javaでもアクセラレータさえ効けばフルスクリーンとかでハードウェア支援受けれるんだが・・・バグがorz
0828デフォルトの名無しさん2007/08/31(金) 12:26:11
DirectXならアクセラレーションきいてるよ
ほんの一部のblitとかしかきかないけど
0829デフォルトの名無しさん2007/08/31(金) 12:27:33
あと、ページフリッピングもちゃんと動く

逆にJOGLだとフルスクリーン時問題がでることがある
0830デフォルトの名無しさん2007/08/31(金) 13:04:15
>>829
kwsk

JOGLフルスクリーンにできないの?
0831デフォルトの名無しさん2007/08/31(金) 13:28:59
>>830
やってみればすぐわかる
解像度変更しなくてもフルスクリーン化しただけでダメだよ
GLJPanelのほうならいくけど遅くて実用性ないし
0832デフォルトの名無しさん2007/08/31(金) 16:52:07
あのバグ、Swingと同じでVGAのドライバ由来のバグじゃなかったっけ?
あと、JOGLはドライバによっては実行中に突然コケる。
そういうドライバは大体、ライダーに変身しそうな勢いでファンが回り続けるけど・・・。
0833デフォルトの名無しさん2007/08/31(金) 19:58:15
>>826
ただたんに画面いっぱいに表示したいだけだからエセフルスクリーンでいいんだな

>>824
おう、そうすりゃちょっと気分もコードもスッキリするな
0834デフォルトの名無しさん2007/08/31(金) 20:52:05
>>833
なら5だったか6だったかで新しく実装された常に手前で表示とフレームなしのウインドウの最大化で事足りる
それをやらないとタスクバーの手前にこない
0835デフォルトの名無しさん2007/08/31(金) 22:45:12
871 名前:デフォルトの名無しさん[sage] 投稿日:2007/08/31(金) 22:44:21
>>823
できたー

お前すげえ

ちょっと誤爆してきた
0836デフォルトの名無しさん2007/09/01(土) 00:30:07
というか常識だろ・・・
disposeでリソース破棄が必要ってのは
0837デフォルトの名無しさん2007/09/01(土) 02:11:16
>>831
やってみた・・・なんかだめっぽいね
残念
0838デフォルトの名無しさん2007/09/01(土) 23:05:12
widgetのfocusを外して、他のwindowにfocusを移すには
どうやればいいの?
0839デフォルトの名無しさん2007/09/02(日) 00:47:51
そういやJOGL1.0から1.1へ差し替えたら全てテクスチャが上下さかさまになっちまった・・・
それ以外の描画自体はすべてそのまま動いてるっぽいがなんだこの現象は・・・
0840デフォルトの名無しさん2007/09/02(日) 02:11:11
1.0 使ったことないからなんのことかよくわからんが、
OpenGL のテクスチャは左下が原点だってことと関係ありそう?
0841デフォルトの名無しさん2007/09/02(日) 10:48:46
いや、1.0までは左下を0,0にしてたんだがそれだと1.1で上下逆さまになる
0842デフォルトの名無しさん2007/09/04(火) 20:09:54
お前らJFrameを最大化する方法しってますか?

画面のサイズを取得して、setBoundsで広げてみたけど、これは俺の知ってる最大化とちと違う。
最大化ボタンを押した時の挙動を実現する方法を教えてくだせぇ
0843デフォルトの名無しさん2007/09/04(火) 20:15:26
>>842
java.awt.Frame#setExtendedState(int)
0844デフォルトの名無しさん2007/09/04(火) 20:26:40
早いな!

...先生!

最大化したあとでノーマルに戻すと、サイズがでかいままです!
0845デフォルトの名無しさん2007/09/04(火) 20:29:19
いるよな。先生先生っていえば、自分で調べないでも勝手に働いてくれると思ってる奴。
0846デフォルトの名無しさん2007/09/04(火) 20:30:22
>>844
ノーマルサイズの状態にせずに、
いきなり最大化状態で表示すると、そうなったりする。
0847デフォルトの名無しさん2007/09/04(火) 20:30:33
ほんとほんと。

getPreferredSizeとsetPreferredSizeを使ってみたらどうかね
0848デフォルトの名無しさん2007/09/04(火) 22:28:30
>>814
今更ながら自己レス

FileSystemView fs = FileSystemView.getFileSystemView();
File[] roots = fs.getRoots();

これでデスクトップ取って来れたよ
0849デフォルトの名無しさん2007/09/05(水) 00:07:49
Windows限定ならそれでOK
メソッド名とあわんけどな
0850デフォルトの名無しさん2007/09/05(水) 00:16:32
FileSystemViewはJavaDocに直感的にうんたらって書いてあるのに
メソッド名と処理が全然直感的じゃないことに脱帽する。
0851デフォルトの名無しさん2007/09/05(水) 00:38:26
>>849
デスクトップを取得したかった理由は、エクスプローラみたいなツリーを作りたかったからなんで、
今回はokです。

デスクトップ取得して、そこから展開してったらサクっとエクスプローラみたいになってびっくり。

ウィン以外だとどんな動作になるのやら。
0852デフォルトの名無しさん2007/09/05(水) 00:51:47
>>851
名前のとおりの動作になる
ファイルシステムのルート
説明によるとDOSだとドライブ番号らしい

でもデスクトップってユーザーごとに違うからそこがファイルシステムルートってのもピンと来ないんだよなぁ
0853デフォルトの名無しさん2007/09/05(水) 22:21:28
JListで縦横にアイコンが並んでる状態で、カーソルキーをおしっぱなしにすると
左右の端っこでカーソル?が止まるべ。

右端で右を押したら、一段下の左端にカーソルもってこうとしてこんなん書いてみた。

protected void keyPresse(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_RIGHT:
int index = getLeadSelectionIndex();
int width = getWidth() / getFixedCellWidth();
if (index % width == width - 1) {
getSelectionModel().setLeadSelectionIndex(index + 1);
}
以下略

だがしかし、これだと左端の一つ右にカーソルがいくっす。
どうしたら、左端にきっちり止まるかな?
0854デフォルトの名無しさん2007/09/05(水) 22:28:30
よーわからんが、
左端に移った後で右へ移動の処理が呼ばれてるんじゃね?
e.consume()とかしたら伝搬せずに済むかも。
0855デフォルトの名無しさん2007/09/05(水) 22:48:00
>>854
なるほどっす、ありがとっす

if ((e.getModifiersEx() & InputEvent.SHIFT_DOWN_MASK) != 0) {
getSelectionModel().setLeadSelectionIndex(index + 1);
} else {
setSelectedIndex(index + 1);
}
e.consume();

シフトキー押してなくても右端と左端を選択するようになったから、
e.consume();の前にif文かましてみたっす。
0856デフォルトの名無しさん2007/09/05(水) 22:58:03
>>853は状況をちゃんとかけと
0857デフォルトの名無しさん2007/09/05(水) 23:05:35
右端でなければ同行の1つ右へ、
右端だったら次行の1つめへ、
というActionを定義して、
ActionMapに名前を付けて登録。
InputMapの右キーのトコにその名前を登録。
と処理するのが正当かもしれんね。

0858デフォルトの名無しさん2007/09/11(火) 01:51:36
Desktop.getDesktop().open(file)

これで関連付けでファイルを開けるんだが、ディレクトリを2、3個開くとVMが落ちる。
画像は平気。

今後に期待ってところかね
08598582007/09/11(火) 02:07:36
OSはウィンドウズXP、関連付けは標準のツリービューがつかないエクスプローラっす
0860デフォルトの名無しさん2007/09/11(火) 02:32:56
問題はSwingと関係ないことだな
0861デフォルトの名無しさん2007/09/11(火) 04:35:39
そういえばAWTスレないよね
0862デフォルトの名無しさん2007/09/11(火) 07:08:01
JLabelのテキストとしてHTML形式でリンクを指定すると
リンクっぽく表示されるけどクリックできません。

リンクを開くにはどのようにすればいいのでしょうか?
0863デフォルトの名無しさん2007/09/11(火) 08:33:29
>>862
JLabel に MouseListener つけて mouseClicked を検地して自前で処理する。
ハイパーリンクのクリックイベントを捕らえられるのって、JEditorPane
だけじゃないかな。
0864デフォルトの名無しさん2007/09/11(火) 13:02:58
>>860
問題はSwingの話題がないことだろう
0865デフォルトの名無しさん2007/09/11(火) 13:04:13
bindingが正式になったようじゃの
0866デフォルトの名無しさん2007/09/11(火) 13:06:27
>>862
SwingのHTMLは表示させるためだけのものってどこかに書いてあったようななかったような…
0867デフォルトの名無しさん2007/09/11(火) 13:24:35
どこだったか忘れたが確かにあったな。
0868デフォルトの名無しさん2007/09/11(火) 14:27:26
>>858
Desktop desktop = Desktop.getDesktop();
desktop.open(new File("C:\\"));
desktop.open(new File("C:\\WINDOWS"));
desktop.open(new File("C:\\WINDOWS\\system32"));
desktop.open(new File("C:\\Documents and Settings"));

で、4個開いてみたけどVM落ちない。再現条件が違うんじゃね?
0869デフォルトの名無しさん2007/09/11(火) 17:08:28
Look&Feelを変更しようと思うんだけど、SwingのJFileChooserに適用する方法が分かりません。
どなたかご教示ねがいます。
0870デフォルトの名無しさん2007/09/11(火) 17:36:20
変更しようと思うだけじゃなくて実際に変更してみれば、それがJFileChooserにも適用される。
それともJFileChooserだけを変更したいっていう話?
0871デフォルトの名無しさん2007/09/11(火) 17:39:41
>>870
UIManagerのsetを呼び出す場所が間違ってました。
ごめんなさい(m´・ω・`)m ゴメン…
0872デフォルトの名無しさん2007/09/12(水) 01:19:58
初心者です。JAVAの学習の為にSwingでカレンダーを作っています。
ボタンを押す毎に月の変数を増減させ、その変数の値を見て31日を追加したり削除したりさせたいのですが、
removeが動作してくれません。大まかに書くと下記のような感じなのですが↓

public void actionPerformed(ActionEvent e){

month++;
if(month == 9){
  panel1.add(day31);
}
else if(month == 10){
  panel1.remove(day31);
}
else if(month == 11){
  panel1.add(day31);
}

}

上記の「day31」が削除されません。
変数の値は間違い無く条件式に対し真を返す値である事は確認しています。
何故か、30日を示す「day30」が存在しないと、削除に成功します。
色々試しましたが解決策が見つかりませんでした。そこが悪いのでしょうか?
08738722007/09/12(水) 01:30:18
訂正
×そこが悪いのでしょうか
○どこが悪いのでしょうか

解決策が見つからない事は確かに悪いのですが・・・
0874デフォルトの名無しさん2007/09/12(水) 09:22:09
>>872
レイアウトを使用しているなら、コンポーネントの追加と削除をした場合
にはrevalidate()なりを呼び出さないといけない。
そういう手間がいやなら、day31.setVisible(false)とかで表示上消して
しまえばいい。いちいちコンテナに追加したり削除したりすると後が面倒。
たとえば7月から8月にした場合とか、両方とも31日ある月とか
30日以下の月が連続した場合に面倒だろ?
ところで9月は30日なんだが、
if(month == 9){
  panel1.add(day31);
}
この判定はいったいなんだ?
0875デフォルトの名無しさん2007/09/12(水) 09:49:16
>>874
月の範囲が0−11
08768742007/09/12(水) 09:52:20
>>875
了解。1〜7月の判定がなかったんで混乱した。
0877デフォルトの名無しさん2007/09/12(水) 11:09:15
今更だけど、月が 0 始まりなのって嫌がらせだよな。
Java がどうとかじゃなくて、もっと昔からの慣習なんだろうけど。
0878デフォルトの名無しさん2007/09/12(水) 11:13:52
いや別に。たまにjavadoc読まずに失敗して逆切れするバカがいるけど。
0879デフォルトの名無しさん2007/09/12(水) 11:17:01
はいはい、ここはSwingスレですよっと。
0880デフォルトの名無しさん2007/09/12(水) 16:54:46
あちらはデフォでつきを数字で表さないからね
文字列の配列のインデックスのためでしょ
0881デフォルトの名無しさん2007/09/12(水) 20:20:47
>>874
回答ありがとうございます。おかげで解決しました。
つたない質問に丁寧に答えて頂き、本当に有難う御座いました。
0882デフォルトの名無しさん2007/09/12(水) 23:14:55
ImageIO.read(File f)

これでjpgファイルを読み込んで、JLabelにイメージアイコンとして突っ込んで表示してたら変な色になるファイルがある。
暗いところ明るい緑に、白いところは赤っぽくなる。

なんか変なフラグでも立ってるのかね?
0883デフォルトの名無しさん2007/09/13(木) 22:47:17
http://www.kbmj.com/tech/index.php?itemid=17&catid=19

>>882(自己レス)
ImageIOのバグなのか?
ここに書いてある通りにしたらうまくいった。

jpgはこれで読み込んで、jpg以外はImageIOにやってもらえばいいか。
0884デフォルトの名無しさん2007/09/13(木) 23:05:23
何で生成されたJPEGファイルなのか興味あるな
0885デフォルトの名無しさん2007/09/13(木) 23:15:50
VMが落ちるjpgファイルというのも気になるw
0886デフォルトの名無しさん2007/09/13(木) 23:28:54
カッコイイな
0887デフォルトの名無しさん2007/09/13(木) 23:30:32
そもそも、IIOがどこまで対応してて
読み込んだjpegがどんな機能使ってるかだな。
実は2kだったりしたら笑えるw
0888デフォルトの名無しさん2007/09/14(金) 17:12:51
6.0u2で、Swing Windows LAFのJFileChooserがクソ重く改悪された件。
ttp://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6578753

まー、SunはみんなSolarisだから、気づかないんだろうけど。
真面目にチェックしてリリースしろよ。
0889デフォルトの名無しさん2007/09/14(金) 18:33:36
MSかSUNかってレベルの企業にまともなアウトプット期待するなよ
0890デフォルトの名無しさん2007/09/14(金) 21:15:25
>>888
6u2で重く感じたのはやはり気のせいじゃなかったか
0891デフォルトの名無しさん2007/09/15(土) 01:39:07
そういやまだ6u1だ。
u2ってbug fixだったな。
0892デフォルトの名無しさん2007/09/16(日) 00:19:34
イベントの発行ってどうするん?

ルートのフレームから、その子供みんなにどどーんとイベントを発行できたらいいなぁ。
なんて思ってるんだけど。

具体的には、各部品が勝手に開いてるファイルをファイル名指定して「閉じろ」って命令したいんだな。
■ このスレッドは過去ログ倉庫に格納されています