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

Java低速GUI Swing 3

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

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

参考スレ
Java 高速GUI SWT 2
http://pc5.2ch.net/test/read.cgi/tech/1068349883/l50
0232デフォルトの名無しさん2005/08/28(日) 01:04:32
SwingのダブルバッファとAWTの自作ダブルバッファとBufferStrategyってどれが一番性能がよい?
02332292005/08/28(日) 02:06:37
とりあえず DefaultListCellRenderer のサブクラス作って、セパレータ入れたくなった項目で

this.setBorder(BorderFactory.createMatteBorder(1,0,0,0,Color.gray));
(つや消しボーダーで上辺のみグレー設定)

とやったらよくあるような形になった。

>>231 さん
そう、JSeparator をそのまま 1 項目としてしまうと ItemListener 仕掛けてはじかなきゃ
いけなくなるんですよね。項目の上辺か下辺に線が付けば要件満たせると思って
辺を指定できる MatteBorder 使っちゃいました。
0234デフォルトの名無しさん2005/08/28(日) 02:09:15
>>232
それぞれ特徴が・・・というかSwingとAWTのダブルバッファの意味が分からん
SwingはJava2D使って実装されてるし、AWTでダブルバッファまでやってくれたっけ?
0235デフォルトの名無しさん2005/08/28(日) 02:36:54
>>231
今書いたの?

>>234
AWT の「自作」ダブルバッファって書いてあるよ。
0236デフォルトの名無しさん2005/08/28(日) 12:50:16
AWTの自作ってなんだよ
0237デフォルトの名無しさん2005/08/28(日) 12:57:04
>>236
おまえ確実にバカだろ?
0238デフォルトの名無しさん2005/08/28(日) 13:24:34
AWTとかSwingってGUIコンポーネントだろ
AWT以下のパッケージという意味ではないよな
ならAWT上の自作ダブルバッファという意味がつうじん
0239デフォルトの名無しさん2005/08/28(日) 13:34:16
1) Swingであらかじめ用意されているダブルバッファ(RepaintManager?)を使うのと、
2) ダブルバッファ機能をスクラッチから自作するのと、
3) BufferStrategy(これってjava.awt.image下のクラスだよね?)
のどれがいいでしょうか、という質問かな?
どっちにせよ質問者が質問の意味を分かってないようなんだな。
0240デフォルトの名無しさん2005/08/28(日) 13:46:30
BufferStrategyとかSwingのダブルバッファは使用目的が限られてるし
用途で決まるもんだけどなぁ
0241デフォルトの名無しさん2005/08/28(日) 14:41:48
SwingでBufferStrategyを使うとトリプルバッファになる?
0242デフォルトの名無しさん2005/08/28(日) 15:38:18
>>241
BufferStrategy勉強してからそういうこときいてね
それにトリプルバッファってどういうもんかしってる?
0243デフォルトの名無しさん2005/08/28(日) 15:51:49
ダブルバッファ+1に決まってるだろ
0244デフォルトの名無しさん2005/08/28(日) 15:58:27
どういう用途で使うか知ってるかと聞いたのだが
0245デフォルトの名無しさん2005/08/28(日) 16:22:21
フリッピングだろ?
0246デフォルトの名無しさん2005/08/28(日) 16:32:32
>>244
ゲーム
0247デフォルトの名無しさん2005/08/28(日) 16:33:14
もうこのスレと関係ねーじゃん。
0248デフォルトの名無しさん2005/08/28(日) 16:35:04
JFrame配下のJComponentでBufferStrategy使うのと
CanvasでBufferStrategy使うのとではどっちが有利かってことだろ?
0249デフォルトの名無しさん2005/08/28(日) 16:41:25
BufferStrategyはフルスクリーン以外はイマイチ
0250デフォルトの名無しさん2005/08/28(日) 20:34:13
swingアプリでフルスクリーンにする時なんかあるの?
0251デフォルトの名無しさん2005/08/28(日) 20:40:52
ほとんどないから実質スレ違い
0252デフォルトの名無しさん2005/08/28(日) 22:19:18
POSとか
0253デフォルトの名無しさん2005/08/28(日) 22:23:07
組み込みでフルスクリーンはあるけどその場合BufferStrategyはつかわんな
ゲームとかで垂直同期ページフリッピングが必要ならやるけど
0254デフォルトの名無しさん2005/09/06(火) 01:26:47
このスレの伸びがSwing現状を物語ってるな…。
Javaがんがれ
0255デフォルトの名無しさん2005/09/06(火) 01:32:38
つーか、ひょっとしてみんな Web 系で画面は HTML で作ってばっかとか?
そしてそれ以外は全部ゲーム・携帯アプリとか。

