トップページ⇒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
0657デフォルトの名無しさん2007/07/24(火) 14:22:08
>>655
http://www.javadrive.jp/tutorial/
ここを参考にやったんですが出来ません.
>>654
1.6.0_02を使っているけど出来ませんxx
0658デフォルトの名無しさん2007/07/24(火) 17:09:02
setMaximumSize, setMinimumSize, setPreferredSize, setSize
0659デフォルトの名無しさん2007/07/24(火) 18:00:31
import javax.swing.*;
public class Sample1 extends JFrame{
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Sample1 frame = new Sample1();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds( 10, 10, 300, 200);
frame.setVisible(true);
}
});
}
}

ウインドウマネージャ次第でフレームは再配置やリサイズされるかもしれないしな。
>>658のようないろいろなヒントをマネージャに与えれば言うことを聞いてくれるかも。
0660デフォルトの名無しさん2007/07/27(金) 00:38:57
ボタンを押すなりしてイベントが発生したときにコンポーネントの大きさや
位置を変えたり、非表示だったのを表示するようにしたりしているのですが、
大きさと、位置が変わってくれません。
デバッグしたところ正しい値はコンポーネントのプロパティに入っているようなの
ですが、、、
0661デフォルトの名無しさん2007/07/27(金) 01:16:14
画面リフレッシュしてる?
0662デフォルトの名無しさん2007/07/27(金) 01:17:14
たぶんpackとかもわからないんだろうなぁ
0663デフォルトの名無しさん2007/07/27(金) 14:24:01
何のLayout使っているのかも重要だから書かないとな
0664デフォルトの名無しさん2007/07/28(土) 01:26:08
モーダルなJDialogをsetVisibleする場合は、invokeAndWaitを使えばよいのでしょうか?
0665デフォルトの名無しさん2007/07/28(土) 02:14:54
>>664
invokeLaterでええやん
例えばボタンとかを押してActionListener#actionPerformedを呼んで
その中からJDialog#setVisibleするのならinvokeAndWaitは使えない
0666デフォルトの名無しさん2007/07/28(土) 10:04:35
>>664
使わなくてもいいよ
AWTスレッドなら
0667デフォルトの名無しさん2007/07/31(火) 12:29:26
やりたい事
・BufferStrategyを使って描画
・フルスクリーン表示
・メニューの表示

CanvasでBufferStrategy使って描画、Canvasを含むJWindowをフルスクリーン表示
フルスクリーン画面でJPopupMenuを表示するとCanvasの描画が走るタイミングでJPopupMenuが消える

JPopupMenuをJInternalFrameで実現してJDesktopPaneとの組み合わせにしてもダメでした。
BufferStrategyを使わなければ実現出来るのに・・・。
ゲーム作ってる人で同じ悩みに直面した人いませんか?
0668デフォルトの名無しさん2007/07/31(火) 13:25:18
>>667
JPopupMenu#setLightWeightPopupEnabled(boolean) で false にしろとかって話でなくて?
0669デフォルトの名無しさん2007/07/31(火) 14:00:11
>>668
はやり、消えます。

BufferStrategyからgetDrawGraphicsしたGraphicsでMenuを描画すれば良いのでは
と思いついたのですが描画は出来ても機能せず。

フルスクリーンじゃない時はMenuがCanvasの上に表示されるので
フルスクリーン+BufferStrategyの組み合わせがどうにも悪いのかなと・・・。
0670デフォルトの名無しさん2007/07/31(火) 14:00:35
だからお約束のようにAWTとSwingまぜるなと
0671デフォルトの名無しさん2007/07/31(火) 14:10:17
>>670
JWindowからcreateBufferStrategyしてもダメでした。
0672デフォルトの名無しさん2007/07/31(火) 14:13:51
JPopupMenuがSwingだからこれを使ってはダメ
0673デフォルトの名無しさん2007/07/31(火) 14:34:53
>>672
部品を全てawtに統一しJPopupMenuの変わりにDialogを使用したところ無事実現できました。
事象が上手く理解できていないので今からソースを見て理解を深めたいと思います。
ありがとうございました。
0674デフォルトの名無しさん2007/07/31(火) 14:50:24
Swingってのはフレームから下を全てSwingフレームワークによってソフトウェア描画する
AWTってのは各種OSなどに描画を任せる

