- PR -

アプレットでウィンドウのサイズを変えたとき

投稿者投稿内容
Dream
常連さん
会議室デビュー日: 2004/01/29
投稿数: 43
投稿日時: 2004-05-28 01:00
こんにちは。
J2SDK1.4.2,Tomcat 4.1.29,Struts1.1, InternetExplorer 6で開発を行っています。
今、awtベースのアプレットとswingベースのアプレットを作成しています。
両者をともにhtmlに埋め込んできれいに表示できているのですが、ただIEのウィンドウのサイズを変更した時(最大化等)に、イメージが崩れてしまいます。
これはどうやったら直るのですか?
すいませんが、よろしくお願いします。
まさ
ベテラン
会議室デビュー日: 2002/11/15
投稿数: 74
投稿日時: 2004-05-28 10:36
まさです。

現象は、AWT・Swing ともに出るんでしょうか?

最新のディスプレイドライバを入れてみてください。
これで解決されることがあります。
試してみてください。
Dream
常連さん
会議室デビュー日: 2004/01/29
投稿数: 43
投稿日時: 2004-05-28 12:40
ご返答ありがとうございます。

AWT,Swingともに崩れます。
ただ、他のページでアプレットのサンプルを見ていると、ウィンドウのサイズを変えても崩れるものと、崩れないものがあるのです。
なにかプログラミングで間違っているかもしれないと思っているのですが、
resize(),reshape(),setPreferredSize()等のメソッドは使はないと、くずれてしまうのでしょうか?
Dream
常連さん
会議室デビュー日: 2004/01/29
投稿数: 43
投稿日時: 2004-06-01 20:59
どうやってもうまくいかないのですが、
アプレットからブラウザのウィンドウが変化したという情報を取得できないのでしょうか?
ブラウザが変化するとpaint()メソッドが呼ばれているようなので、利用できないかなとも考えているのですが・・・。
スレッドを使おうかとも思ったのですが、今のアプレットはサーバーとアクセスするようになっているので、負荷がかかるのでこの方法は使わないことにしました。
Javaプラグインのバグということもチラッと読んだような気がするのですが、みなさんはアプレットをブラウザに埋め込んで使うとき、どんな実装をしているのでしょうか?

すいませんが、よろしくお願いいたします。
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2004-06-02 16:11
こんにちは、さくらばです。

引用:

Dreamさんの書き込み (2004-06-01 20:59) より:
アプレットからブラウザのウィンドウが変化したという情報を取得できないのでしょうか?
ブラウザが変化するとpaint()メソッドが呼ばれているようなので、利用できないかなとも考えているのですが・・・。



ComponentEvent を使えばウィンドウサイズの変更を知ることができますよ。

ところで、表示が崩れるというのはどのように崩れるのでしょうか。
もし、簡単なサンプルで再現可能なら、そのコードを見せていただくのが
一番なんですが。
Dream
常連さん
会議室デビュー日: 2004/01/29
投稿数: 43
投稿日時: 2004-06-02 21:48
すいません。コードをお見せするのを忘れていました。
今のところ、崩れ方が気になるSwingの方のコードをお見せいたします。

public class Example extends JApplet implements ActionListener,ItemListener{

//------------------------------------------------
// パラメーター
//------------------------------------------------
private int iconHeight;
private URL codeBase;
private URL imageURL;
private Container pain;
private JButton button;
private JLabel label;
private JFCChart chart;
private JTable table;
private ImageIcon icon;
private JScrollPane spane;
private JSplitPane sPane ;
private JScrollPane jpane;
private JPanel panel2;
private JCheckBox checkbox ;
private JSplitPane sPane2;
private JPanel panelT;
private JScrollPane tablePane;
private JPanel panel3;
private JComboBox style = new JComboBox();

//------------------------------------------------
// 初期化
//------------------------------------------------
public void init(){
super.init();
setBackground(Color.white);

try{
//-------------------
//Containerの取得
//-------------------
pain = getContentPane();
pain.setForeground(Color.WHITE);
pain.setBackground(Color.WHITE);
BoxLayout bl = new BoxLayout(pain,BoxLayout.Y_AXIS);
pain.setLayout(bl);

//-------------------------------------------------------
// グラフ画像をディレクトリから取得してラベルに貼り付け
//-------------------------------------------------------
URL imageURL = new URL("http://"+ codeBase.getHost() +":"+ codeBase.getPort()+ "/ppp/user" );
System.out.println(imageURL);
ImageIcon icon = new ImageIcon(imageURL);
icon.getImage().flush();
icon.setImage(icon.getImage());
iconHeight = icon.getIconHeight();
label = new JLabel(icon);
icon.setImageObserver(label);
label.setBackground(Color.WHITE);
spane = new JScrollPane(label,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
spane.setBackground(Color.WHITE);
spane.setPreferredSize(new Dimension(500,iconHeight));

//-------------------------------------------
// グラフ画像とテーブルをSplitPaneに貼り付け
//-------------------------------------------
sPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,true,spane,tablePane);
sPane.setOneTouchExpandable(true);
sPane.setDividerLocation(iconHeight);


//------------------------------------------------------
// Display変更リスト
//------------------------------------------------------
jpane = new JScrollPane();
panel2 = new JPanel();
panel2.setLayout(new GridLayout(goWordList.size(),2));
checkbox = new JCheckBox();

for(int i=0;i<goWordList.size();i++){
String name = String.valueOf(goWordList.get(i));
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBackground(Color.WHITE);
checkbox = new JCheckBox(name,true);
checkbox.setBackground(Color.WHITE);
checkbox.addItemListener(this);
panel.add(checkbox,"West");
panel2.add(panel);
}

jpane.setViewportView(panel2);

//-----------------------------------------------------------
// JSplitPaneとDisplay変更リストを新たなJsplitPaneに貼り付け
//-----------------------------------------------------------
sPane2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,sPane,jpane);
sPane2.setOneTouchExpandable(true);
sPane2.setDividerLocation(700);
panelT = new JPanel();
panelT.setLayout(new BoxLayout(panelT,BoxLayout.X_AXIS));
panelT.add(sPane2);
panelT.add(Box.createHorizontalGlue());

//-------------------------------------
// Change Displayボタンの作成
//-------------------------------------
JPanel panel3 = new JPanel();
//panel3.setBackground(Color.WHITE);
button = new JButton("Change Display");
button.addActionListener(this);
panel3.add(button);

//---------------------
// コンテナに貼り付け
//--------------------
pain.add(Box.createVerticalGlue());
pain.add(panelT);
pain.add(Box.createVerticalGlue());
pain.add(Box.createVerticalGlue());
pain.add(panel3);
pain.add(Box.createVerticalGlue());

}
catch(Exception e){
e.printStackTrace();
}

}