GUI コンポーネントとイベントリスナを HTML で記述できりゃ楽なのに。配置や
色のちょっとした調整するのに Visual Editor 立ち上がるの重すぎ。Longhoneで
やってなかったっけ?
0256デフォルトの名無しさん2005/09/06(火) 14:23:22
XAMLか?
あれは微妙に違うかも。
0257デフォルトの名無しさん2005/09/06(火) 17:27:51
詳しく調べてないんで、イベントはどうかわからんけど
レイアウトをXMLでやるのはありますね。

XMLでマークアップできるJava GUIまとめ
tp://d.hatena.ne.jp/sakamoto_yuki/20050612#p1
0258デフォルトの名無しさん2005/09/06(火) 21:47:28
>>255
NetBeansつかう
0259デフォルトの名無しさん2005/09/06(火) 23:45:32
JBuilderつかう
0260デフォルトの名無しさん2005/09/07(水) 00:22:30
でもなんだかんだ言ってVisual Editorがディファクトスタンダードになりそうだよな・・・。
そうなるならOSX版も出して欲しいんだが。
0261デフォルトの名無しさん2005/09/07(水) 00:35:35
NetBean も JBuilder も HTML 手書き+ブラウザリロードに比べたら激遅やん。
0262デフォルトの名無しさん2005/09/07(水) 00:42:45
HTMLって・・・なにいってるの?
JSPしか分からない人?
0263デフォルトの名無しさん2005/09/07(水) 00:48:28
基本的にvisualc++のスピードを抜かないとSwingは普及しないね。
0264デフォルトの名無しさん2005/09/07(水) 01:07:03
>>262
確かにHTMLってのは舌ったらずだと思うけど
マークアップでGUIを定義できないもんかって
話だってのは読んで判ったよ。
0265デフォルトの名無しさん2005/09/07(水) 02:35:34
>>263のいいたいことがサッパリわからない。何故にIDEとライブラリを比較してるのか。
0266デフォルトの名無しさん2005/09/07(水) 03:51:53
MFC のことを言ってるんだろうということくらい容易に想像つくと思うが。
まぁ MFC すら触ったことない人間なら思いつかんかもしれんが。
0267デフォルトの名無しさん2005/09/07(水) 03:56:11
>>262
10 レスくらい前から読めば言わんとしてることくらい分かるだろ。
IE レベルのユーザインターフェースを HTML で定義できたら Web 系の
スキルの人間をクライアント GUI 開発に回せて便利だろうね。
0268デフォルトの名無しさん2005/09/07(水) 04:10:56
NetBeansのMatisseとか触ってみると、ぜんぜんそうは思えないんだが。
0269デフォルトの名無しさん2005/09/07(水) 04:23:12
あれそんなに良いの? 今度触ってみるか…

マークアップ言語の GUI はコンポーネントのレイアウトをリソースとして
切り離せるというのもあるな。GUI ビルダーが吐き出した汚いソースに
恐る恐る手を入れるよりよっぽどスマートでしょ。
0270デフォルトの名無しさん2005/09/07(水) 07:29:42
まだ例外でまくり。でもレイアウトかなりやりやすいよ。
0271デフォルトの名無しさん2005/09/07(水) 07:30:07
>>267
IEレベルのしょぼいGUIでいったい何をしようって言うのよ?
0272デフォルトの名無しさん2005/09/07(水) 07:33:16
だからコンポーネントの配置だっつってんのに。
0273デフォルトの名無しさん2005/09/07(水) 08:22:35
しかし、タグで設計するSwingGUIライブラリって、あんまり人気でないね。
Swing自体が使われないからか。
NetBeansのフォーム情報XMLが編集しやすければいいんだけどね。
0274デフォルトの名無しさん2005/09/07(水) 10:19:32
>>273
257に書いてある所に、SWTのもあるんだけどね。
あまり情報ないね。