混ぜるな危険ってのはそういうこと
Swingコンポーネントを使いつつBufferedStrategyが使いたいという用途はあまりないと思うので
その場合はSwingフレームワークにあわせること

ゲームなどでBufferedStrategyは使うと思うが、メインループスレッドからバックバッファに描画、
その後repaint発行でいける

この場合注意すべきポイントはrepaintはいつ呼ばれるかわからないということ
つまりトリプルバッファのようにバックバッファが最低2つは必要になる

BufferedStrategyなどでゲームに特化した話題ならゲーム製作板へどうぞ
0675デフォルトの名無しさん2007/07/31(火) 16:31:47
>>667
BufferStrategy の原理上そうなると思う.
昔ちょっと試したときの結論はゲームにメニューバーは付けない(そもそもかっこわるいし)で
ゲーム内にメニューを実装する,でした.
0676デフォルトの名無しさん2007/07/31(火) 17:39:57
AWTでしか実現できない機能なんてあんのか〜、しらなんだわ。
0677デフォルトの名無しさん2007/07/31(火) 18:00:20
GLCanvasもそうだけどいわゆるハードウェアべったりな動作を期待したい場合AWTを使うしかない
この仕組みを変えるためにはSwing自体大幅にパイプラインをかえないといけない

で、JOGLに関してはJavaSE6でそうなる予定だったのだが、不具合のためOFFになってしまった
そろそろ標準でJOGLついていてもいいと思うけどね

まともに3D動かそうとすると必須だし
0678デフォルトの名無しさん2007/07/31(火) 18:21:29
swingとawtのFPS比較サイトとかあれば良いのにな。
0679デフォルトの名無しさん2007/07/31(火) 18:31:18
ゲームの話か?
描画内容を反映させるのにBLITが必要なく、垂直同期が取れるAWTのほうが有利
JNIによるダイレクトなレンダリングも期待できる

GUIコンポーネントというのならSwingのほうが将来的にも拡張性的にも有利ではないかと
0680デフォルトの名無しさん2007/07/31(火) 18:41:02
というかBufferStrategyのdoc読んだら重量には効かないのが分かるだろ。

>>677
このバグ自体は昔からあるけどいざ、潰してみたらVGAドライバ由来の物だということが分かったので当分無理。
だから途中でデフォルト無効になったんだし。

これさえ直ればちゃんとGLPanelがつかえるんだよ。
せっかく、JOGLがjavax.*まできたのに・・・。

JOALも標準拡張にしてやってくだせぇ。
ミドルレンジ以上のサウンドカードじゃないとOpenALまともにサポートしてないから無理かな?
0681デフォルトの名無しさん2007/07/31(火) 19:13:05
ところでJava3DとJOGLのちがいってなに?
0682デフォルトの名無しさん2007/07/31(火) 19:53:15
(そのレベルなら)なに気にすることはない。

