- PR -

効率の良い描画方法とは?

投稿者投稿内容
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-08-22 17:38
ども、ほむらです、
やっとコンパイルもとおりやれやれと思っていたら
こんどはイベントが一切発生せず。。。(涙です^^;;;;
スレッドを使用してフォーカスの移動ッポいことをテストしてみましたが
現象は再現しませんでしたやっぱり。イベントでないとダメなのかな〜
メッセージもらえればソース送ります。(アプレット用ですが^^;;;;;)
--------------
最初から読み返していてふと思ったのですが。。。
offGraphicはフォーカスの喪失時、ちゃんと初期化しているのかな?とか
思ってみたりして
参考:
引用:

ほむら様より引用
>ここでいう永続とは次回paint()が呼び出されるまで残るかどうかということです。
はい。例えばフォーカス取得時、新たな文字列を描画しスクロール開始するのですが、
描画が失敗しているのか古い文字列が残ったまま、その上を新しい文字列がスクロールして
しまいます。
しかし、そのパネルがフォーカスを失うとパネルにrepaint()が行われ正常に描画されます。
ですから、ほむら様の"次回paint()が呼び出されるまで残るかどうか"という質問には、ハイ
次回repaint()が呼ばれるまで残ります。

ボム
ベテラン
会議室デビュー日: 2003/07/25
投稿数: 61
投稿日時: 2003-08-22 19:23
かずくん様、ocean様、ほむら様、ご意見ありがとうございました。

皆様のご意見になかなか私がついていけず、全ての事に対処できていないことをお詫びします。
本当にすみません。

このままだと質問者の私が置いていかれそうなので、このスレッド(私の問題)はここで終了させていただきます。
皆様からの貴重なご意見は時間がかかっても必ずテストします。
本当にありがとうございました。
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-08-22 20:22
Casper様>
先日は、大変申し訳ありませんでした。明快な回答をご提供できなかったのは
まったくもって私の力不足です。
整理できた時点で、経過報告や質問をしていただければ私も嬉しく思います。
頑張ってください。

# ひっそり追記です。
# ocean様のフォーカス取得ソース+スクロールサンプルを試作してみました。
# そのままrunメソッドを入れ50mSec間隔で再描画するとチラツキが発生してしまい
# ますが、MeFrameクラスにupdateメソッドを追加することにより、チラツキが抑えられる
# ようです(iMac G3 350MHzで確認済みです)。
# 以下、実験したソースです(ご参考)。
コード:

import java.awt.*;
import java.awt.event.*;

public class sample7{

public static void main (String [] args){
frames f = new frames ();
f.addWindowListener (new WindowAdapter (){
public void windowClosing (WindowEvent e){
System.exit (0);
}
});
f.setSize (1000, 400);
f.show ();
}

}

class frames extends Frame{

frames (){
setLayout (new GridLayout (2, 5));
for (int i = 0;i < 10; i++){
add (new panels ("Panel" + i));
}
}

public void update (Graphics g){
paint (g);
}

}

class panels extends Component implements Runnable{

private int gWidth = 200;
private int gHeight = 200;
private Image image1, image2, currentImage, offImage;
private Graphics offGraphics;
private Thread thread;
private String text;
private String currentText;
private int px = 240;
private static Font font = new Font ("Serif", Font.BOLD, 20);
private boolean setInit = false;

public panels (String mtext){
enableEvents (AWTEvent.MOUSE_EVENT_MASK | AWTEvent.FOCUS_EVENT_MASK);
MediaTracker tracker = new MediaTracker (this);
image1 = Toolkit.getDefaultToolkit ().createImage (getClass ().getResource ("1.jpg"));
image2 = Toolkit.getDefaultToolkit ().createImage (getClass ().getResource ("2.jpg"));
tracker.addImage (image1, 0);
tracker.addImage (image2, 0);
text = mtext;
try{
tracker.waitForAll ();
}
catch (InterruptedException ex){
}
handleFocus (false);
thread = new Thread (this);
thread.start();
}

public void paint (Graphics g){
if (!setInit){
offImage = this.createImage (gWidth, gHeight);
offGraphics = offImage.getGraphics ();
setInit = true;
}
offGraphics.clearRect (0, 0, gWidth, gHeight);
offGraphics.drawImage (currentImage, 0, 0, gWidth, gHeight, this);
offGraphics.setColor (Color.white);
offGraphics.setFont (font);
offGraphics.drawString (currentText, px, 90);
g.drawImage (offImage, 0, 0, this);
}

public void run (){
boolean j = true;
try{
while (j){
Thread.sleep (50);
--px;
if (px < -80) px = 240;
repaint ();
}
}
catch (Exception e){
}
}

private void handleFocus (boolean value){
if (value){
currentImage = image2;
currentText = text;
}
else{
currentImage = image1;
currentText = "";
}
repaint ();
}

public boolean isFocusTraversable (){
return true;
}

protected void processMouseEvent (MouseEvent e){
if (e.getID() == MouseEvent.MOUSE_PRESSED){
requestFocus ();
}
super.processMouseEvent (e);
}

protected void processFocusEvent (FocusEvent e){
switch (e.getID()){
case FocusEvent.FOCUS_GAINED:
handleFocus (true);
break;
case FocusEvent.FOCUS_LOST:
handleFocus (false);
break;
}
super.processFocusEvent (e);
}

}


[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-08-24 01:34 ]

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-08-24 20:44 ]
ボム
ベテラン
会議室デビュー日: 2003/07/25
投稿数: 61
投稿日時: 2003-08-25 09:10
Ken-Lab様、ご意見ありがとうございました。

Ken-Lab様より引用**************************************************************
>先日は、大変申し訳ありませんでした。明快な回答をご提供できなかったのは
>まったくもって私の力不足です。
Ken-Lab様のご意見の中で、それだけは違うと言えます!
明快な質問をご提供できなかったのは、まったくもって私の理解不足です。

>整理できた時点で、経過報告や質問をしていただければ私も嬉しく思います。
Ken-Lab様のご親切、本当に感謝します。
実は現在、以前Ken-Lab様からのご意見にあったメインパネルとサブパネル10枚を
同時に描画する事をまだ行っております。

いつかKen-Lab様のような回答者になれるよう、がんばります!!

スキルアップ/キャリアアップ(JOB@IT)