やっぱりリッチなGUIはどうせならポトペタでって
刷りこまれちゃってんのかな。
まあ俺もそんな感じだけど。
0275デフォルトの名無しさん2005/09/07(水) 10:27:56
ポトペタのほうが、どうしても脳味噌容量を節約できるしな。
リッチな開発環境が使えるのであれば、XMLでGUIをデザインするメリットが
少なく見えてしまうのも頷ける。
0276デフォルトの名無しさん2005/09/07(水) 10:48:19
ポトペタでXMLを吐けばまんじOKコンピューターだな
0277デフォルトの名無しさん2005/09/07(水) 20:47:06
NetBeans5が正式リリースされればすべて解決だ
0278デフォルトの名無しさん2005/09/07(水) 23:41:13
VS2005が正式リリースされればSwingももうお終いだな。
0279デフォルトの名無しさん2005/09/07(水) 23:48:32
関連性がないぞ
それにそういうことは死滅スレいけ
0280デフォルトの名無しさん2005/09/08(木) 01:05:44
>>272
>だからコンポーネントの配置だっつってんのに。

???
「IE レベルのユーザインターフェース」を HTML で定義できたら...(>>267)
0281デフォルトの名無しさん2005/09/08(木) 01:07:44
HTMLで配置とか言ってるヤシがいるがHTMLだってほとんどポトペタだと思うがな
0282デフォルトの名無しさん2005/09/08(木) 02:04:06
IDE に縛られなくても HTML 程度なら好きなエディタで作れるがな。
0283デフォルトの名無しさん2005/09/08(木) 02:19:57
まさかCSSの使えないHTMLか
0284デフォルトの名無しさん2005/09/08(木) 02:26:58
ところで、JTextPane はもうちょっとまともにならないのか。
0285デフォルトの名無しさん2005/09/08(木) 02:58:20
まったくだ。
誰かそろそろGecko並みのHTMLコンポーネント作ってくれないもんか。
0286デフォルトの名無しさん2005/09/08(木) 12:20:24
>>282
AWTもSwingもSWTもIDEには縛られなくても好きなエディタで書ける。
HTMLも複雑なレイアウトだと直接書くのは大変。
つまりHTMLもGUIライブラリも同じ。
0287デフォルトの名無しさん2005/09/08(木) 12:34:16
Visual Editor で作ったものを NetBeans でメンテナンスできるの?
0288デフォルトの名無しさん2005/09/08(木) 12:58:03
>>287
ぽとぺたは無理だな
0289デフォルトの名無しさん2005/09/08(木) 13:13:37
それは縛られてるとは言わんのか。つーか、縛られてるって開発物が特定の
開発環境にって意味なんだが。個人の嗜好が特定の IDE にって意味じゃなくて。
0290デフォルトの名無しさん2005/09/08(木) 13:29:56
そろそろそんな環境がほしいならプラグインでもモジュールでもなんでもいいから自分で作れといいたくなってきた
0291デフォルトの名無しさん2005/09/08(木) 13:33:10
ありがちな思考停止の言い訳
0292デフォルトの名無しさん2005/09/08(木) 13:38:06
業務アプリでテキストエディタでGUI生成しようとしてるやつはみたが
画面数とコンポーネントの数が大量なのに根性あるなと思った