自分で調べろや
0683デフォルトの名無しさん2007/07/31(火) 21:35:54
ImageからBufferedImageへの変換ってどうやるの?
0684デフォルトの名無しさん2007/07/31(火) 21:37:05
>>683
Java言語から勉強したほうがいいよ
0685デフォルトの名無しさん2007/07/31(火) 21:57:55
>>683
http://www.amazon.co.jp/Java-Swing-Hacks/dp/4873112788/
この本の17ページに書いてあるよ
0686デフォルトの名無しさん2007/07/31(火) 21:59:16
>>683
BufferedImage→ Graphics→drawImage
これで分からなきゃ初心者スレ行ってくれ
0687デフォルトの名無しさん2007/07/31(火) 22:06:50
JTableで編集中のセルの行インデックスを取得する方法ありますか?
0688デフォルトの名無しさん2007/07/31(火) 22:07:40
ファイルからロードしたImageだからgetGraphics()でnullになるんだけど、どうすれば・・
0689デフォルトの名無しさん2007/07/31(火) 22:12:10
>>687
APIに載ってるんだが、なんで調べないの?
つ getEditingRow()
0690デフォルトの名無しさん2007/07/31(火) 22:31:30
>>686 ああ、できた。あんがと
0691デフォルトの名無しさん2007/07/31(火) 22:32:46
SwingとAWTを混ぜるなって話だけど・・・jdk7で変わるのかね?

Heavyweight/Lightweight Mixing feature of Java 7
ttp://forums.java.net/jive/thread.jspa?threadID=29175&tstart=0

ごめん内容いまいち追い切れてない。
0692デフォルトの名無しさん2007/07/31(火) 22:44:27
>>691
まだmacはJDK5だと言うのに・・・。
0693デフォルトの名無しさん2007/07/31(火) 22:46:38
そうだったのかw
あんまバージョンアップが早いと
リタイヤするOSが増えそうだな

FreeBSDも5だっけか
0694デフォルトの名無しさん2007/07/31(火) 22:53:32
>>692
6の開発者向けプレビューが去年から更新されてないんだよね。
たぶん4月にはLeopardと一緒に正式リリースを目論んでいたんだろうけど、
Leopard10月になっちゃったし。
0695デフォルトの名無しさん2007/07/31(火) 23:02:50
>>683
BufferedImageってImageインターフェースもってるだろ?
BufferedImageにすってことはどれだけ情報がうしなわれるとか考えた?
0696デフォルトの名無しさん2007/07/31(火) 23:04:40
>>682
で、どっちが活発にメンテされてるの?
0697デフォルトの名無しさん2007/07/31(火) 23:15:09
去年JOGLは1.0がリリースされGLCanvasは現実的に使えるようになった
Windows版しかみてないが、ネイティブ版の8割くらいの速度で動くと思えばよい

1.0GHzで動いていたのと同じように動かすためには1.2GHzくらいが必要

Java3Dはかなり前に試したが、とにかく遅くて使い物にならないことや高レベルすぎるんじゃないかな
ゲーム以外ならJava3Dでいいのかもしれないけど
0698デフォルトの名無しさん2007/07/31(火) 23:34:42
>>697
なるほど。よく分かった。
0699デフォルトの名無しさん2007/07/31(火) 23:37:02
JOGLだとOpenGL専用で、どこでも使えるJavaっぽくないけど、
これ自体がオプションパッケージだから、依存性が強くてもいいのかもしれない。
Java3Dがまだこなれてないんじゃ、しようがないね。
0700デフォルトの名無しさん2007/07/31(火) 23:38:25
>>695 Image.getGraphics()がアンサポート例外出すのがやなんだけど
0701デフォルトの名無しさん2007/07/31(火) 23:46:50
>>699
OpenGLはWindowsやLinux、Solarisなどで動くオープンなAPIだよ
Java3Dは実装選べるけど結局OpenGLかDirect3Dかの二択だしプラットフォームはかわらんよ

sunが自前で全部実装ってのは無理
ビデオチップベンダとの協力が必要だから
0702デフォルトの名無しさん2007/07/31(火) 23:48:51
>>700
オフスクリーン以外で実行したらそれがでるのは正しい動作

それにImageなんて抽象クラスなんだから実装はさまざまだ
0703デフォルトの名無しさん2007/07/31(火) 23:51:33
開発者側で混ぜるな危険をなんとか言ってるのはJava3D/LG3D関係か?

てかJOGL1.0はもう古い。今は1.1.0。
java2DをJOGLのテクスチャに合成するutilが追加されてる。
1.0までだとここらへん自力でやらないとだめだったけど今なら
java2Dで描画できるもんならなんでもJOGLに持っていけるようになったからフォント描画も楽になった。