public void paint(Graphics g){
super.paint(g);
}
・・・・

  このような感じになっています。
  アプレットとして表示される領域が大きめなので、ブラウザ(IE6)でスクロールさせると、時々白い線が入ったり、イメージが一部欠けてしまいます。また、アプレットが一部隠れるような状態にブラウザのウィンドウを小さくしておいてから、ブラウザを最大化させるとアプレットのイメージは完全に崩れてしまいます。
これは、IEだけの問題なのでしょうか?
ちなみに、このアプレットは<jsp:plugin>タグを用いて埋め込んでいます。

すいませんが、よろしくお願いいたします。




さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2004-06-03 18:16
こんにちは、櫻庭です。

ちょっと勘違いをしていました。本当にアプレットのサイズを変えるのだと思ってまし
た。ブラウザのサイズを変えるのであって、アプレットのサイズは変更しないのですね。

引用:

Dreamさんの書き込み (2004-06-02 21:48) より:
アプレットとして表示される領域が大きめなので、ブラウザ(IE6)でスクロールさせると、時々白い線が入ったり、イメージが一部欠けてしまいます。また、アプレットが一部隠れるような状態にブラウザのウィンドウを小さくしておいてから、ブラウザを最大化させるとアプレットのイメージは完全に崩れてしまいます。
これは、IEだけの問題なのでしょうか?



Java Plug-in の問題のような気がします。appletviewer では現象を再現できません
でした。どうもちゃんと dirty regeon がちゃんと設定されておらず、そのために再
描画されてないように見受けられます。

ちょっとパフォーマンス的には悪くなるのですが、paint メソッドを次のように変更
してみてください。私のところではこれで現象はでなくなりました。

コード:
    public void paint(Graphics g){
	repaint();    // ここを追加しました
	super.paint(g);
    } 



# ちなみに J2SE 1.5 だと崩れませんでした。ただ、スクロールさせたときにちらつい
# てしまいますが
Dream
常連さん
会議室デビュー日: 2004/01/29
投稿数: 43
投稿日時: 2004-06-03 21:23
さくらばさん、ご連絡ありがとうございます。

一応、void paint()メソッドの中にrepaint()を入れて試してみたことがあるのですが、
確かにスクロールしても、最大化しても崩れませんでした。
ただ、どうもrepaint()がpaint()を呼んで、またpaint()を呼ぶという、無限ループに入ってしまっているためか、タスクマネージャを開いてパフォーマンスを見ると、CPU使用率が50%にもなってしまっています。どうしましょう・・・(困)。

---------------------------------------------------------------------------
Java Plug-in の問題のような気がします。appletviewer では現象を再現できません
でした。どうもちゃんと dirty regeon がちゃんと設定されておらず、そのために再
描画されてないように見受けられます。

# ちなみに J2SE 1.5 だと崩れませんでした。ただ、スクロールさせたときにちらつい
# てしまいますが
----------------------------------------------------------------------------

ありがとうございます。
アップグレードして試してみたいと思います。
それと、確かにJava-Pluginの原因かもしれませんね。
Pluginをいじる方法とかないんでしょうかね?

どうも、コンポーネントの中にたくさんのコンポーネントをつめているのが悪いのか、
splitpaneを外してコンテナにスクロールペインを貼り付けるように切り替えると、スクロールしたときの現象が少し緩和したような感じになりました。

もうチョッと格闘してみます。なにかわかりましたら、またお教えください。
よろしくお願いします。



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