まぁその後は予想通りの結果だったが
0293デフォルトの名無しさん2005/09/08(木) 13:44:25
>>292
一回手書きなり IDE なりで GUI 作ってしまうとずっと引っ張られるからなぁ。
移行しようにも分析のために何年前か分からん IDE が吐き出した汚いソース読む
羽目になったり。
0294デフォルトの名無しさん2005/09/08(木) 15:10:11
絵に描いた餅には興味はない
0295デフォルトの名無しさん2005/09/08(木) 15:13:13
>>291
つまり、自分の思い通りにならないから駄々をこねてるだけということか
0296デフォルトの名無しさん2005/09/08(木) 15:28:44
「自分で作れ」っていうのは、「これ以上いいアイデアもないし自分は不便に感じてないしキミにつきあってられないから勝手にやってくれ」っていうメッセージだよね。
0297デフォルトの名無しさん2005/09/08(木) 15:34:44
>>295
ここは個人の勝手な不満をぶちまけるスレではありませんし、
到底実現しそうにもない無意味なアイデアを開陳するスレでもありません。
0298デフォルトの名無しさん2005/09/08(木) 15:45:19
「つまり」 って便利な言葉だな。脈絡なくても文章力なくても結論導いたような文章が書ける。
0299デフォルトの名無しさん2005/09/08(木) 16:25:00
だいたいHTMLとか言ってるやつの不満はSwingそのものじゃなくてIDEの問題なんだからIDEのスレでやれよ。
0300デフォルトの名無しさん2005/09/08(木) 22:25:15
記述法重要
0301デフォルトの名無しさん2005/09/08(木) 22:29:35
>>300
重要だと思うなら思考停止とか言わずにそのアイデアとやらを基に自分で作ってみろって、
本当に必要なものならみんな使ってくれるさ。
今のままじゃ本当にただの絵に書いた餅に過ぎない。
0302デフォルトの名無しさん2005/09/08(木) 22:52:00
はいはいクマクマ
0303デフォルトの名無しさん2005/09/08(木) 22:53:16
JTextPane で挿入した Component に文字の回りこみって設定できる?
0304デフォルトの名無しさん2005/09/08(木) 23:38:59
>>302
なんだ、ネタだったのか。相手して損した。
0305デフォルトの名無しさん2005/09/08(木) 23:46:32
↑
0306デフォルトの名無しさん2005/09/08(木) 23:52:36
↓
0307デフォルトの名無しさん2005/09/08(木) 23:53:55
→
0308デフォルトの名無しさん2005/09/08(木) 23:55:28
←
0309デフォルトの名無しさん2005/09/09(金) 00:53:54
↗
0310デフォルトの名無しさん2005/09/09(金) 01:32:26
>>305-309
せめてベンケーシーネタとかにしてくれ。
0311デフォルトの名無しさん2005/09/09(金) 02:25:08
自分は賢いとか思ってるんだろうな、コイツ
0312デフォルトの名無しさん2005/09/09(金) 03:37:06
どいつ?
0313デフォルトの名無しさん2005/09/09(金) 08:16:47
これなんか、いいかもね。
https://swixml.dev.java.net/
0314デフォルトの名無しさん2005/09/09(金) 10:36:34
JTextPaneで、今何行目にキャレットがあるかを調べるには、
やっぱり、中身が変更される毎に各行の開始点を計算して、それから計算しないとだめなんだろうか?

SwingでNetBeansやEclipse並みのエディタを作成しようとしているのだが、
2000行ぐらいになると重くて使い物にならなくなるorz
0315デフォルトの名無しさん2005/09/09(金) 14:17:28
>>314
どのぐらいのスペックのPCで重いの?
03163142005/09/09(金) 14:40:33
>>315
CPU:1.7GHz
メモリ:256MB
OS:Window2000
Java:バージョン1.5
0317デフォルトの名無しさん2005/09/09(金) 14:58:34
>>314
任意の位置の行番号を保持する StyledDocument を自分で作る。
ま、行ごとの文字数をリストで持ってて、入力イベント拾って画面と同期してれば
良いかと。
0318デフォルトの名無しさん2005/09/09(金) 15:05:21
各行の開始点を計算ってのがよく分からないけど、
Caret#getDotとElement#getElementIndexを毎回呼んだとしても
そんなに遅くならないんじゃないかなぁ
と試しもせずに言ってみる。
0319デフォルトの名無しさん2005/09/09(金) 16:23:06
エディタ程度でそんなに重くなるとは思えないが
完全に自作してみたほうが軽いかもよ

あと1.7GHzといってもCeleronの1.7GHz+SDRAMと
PentiumMの1.7GHz+DDR2デュアルチャネルでは
性能が2倍は違うから注意な