ビルボード上にテクスチャ貼ってスプライトさせるなら自分でやった方が効率よさそうだけど。
0704デフォルトの名無しさん2007/07/31(火) 23:53:45
>>703
1.0からできるっしょ?どっかかわった?

混ぜるな危険はSwingがでたとき、1.1時代からいわれてるよ
0705デフォルトの名無しさん2007/07/31(火) 23:57:04
>>699
何言ってんだ?JOGLもJava3DもOpenGL使ってるだろ。
それに両方、標準拡張。
万人が使うわけじゃないからJREから外されれてるだけ。
そこらのJNI使った拡張機能とはわけが違う。
0706デフォルトの名無しさん2007/08/01(水) 00:13:53
>>704
そうじゃなくてoffscreen renderingの問題だよ。どうにかなったのこれ?
昔から言われてるのは常識だろ。

>1.0からできるっしょ?どっかかわった?
javadoc嫁
0707デフォルトの名無しさん2007/08/01(水) 00:49:41
>>706
落としてきてあるのだけは確認した
com.sun.opengl.util.j2dパッケージが追加されたのか

いままでもJava2Dからのテクスチャ生成ができたけど、これは動いてる最中も反映されるんか?
毎回getTexture必要になるっぽくみえる

今週末久々にJOGLいじってみるか

問題は激しくすれ違いなことだがJOGLのスレってなかったか
0708デフォルトの名無しさん2007/08/01(水) 03:07:03
なるほど。ためになった。
0709デフォルトの名無しさん2007/08/01(水) 05:49:39
>>707
JOGLにしかない機能・作法が意外とあるのにどこいってもJOGL専用話してる所がないんだよ。
JOGL紹介サイトでもOpenGLの教本に書いてあることくらいしか書いてない。

jogl-demosのソースか洋書あたるのが近道。
国内はJava3Dだらけだ。
0710デフォルトの名無しさん2007/08/01(水) 08:39:42
良スレの予感。
0711デフォルトの名無しさん2007/08/01(水) 10:57:50
>>709
JOGLって作りこみの部分に入るとOpenGLまんまだから迷うことはないけど
たしかにそのセットアップとかTipsとかそういう情報ゼロに近いね

一方JavaのゲームではJOGLしか選択の余地がないから非常に悩むところ
Java2Dのアクセラレーション範囲が狭いことに加え、アルファブレンディングの種類が足りなすぎる

おかげで2D描画もOpenGLが必須になるという・・・
0712デフォルトの名無しさん2007/08/01(水) 11:05:22
今気がついたんだが「LayoutManager2」なんてクラスがあるんだな。
本当にこんなネーミングで良いのか?
0713デフォルトの名無しさん2007/08/01(水) 13:40:12
クラスというかインタフェースだけどな
配置の制約情報オブジェクトをコンポーネントに関連付けるメソッドが追加されたLayoutManager
ネーミングについては確かに投げやりだな
0714デフォルトの名無しさん2007/08/01(水) 23:48:14
SAX2.0なんて2がつくの結構あるぜ
0715デフォルトの名無しさん2007/08/02(木) 01:26:14
>>712

