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

Java標準低速GUI 6 AWT/Swing

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/09/26(水) 20:51:18
ハードウェアの高スペック化、描画アルゴリズムの変更、JavaVMの高速化に伴い、パフォーマンスの問題は改善されています。
しかしながら、"Java"というだけで未だに敬遠されるのが現状。
そんなSwingと引き続き付き合っていくみんなのスレッドです。
Java低速GUI Swing 5 (前スレ)
http://pc11.2ch.net/test/read.cgi/tech/1161139809/
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
0755デフォルトの名無しさん2007/12/26(水) 13:14:07
呼び出し元なら普通に昔からあるけど。
0756デフォルトの名無しさん2007/12/27(木) 00:09:33
あるオブジェクトをある場所に移動させていきたい時に、
オブジェクトのxとyを少しづつ変化させているんですけど、どうやるのがベターですかね?
オブジェクトはいろんな場所に発生するので、
if (x > 行き先X) {
0757デフォルトの名無しさん2007/12/27(木) 00:10:11
すいません 途中でした。
続き
if (x > 行き先X) {
0758デフォルトの名無しさん2007/12/27(木) 00:13:28
すいません 途中でした。
続き
if (x > 行き先X) {
x -= 5;
} else {
x += 5;
}
if (y > 行き先Y) {
y -= 5;
} else {
y += 5;
}
こうやってるんですけど、こうするとxかyのどちらかが行き先に到達した場合に、
ぷるぷる震えた感じになっちゃうんですけど、なにかうまい方法ありますかね?
0759デフォルトの名無しさん2007/12/27(木) 00:13:37
それはSwingの問題なのか??
0760デフォルトの名無しさん2007/12/27(木) 00:15:21
単に行き先Xや行き先Yが5の倍数じゃないんじゃね?
07617582007/12/27(木) 00:18:36
>>760
そうですちょうど倍数じゃないときで、移動距離を1にしたくない場合、
どういうロジックが考えられますか?
0762デフォルトの名無しさん2007/12/27(木) 00:34:37
>>761
それぐらい、自分で考えろよ・・・・
つかスレ違い。
0763デフォルトの名無しさん2007/12/27(木) 00:40:10
Math.abs() 絶対値
差が5に満たない場合
差の分だけ移動
既に目的地に到達してたら チェックはしない。
移動距離の5は定数にしようかな

思った事を書いてみた。
俺は寝る、がんばれ。
07647582007/12/27(木) 00:41:06
そうですか
表示上の問題だと思ったんでここで聞いたんですが・・・
xflagとyflagを作って、&で到達チェックするとか考えたんですけど、
スマートじゃないんですよね
たとえばどんなのが考えられますかね?
07657582007/12/27(木) 00:43:12
>>763
ありがとうございます
とても参考になりました
0766デフォルトの名無しさん2007/12/27(木) 00:45:01
>どういうロジックが考えられますか?

って自分で聞いてるぐらいだからSwingの問題じゃなくてアルゴリズムの問題だろ。
0767デフォルトの名無しさん2007/12/27(木) 00:51:43
そうですね
javaのスレッドで聞いたほうが良かったですね
答えてくれた方ありがとうございました。
0768デフォルトの名無しさん2007/12/27(木) 01:03:08
java関係ないし
問題の切り分けに注意しないと間違ったスレでは歓迎されないぞ
0769デフォルトの名無しさん2007/12/27(木) 01:14:11
そうですか
初心者スレッドで聞けばよかったですか
いえばただの簡単なアルゴリズムの問題なのですが、
ここなら同じようなことをやっている人がいるかなと思ったんで、
ここで聞いたほうが早いかなと思ってしまいました。
0770デフォルトの名無しさん2007/12/27(木) 01:17:26
初心者は初心者らしく初心者スレで聞こうな。
まあ、その前にこの程度のロジックは自分で考えられないと、
なにを作るにしても困ると思うぞ。
0771デフォルトの名無しさん2007/12/27(木) 01:33:38
というか普通に高校の物理の問題じゃないかこれ?
そこまでのアルゴリズムじゃないけど。
0772デフォルトの名無しさん2007/12/27(木) 01:36:47
物理?!

どう見ても小学生の算数レベルだろ。
07737582007/12/27(木) 01:39:19
強引にやろうと思えばできると思うんですが、
スマートにできないんですよね(馬鹿なんで)。
完璧を目指すのはキリがないと思うんですが、
ある程度きれいなコードが知りたいんですよ。

ttp://pc11.2ch.net/test/read.cgi/tech/1197710566/
ここに移動したんで良かったらいいサンプルコードお教えください。
0774デフォルトの名無しさん2007/12/27(木) 01:43:05
>>769
>ここで聞いたほうが早いかなと思ってしまいました。
こんなのを自分で考えられないとしたら先は長い気がするが…
まぁ地道にがんばれ!
0775デフォルトの名無しさん2007/12/27(木) 02:06:16
ベーマガとか初心者向き雑誌がないと大変なのかなーとかおもっちまった
こういうの当時の小学生は普通に作ってたもんね
0776デフォルトの名無しさん2007/12/27(木) 02:18:59
HSP使ってる連中も普通に作ってるぞ。
というかゲームにSwing使ってるの?
0777デフォルトの名無しさん2007/12/27(木) 02:20:55
Java2Dを使うことはあるかもしれないが、Swingはあんまつかわないだろうね
ただ、ここAWTと合流したからJava2D等も含むといえば含む

本気でやるならJOGLだろうけど
0778デフォルトの名無しさん2007/12/27(木) 02:26:13
本当だ!!
いつの間にかスレタイにAWTが入ってた!!
0779デフォルトの名無しさん2007/12/27(木) 02:32:45
JOGLの正式版が出たときプレイアブルな2DデモとGLCanvasに描画するJMFのレンダラを組んだけど
いまじゃJOGLはjava2Dとパイプラインが統合されてんだよね。

OpenGLの関数使いたいわけじゃないなら-DオプションでOpenGL使うようにした方が楽かね?
それならわざわざ2D描画に3Dtoolkit使う必要ないし。

バグさえ消えれば。
0780デフォルトの名無しさん2007/12/27(木) 04:23:20
javax.swing.timerなんですけど
↓の様にやること多いじゃないですか
このタイマーをストップさせることって可能ですか?
public void startTimer() {
 int i = 0;
 Timer timer = new Timer(20, new ActionListener() {
  public void actionPerformed(ActionEvent e) {
   if (i > 100) {
    return;
   }
   i++;
 });
 timer.start();
}
いままで↑のような感じでiが100超えたらリターンするようにしてたんですが、
ずっとタイマーは動きっぱなしなんですよね。
timerはiが100を超えたらストップさせたいんですよ。
timer内から自分自身をstopさせることができればいいんですが...
0781デフォルトの名無しさん2007/12/27(木) 07:13:18
まぁ、とりあえず読みなさい。
http://java.sun.com/javase/ja/6/docs/ja/api/javax/swing/Timer.html
07827802007/12/27(木) 07:55:23
そこも含めていろいろググったんですが...
実際のコーディングを見てください

まずメインクラスでクラスAのインスタンスaを10個作る(略
pubilc void run { //メインループ
 for(int i=0;i<10;i++){    //a[0]からa[9]のxを増やしていき、xが10になったらstartTimer()をplay
  a[i].x++;
  if(a[i].x >= 10) {
   a.startTimer();
  }
  �@
 }
}
pubilc class A {
 int x = 0;
 int size = 10;
 public void startTimer() {
  Timer timer = new Timer(20, new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    if (size> 20) {
     return;
    }
    size++;
  });
  timer.start();
 }
}
実際はa[0]が増分し終わったらa[1]にいったり、同時に動いたりするんですが...
�@の部分で判定してtimer.stopさせようとしてもすぐストップしてしまうと困るし、
メインループからはtimerがいつ終わるのかわからないのでストップできないんですよね
なにか大きな間違いがあるんでしょうか?
0783デフォルトの名無しさん2007/12/27(木) 08:37:43
Timer#stop()を呼べば止まると分かっているのなら、
後は変数のスコープの問題。
ローカル変数timerをクラスAのインスタンス変数にして、
こんなメソッドを作って
public void stopTimer(){
 timer.stop();
}
これをactionPerformed()内の適切な位置で呼べばいい。

ところでこのサンプルコード、Timerでやってる処理がi++だけなんだが、
これは単純化したサンプルコードなだけだよね?
ホントのコードでは、ちゃんとGUIスレッドですべき処理をしてるんだよね?
0784デフォルトの名無しさん2007/12/27(木) 08:53:05
ああうまくいきました
GUIスレッドですべき処理というのがいまいちわかんないんですが、
ある条件でaのエフェクトを起こすみたいな感じなんですよ
とにかくこれで寝れます どうもありがとうございました
0785デフォルトの名無しさん2007/12/27(木) 10:45:15
ボタンのイベント中にタイマーの時間が来たり、その逆も有ったりするって意味じゃね。
0786デフォルトの名無しさん2007/12/27(木) 12:26:40
>>783
swing.TimerはEDTでactionPerformed呼ぶからそのへんは大丈夫と思
0787デフォルトの名無しさん2007/12/27(木) 13:29:19
>>779
Java2Dだとαブレンディング/テストとか足りないものが多いから
2DであってもOpenGL使わざるを得ないのが現実

>>785が正解
あと注意すべきところはSwingTimerは定期処理にはいいけど、
長時間の流れがある処理には向かないというのもおぼえておくとよろし

あくまでも一定時間ごとにアクションイベントを発生させるだけ
詳しく見てないけどSwingFrameworkでjavax.swing.Timerも扱えるんかな?
0788デフォルトの名無しさん2007/12/27(木) 22:23:18
Javaで動画を再生しようと思っているのですが(Macも含める)
・JMFだとMacで再生出来ない。
・QuickTime for JavaだとLinuxで再生出来ない。
という認識はあっていますでしょうか?
0789デフォルトの名無しさん2007/12/27(木) 22:41:37
JMFのクロスプラットフォーム版を含めるなら間違ってる。
というかこれくらい人に聞かずとも分かるだろ。
0790デフォルトの名無しさん2007/12/28(金) 00:08:21
>>789
ttp://www.animoids.com/jmf_for_mac.html
「JMF_2_1_1_mac.zip」の部分から、
もしかしてMac用がどこかで配布されているのかと勘違いしてしまいました。
0791デフォルトの名無しさん2007/12/28(金) 03:27:55
検索するとそこヒットするんだよね。

JMFはjava動かすスペックと動画デコードするスペックを
ダブルで要求するからネイティブ版でもいろいろすると重いぞ。

単純なラッパーだからwin版はバグだらけだし。
0792デフォルトの名無しさん2007/12/28(金) 08:46:22
>>790
こんなの見つけたぞ
ttp://www.sra.co.jp/people/nisinaka/Jun4Java/index_ja.html
0793デフォルトの名無しさん2007/12/28(金) 15:55:29
2004年から更新してないとか心配なんだけど、
なんでどこも投資して開発を続けないんだろう
0794デフォルトの名無しさん2007/12/28(金) 16:06:51
こんなところでじゅんを見る事になるとは・・・。
0795デフォルトの名無しさん2007/12/30(日) 16:40:20
JFileChooserにおいて、ダイアログ表示時のデフォルトの名前を指定するにはどうすればよいでしょうか?
0796デフォルトの名無しさん2007/12/30(日) 16:55:09
setSelectedFile() で指定してから表示
0797デフォルトの名無しさん2007/12/30(日) 16:57:49
JFileChooser#setSelectedFile(File)
0798デフォルトの名無しさん2007/12/30(日) 17:14:41
ありがとうございました!
0799デフォルトの名無しさん2007/12/31(月) 00:16:16
NetBeans入れたら超もっさり動作でがっかりした。
結局今はEclipseにもどりますた。
SwingアプリがSWTアプリみたいに比較的ストレスなく動いてくれる日はマダ来ないのかね。
0800デフォルトの名無しさん2007/12/31(月) 00:25:30
もっさりとかストレスなく動くとかってのは主観的なものだから、
>>799の気分次第で明日にでも来るし、永遠に来ない事もありうる
0801デフォルトの名無しさん2007/12/31(月) 00:57:01
>>799
マシンのスペックはいかほどで?
0802デフォルトの名無しさん2007/12/31(月) 00:58:07
JavaはマイナーCPUに冷たいだろうし
マイナーGPUにも冷たいのかもしれんね
0803デフォルトの名無しさん2007/12/31(月) 01:02:44
CやC++なら温かいともいえないんじゃね?
0804デフォルトの名無しさん2007/12/31(月) 01:16:32
>>802
Java使ってるSWTもマイナーCPUやマイナーGPUに冷たいって事に?
0805デフォルトの名無しさん2007/12/31(月) 01:17:10
>>802
SPARCにも冷たいって事に?
0806デフォルトの名無しさん2007/12/31(月) 01:20:05
>>804はスルーするが、>>805は許せん。
0807デフォルトの名無しさん2007/12/31(月) 01:42:32
今時はお世辞にもメジャーとは言い難い。
0808デフォルトの名無しさん2007/12/31(月) 14:16:14
いまさらSPARCもねえだろ
0809デフォルトの名無しさん2007/12/31(月) 15:29:10
金にいとめをつけずWinで最速のマシンもってくれば、Javaでもかなり高速動作するんじゃないの。
0810デフォルトの名無しさん2007/12/31(月) 15:33:56
既存のコンポーネントにアクションを付加したい場合どのような手段を取るのが比較的単純に済むでしょうか?

例えば、JTreeでCtrl+Fで検索のアクションをさせたい場合などです。
0811デフォルトの名無しさん2007/12/31(月) 17:44:54
>>810
適当なコンポーネントの ActionMap と InputMap に登録すればいいだろ。
0812デフォルトの名無しさん2007/12/31(月) 18:07:49
JFileChooserののろさにガックリ
0813デフォルトの名無しさん2007/12/31(月) 18:15:44
>>368 あたりで話題になってる不具合のせいかも?
0814>>8102007/12/31(月) 18:36:09
InputMapを知りませんでした。
こんな簡単に実現できるなんてSwingは本当にすごいですね。
ありがとうございました。
0815デフォルトの名無しさん2008/01/01(火) 02:16:39
>>799
いつものネガティブキャンペーン乙

6.0だとEclipseのほうが軽いとかってありえんだろ
SWTはスレ違いだからそっちでやってくれ
0816デフォルトの名無しさん2008/01/01(火) 02:28:13
今更釣られるアホは寝てろ
0817デフォルトの名無しさん2008/01/01(火) 08:17:29
たしかに起動に関してはnetbeansめっちゃ遅いよな
0818デフォルトの名無しさん2008/01/02(水) 02:11:59
何もプラグイン入れなければ、Eclipseは軽いね。
0819デフォルトの名無しさん2008/01/02(水) 02:17:51
Java EE フルセット入れた Eclipse のもっさりと不安定さはすさまじいものがある。
sysdeo の Tomcat プラグインと JSP, XML の構造化エディタ程度ならめちゃめちゃ軽い。
必要なものを選択できる人間だけが楽できる。
0820デフォルトの名無しさん2008/01/02(水) 03:15:40
>>819
インストールしてもプラグイン無効にすればいいんじゃね?
0821デフォルトの名無しさん2008/01/02(水) 22:26:40
swingのコピペを調べてたんだが。

CTRL+X -> CTRL+V で「切り取り -> 貼り付け」した時に、
貼り付け後に、余計なオブジェクトを削除するための後処理はexportDoneでいいんだろうか?
なぜか、CTRL+Xを押した瞬間に、exportDoneが実行されちゃうんだ。

exportDoneの説明には、
>データのエクスポート後に呼び出されます。このメソッドは、アクションが MOVE の場合に転送されたデータを削除します。
>MOVE はこの実装にサポートされるアクションでないため、このメソッドの実装では何も行われません。getSourceActions には MOVE が含まれません。

どっちやねんw
08228212008/01/02(水) 22:28:33
今のところ、対処方法が分らないので、exportDoneの中では何もせず、
importDoneの中で、貼り付け操作完了後に、
自分で削除操作を実行しようかなと思ってる。
08238212008/01/03(木) 00:34:28
なにをバカなことを!

切り取りの標準的な操作は、切り取りと同時に削除だろうが!

エクスプローラの動作が特殊なんだ!
新年早々はずかしぃぃぃぃぃぃぃぃぃぃぃぃ!!!!!!!!!!
0824デフォルトの名無しさん2008/01/03(木) 03:16:52
エクスプローラの動作は、CUTというよりPREPARE-MOVEだからな。
0825デフォルトの名無しさん2008/01/05(土) 20:53:44
>>817
終了はめっちゃ速いのだが。
0826デフォルトの名無しさん2008/01/06(日) 23:23:28
jdk1.6.0u3
import java.awt.Frame;
これってバグなの?
0827デフォルトの名無しさん2008/01/06(日) 23:33:55
      ___    ━┓
    / ―\   ┏┛
  /ノ  (●)\  ・
. | (●)   ⌒)\
. |   (__ノ ̄  |
  \        /
    \     _ノ
    /´     `\
     |       |
     |       |

           ___   ━┓
         / ―  \  ┏┛
        /  (●)  \ヽ ・
       /   (⌒  (●) /
       /      ̄ヽ__) /
.    /´     ___/
    |        \
    |        |
0828デフォルトの名無しさん2008/01/06(日) 23:49:08
>>827
分かる人にはこれだけで分かる
0829デフォルトの名無しさん2008/01/06(日) 23:53:32
>>827
>>828
バグってたのは俺のほうだったw
*.class 削除したらコンパイル通ったよww
0830デフォルトの名無しさん2008/01/07(月) 00:55:29
どういう環境だよ・・・
0831デフォルトの名無しさん2008/01/07(月) 01:26:16
>>830
http://pc11.2ch.net/test/read.cgi/tech/1197710566/646
だろう。
0832デフォルトの名無しさん2008/01/07(月) 11:20:26
テストするならTestFrameとかにすべし
0833デフォルトの名無しさん2008/01/07(月) 12:55:58
>>831
よくみつけてきたな
0834デフォルトの名無しさん2008/01/09(水) 03:57:38
相変わらず質問スレは気持ち悪いな
0835デフォルトの名無しさん2008/01/09(水) 17:58:19
import java.util.*;
import javax.swing.*;
public class NewJFrame2 extends javax.swing.JFrame {
List<String> dummyList = new ArrayList<String>();
JList jList;
public NewJFrame2() {
setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE);
JScrollPane jScrollPane = new JScrollPane();
jList = new JList();
jScrollPane.setViewportView(jList);
getContentPane().add(jScrollPane, java.awt.BorderLayout.CENTER);
for ( int i=0; i<300; i++ ) {
StringBuilder sb = new StringBuilder();
int max = (int)(Math.random() * 100 + 1);
//int max = 20;
for ( int j=0; j<max; j++ ) sb.append("A");
dummyList.add(sb.toString() + " " + i);
}
jList.setModel(new AbstractListModel() {
public int getSize() { return dummyList.size(); }
public Object getElementAt(int index) {
return dummyList.get(index);
}
});
pack();
}
public static void main(String args[]) {
new NewJFrame2().setVisible(true);
}
}
0836デフォルトの名無しさん2008/01/09(水) 18:01:42
JListのカーソルキーによるスクロールことで謎があるので投げてみる。

>>835のプログラムなんだけど、単純にJListの中に300個のダミーデータを入れている。

カーソルキーで下にスクロールしていき、数十行進んだら、こんどは上に10行くらい
スクロール。
そしたらまたカーソルキーで下に移動。
すると、選択されてる項目が一瞬で画面の下までジャンプしてしまう。
このプログラムで、maxを20とか一定の値にした場合はジャンプしない。
JListの各セルの文字列長をランダムに変えたものを入れるとこの現象が起きる。
こういう仕様なのかもしれないけど、一瞬で選択位置が飛ぶと、
目線がそれてしまうので操作感がよくない。
maxを固定したときのように動作してほしい。
なんとかする方法ないかなぁ?
0837デフォルトの名無しさん2008/01/09(水) 19:57:24
>>836
解決法でないのだが、「ジャンプ」の条件について。
固定長かどうかではなく、Viewport の外に描画域があるかないか、ではないのか、と。

固定長で横スクロールが出るようにしたときは「ジャンプ」するし、
固定長でなくても、横スクロールが出ないときは「ジャンプ」しない。

JScrollPane で横スクロールを非表示にしても、見えない部分があるときは「ジャンプ」する。
0838デフォルトの名無しさん2008/01/10(木) 16:05:46
フレームの横サイズを水平スクロールバーが出なくなるまで広げてやればジャンプはしないな。
しかしちょっと設定をいじくったぐらいでは解決しそうない。
オーバーライドして一部の機能を殺すとか。
0839デフォルトの名無しさん2008/01/10(木) 18:27:36
↓このバグだと思うよ。7で直ってるらしい。
http://bugs.sun.com/view_bug.do?bug_id=6568906
http://bugs.sun.com/view_bug.do?bug_id=6510999
0840デフォルトの名無しさん2008/01/10(木) 18:57:44
バージョンアップを待つのが一番楽そうだね
0841デフォルトの名無しさん2008/01/10(木) 19:27:17
よく見つけてくるな。すげーよ。
0842デフォルトの名無しさん2008/01/10(木) 21:33:46
有名なバグだぞ。
JListに512個要素突っ込むとバグるとか放置されてるし。
0843デフォルトの名無しさん2008/01/10(木) 22:03:23
>>842
2000個いれてみたけど、なにかバグあんの?
0844デフォルトの名無しさん2008/01/10(木) 22:52:30
512個入れて、一番したのアイテム選択してCTRL+B

これで、すべてのアイテムが2個ずつになって1024個になるというステキなバグ
0845デフォルトの名無しさん2008/01/10(木) 23:06:27
1から10000までの数字を全部掛けたときに
末尾に並ぶ0の個数を求めるのをJavaでおながいします
0846デフォルトの名無しさん2008/01/10(木) 23:10:36
それはSwingに関係あるのか?
0847デフォルトの名無しさん2008/01/10(木) 23:16:39
>>844
バグが出なかったんだけど
他になんか条件ないの?
0848デフォルトの名無しさん2008/01/10(木) 23:17:55
>>845

class Test{
static void main () {
cnt5 = 0;
for (int i = 1;i <= 10000; i++)
if(i % 5 == 0)
cnt5++;
System.out.println("count" + cnt5);
}
}
0849デフォルトの名無しさん2008/01/10(木) 23:22:25
ああ、5から5ずつ足してくから10000/5=2000か?
0850デフォルトの名無しさん2008/01/10(木) 23:48:27
10を素因数分解して2*5。んで、2は大量に有るから、5だけ数えれば良い、と。
0851デフォルトの名無しさん2008/01/10(木) 23:51:27
どの道>>848は間違ってるわな
0852デフォルトの名無しさん2008/01/11(金) 00:07:08
>>850
i%25 とか i%125 も数えなきゃだめじゃね?
0853デフォルトの名無しさん2008/01/11(金) 00:07:36
どのみちグズグズっぽいんだが。
0854デフォルトの名無しさん2008/01/11(金) 00:15:22
スレチだからまぁ。妖精現実を引っ張ってお茶を濁すべ
つ ttp://deztec.jp/x/05/faireal/faireal-26-index.html
0855デフォルトの名無しさん2008/01/11(金) 00:19:54
いかにロジカルに解くかが課題じゃなけりゃ BigDecimal で階乗求めて数えた方が早い。
実用に問題ないレベルならシンプル記述に徹するのも美学。
■ このスレッドは過去ログ倉庫に格納されています