netburst系はJavaの動作速度が遅いし
0320デフォルトの名無しさん2005/09/09(金) 17:59:44
その点V2Cってすごいな
0321デフォルトの名無しさん2005/09/09(金) 20:04:25
>>320
いや、あの、その、そういう問題じゃないだろう?
0322デフォルトの名無しさん2005/09/09(金) 20:21:49
>>319
カーソルより上で挿入・削除が行われたときに
増減した\nの数を数えるのが最速だと思う。
swingで速くできないレベルのプログラマなら、
自作しても遅いままだと思われ。
0323デフォルトの名無しさん2005/09/10(土) 00:21:16
タイトル表示ありでウィンドウの終了ボタン(Windowsの場合右上の×ボタン)って
非表示にできないかな?
0324デフォルトの名無しさん2005/09/10(土) 07:36:23
>>323
JInternalFrame だったらコントロールできるけど、
JFrame, JDialog とか Frame, Dialog だと無理っぽい。

どーしてもって言うなら JNI 経由で HWND 取ってきて
RemoveMenu(hwnd, SC_CLOSE, MF_BYCOMMAND);
とかするしかないと思われ。
03253142005/09/12(月) 09:44:49
レスが遅れて申し訳ないです。

>>317
>ま、行ごとの文字数をリストで持ってて、入力イベント拾って画面と同期してれば
>良いかと。
それをやってると2000行を超えたあたりから重くなるんですorz

>>318
各行の開始点っていうのは、
例えば全文の文頭から5行目の文頭へのオフセットは41とかいった感じです。

>>319
Celeronの1.7GHz+SDRAMですorz

>>322
特定の文字列を太字にする等のスタイル関連の処理の為に、
全行の文頭の位置を記憶する必要があったので、
増減した\nの数を数えるだけじゃ駄目なのですorz
0326デフォルトの名無しさん2005/09/12(月) 10:52:23
>>325
2000行程度ArryListでもLinkedListでもVectorでも遅くならないぞ
たぶん原因はそこじゃないな
03273142005/09/12(月) 15:12:47
>>326
仰るとおりでしたorz
無理して取得しない場合で何とかなる方法を試みてみたが、殆ど早くならなりませんでした。

そこで、どの部分の処理で時間を喰っているか調べてみたところ、
原因は改行コードが\r\nの場合に\nに直す処理だったみたいです。
Windows系のOSだと、getText()で文字列を取得した際、改行コードの扱いが1文字から2文字に変更され、
テキスト関連の処理で不都合が生じるため、このような処理を行っています。
String str = getText();
StringBuffer strBuff = new StringBuffer(1000);
for(int i=0;i<str.length();i++){
 if(str.charAt(i) == '\r'){
  if(str.charAt(i+1) == '\n'){
   i++;
  }
 }
 strBuff.append(str.charAt(i));
}
String text = strBuff.toString().substring(begin, end);
これ以上、直しようがないorz
0328デフォルトの名無しさん2005/09/12(月) 15:17:15
>>327
DocumentEvent 拾って挿入文字に '\r' が含まれてたらその位置を削除ってので
良いんじゃなかろうか。量がでかいなら一括でするには効率悪すぎ。
つか、"\r\n", "\r" で不具合の起きるテキスト処理というのを見直すべきでは。
03293142005/09/12(月) 16:13:38
>>328
それが、

abc
de
f

と、いう文字列は
JTextPane内で「abc\nde\nf」
と、認識されているのですが、
getText()で取り出すとWindows系では「abc\r\nde\r\nf」
っていう感じに改行コードが変換されるみたいなのです。
その為、JTextPane内では、'e'は6文字目になるのに対し、
getText()で取得したString内では、'e'は7文字目になってしまうのです。
0330デフォルトの名無しさん2005/09/12(月) 16:26:16
>>329
じゃ逆に JTextPane 内で "\n" を System.getProperty("line.separator") 文字として
カウントしてみるとか。

確かに DefaultEditorKit#write() で System.getProperty("line.separator") 取ってるのな…
マルチスレッドで何か動いてたら支障あるかもしれんが

String crlf = System.getProperty("line.separator");
System.setProperty("line.separator", "\n");
String text = getText();
System.setProperty("line.separator", crlf);
0331デフォルトの名無しさん2005/09/12(月) 16:48:51
>>327
String::replaceはダメなの?
■ このスレッドは過去ログ倉庫に格納されています