そりゃたしかに投げやりなネーミングだな。ひどい
0716デフォルトの名無しさん2007/08/02(木) 04:06:22
じゃあどんな名前ならよかったんだ?
- AdvancedLayoutManager
- ExtendedLayoutManager
- SuperLayoutManager
- LayoutManagerGreat
- 続・LayoutManager
0717デフォルトの名無しさん2007/08/02(木) 04:23:15
LayoutManager4.0
アナログ的に配置指示
0718デフォルトの名無しさん2007/08/02(木) 10:30:35
>>716
続・LayoutManager に一票
0719デフォルトの名無しさん2007/08/02(木) 11:29:00
ボーランドのライブラリは2がつくのたくさんあったな
0720デフォルトの名無しさん2007/08/02(木) 12:01:51
Extended とか付けたら、もっかい拡張したくなったら名前に困るじゃん。
数字なら 3 とか 4 にすればいいだけで楽。
0721デフォルトの名無しさん2007/08/02(木) 12:54:43
10以上行くと
ソートした時に
XX
XX10
XX2
XX3
.
.
ってなりそう。
0722デフォルトの名無しさん2007/08/02(木) 16:37:38
Win32 API の 〜Ex は辛かった。〜2 もどうかとは思うが。
そろそろ Swing そのものを根本的に整理して欲しい時期だねえ。
0723デフォルトの名無しさん2007/08/02(木) 17:58:03
Swingで一番やってほしいのが
・定数のenum化
・コレクションフレームワーク利用
・generics利用
・OpenGLパイプライン有効

で作り直してほしいな
互換性とるのは無理だからパッケージをかえてな
0724デフォルトの名無しさん2007/08/02(木) 18:15:14
新パッケージ名はjavax.swing2だなw
0725デフォルトの名無しさん2007/08/02(木) 18:43:39
javax.続・swing パッケージで…
0726デフォルトの名無しさん2007/08/02(木) 19:09:32
JOptionPaneのmessageTypeで指定すると表示されるデフォルトアイコン群は
他のクラスで利用出来ないものでしょうか?
0727デフォルトの名無しさん2007/08/02(木) 19:51:01
>>721
9の次はaにすれば、しばらく問題なし
0728デフォルトの名無しさん2007/08/02(木) 19:55:47
>>726
ひどい方法
class IconRevealer extends BasicOptionPaneUI {
public Icon getIcon() { return super.getIcon(); }
};
IconRevealer foo = new IconRevealer();
new JOptionPane(null, JOptionPane.INFORMATION_MESSAGE).setUI(foo);
//new JOptionPane(null, JOptionPane.ERROR_MESSAGE).setUI(foo);
//new JOptionPane(null, JOptionPane.QUESTION_MESSAGE).setUI(foo);
Icon icon = foo.getIcon();

JOptionPane#getIcon()やiconフィールドはsetIcon()で設定した時用だったんだな
07297282007/08/02(木) 20:21:29
ソースを眺めるとこう単純にできるがさらにアンドキュメンティッドなひどい方法だ
String propertyName = "OptionPane.errorIcon";
//String propertyName = "OptionPane.informationIcon";
//String propertyName = "OptionPane.warningIcon";
//String propertyName = "OptionPane.questionIcon";
Icon icon = (Icon)sun.swing.DefaultLookup.get(new JOptionPane(), new BasicOptionPaneUI(), propertyName);
0730デフォルトの名無しさん2007/08/02(木) 20:27:27
UIManager.getIcon("OptionPane.errorIcon");
0731デフォルトの名無しさん2007/08/02(木) 20:31:56
素でUIManagerのことを忘れてたorz
BasicOptionPaneUIはUIManagerを介さずに直にsun.swing.DefaultLookupを呼んでるんだな
0732デフォルトの名無しさん2007/08/02(木) 21:26:15
UIManagerで使うキー文字列も明文化されていないから
変えられても文句いえないんだよな。
こーゆーところはpublicな定数なりenum(は増えるから無理か)を
使ってあれば安心して使えるんだが。
07337262007/08/03(金) 16:54:32
ありがとうございます。
昨日は諦めてアイコンを作ってましたが
使わなくて済みそうです。
0734デフォルトの名無しさん2007/08/03(金) 18:12:41
あの辺のアイコンデータのライセンスってどうなってるんだろうね?
再配布可能なライセンスならアイコン自体もらってアプリに組込めば
明文化されてない使い方しなくてもすみそうなんだけど…
0735デフォルトの名無しさん2007/08/03(金) 20:16:55
っ http://java.sun.com/developer/techDocs/hi/repository/
0736デフォルトの名無しさん2007/08/03(金) 21:39:54
>>735
Thx!
07377352007/08/04(土) 00:38:56
・・・でもよくみたらJOptionPaneのアイコンは入ってなかったね。ごめんよ。
0738デフォルトの名無しさん2007/08/04(土) 04:47:39
>>737
ほんとだ… インフォメーションアイコン(丸に"i"のやつ)とかあるから
同じかと思ったら別のアイコンだ…
0739デフォルトの名無しさん2007/08/05(日) 08:56:15
BufferedImage.TYPE_INT_ARGB
BufferedImage.TYPE_INT_ARGB_PRE

よく_PREってついてるのあるけど、どう違うの?
0740デフォルトの名無しさん2007/08/05(日) 11:16:41
それは premultiplied alpha 。
RGB 各成分に A 成分が乗算済みであるフォーマット。
例えば 70% の不透明度で描画するとき通常 result = dst * 0.3 + src * 0.7 とやるわけだけど、
_PRE は A 成分が乗算済みだから result = dst * 0.3 + src で済む (src が _PRE で dst がそうでない場合)。
0741デフォルトの名無しさん2007/08/05(日) 12:31:43
よくわかった。ありがとう。
0742デフォルトの名無しさん2007/08/05(日) 20:45:36
問題はSwingと関係ない話だってことだな
0743デフォルトの名無しさん2007/08/05(日) 20:51:44
まぁ、こっちで聞くのは正解な気もするがw
0744デフォルトの名無しさん2007/08/05(日) 20:53:47
AWTのスレってあったっけ?
0745デフォルトの名無しさん2007/08/05(日) 21:00:13
ない
0746デフォルトの名無しさん2007/08/06(月) 10:15:44
>>740-743
Sunのチュートリアルには無かったけど、そういう話(話題)ってどこを参照すればいいの?
できれば日本語で。
0747デフォルトの名無しさん2007/08/06(月) 10:41:30
Java2Dのスレを立ち上げる
0748デフォルトの名無しさん2007/08/06(月) 11:05:27
>>746
http://java.sun.com/javase/ja/6/docs/ja/api/java/awt/image/BufferedImage.html#TYPE_INT_ARGB_PRE
『このイメージのカラーデータには、アルファがあらかじめ乗算されています』
0749デフォルトの名無しさん2007/08/06(月) 12:37:44
>>748 その翻訳の「意味」が分からなかった。
0750デフォルトの名無しさん2007/08/06(月) 12:41:38
まぁわかりにくい表現だとは思うが
API以前に画像の基礎知識つけたほうがいいんじゃね?

GUIがわかってない人がSwingのマニュアル見てもわからないのと同じように
0751デフォルトの名無しさん2007/08/06(月) 12:55:52
画像処理というよりも、単に画像ファイルを読み込み、コピー、保存する程度。
ImageIOではなくて。
0752デフォルトの名無しさん2007/08/06(月) 19:25:43
独自のポップアップメニューを表示するにはどうしたらいいのでしょうか?
たとえばExcelの色選択メニューみたいな。
枠ナシJFrameを使うとタスクバーに出たり、ウィンドウがちらついたりします。
0753デフォルトの名無しさん2007/08/06(月) 19:39:27
普通の JPopupMenu に独自のコンポーネントを add してみるとか。
単に JPopupMenu のレイアウトマネージャを変えてみるとか。
0754デフォルトの名無しさん2007/08/06(月) 19:41:05
glasspane使うのが正解じゃね?
0755デフォルトの名無しさん2007/08/06(月) 20:39:15
JWindowはどう?
(色選択ならJColorChooserからコンポーネントもってくれば)
07567522007/08/06(月) 21:35:43
JWindowがよさそうですが、よそがクリックされたらウィンドウ閉じるようにするにはどうするのがいいんでしょう?
JFrameのときは、windowListenerのwindowDeactivatedでdisposeしてました。
■ このスレッドは過去ログ倉庫に格納されています