アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつも、お世話になっております。

JScrollPaneを使って、大きなサイズのJpanelを表示しようとしていますが、Jpanelのheightが770ピクセルを超えたあたりから、上で表示したものが重なって表示されてしまったりして、正常に表示できなくなってしまい困っています。

Jpanelでは文字や線などを描画して表示しているので、ダブルバッファリングしていないのかと考え、調べてみましたが、ダブルバッファは行っていました。

回避する方法等をご存知でしたら、教えていただけないでしょうか。

宜しくお願い致します。

A 回答 (3件)

簡単に。


---

>回避する方法等

下記参照。


>ダブルバッファリングしていないのかと考え

単に「ダブルバッファリングする」と言っても
その意味するところがはっきりしません。


>770ピクセルを超えたあたりから

768?
------

/*
<html><body>
<applet code=TestScroll width=100 height=400></applet>
</body></html>
*/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class TestScroll extends JApplet{
public void init(){
final TestPanel tp = new TestPanel();
tp.setPreferredSize(new Dimension(TestPanel.W, TestPanel.H));
getContentPane().add(new JScrollPane(tp));
JButton b=new JButton("add");
getContentPane().add(b,"South");
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
tp.add();
}
});
}
}


class TestPanel extends JPanel {
public static int W = 100;
public static int H = 3600;

Vector v=new Vector();

public void add(){
v.addElement("図形 "+v.size());
repaint();
}

public void paintComponent(Graphics g){
super.paintComponent(g);
int h=20;
for(int i=0;i<v.size();i++){
g.drawString((String)v.elementAt(i),0,h*(i+1));
}
}
}
    • good
    • 0
この回答へのお礼

載せて頂いたコードを参考に修正して解決しました。ありがとうございました。

お礼日時:2006/06/28 09:26

似たような経験があります。

が、JPanelを大きくした時ではなくて、それまでよりも(JScrollPaneの枠よりも)狭い領域に描画領域を変更した時に発生したように記憶してます。
JPanelのpublic void paintComponent(Graphics g){}内で、目的の絵を描く前に、JPanel全体を塗りつぶして対処しました。

あと、私の場合、実際には、JSplitPaneの左右にJScrollPaneを載せて
片方のJScrollPaneには、ボタンなどを配備したJPanelを、もう一方は、描画用にJPanelを載せていて、
描画用の方のJScrollPane枠との隙間に対側のボタンが写り込む現象があったのですけど
JSplitPaneとの兼ね合いもあったかもしれません。
ボタン配備側でrepaint()が発生した時にはJSplitPaneの両側のJPanelをrepaint()するようにしたら写り込みは発生しないようでした。
あと、setPreferredSizeも設定しておいた方が良さそうです。これはJSplitPaneに載せる時の問題だったかもしれませんけど。

その後発生してないのと、古いソースも残してはあるのだけど、もういちど戻そうとしたら
うまく実行出来なくて、どのソースで再現出来たか、どれが最適解か解らなくなってしまいました。

大体の実行状況が解る程度にソースを載せてみられてはいかがでしょう。

この回答への補足

ありがとうございます。
テスト用に作った文字を出力する簡単なPGを載せさせていただきます。ダブルバッファリングをしているところでも、下のほうでは再表示がうまくできません。

/*
TestScrollクラス(TestPanelを呼び出す)
*/
import java.awt.*;

import javax.swing.*;

public class TestScroll extends JApplet {

private Dimension dimCol1;

public void init(){
try{

Container contentPane = getContentPane();
TestPanel tp = new TestPanel();

dimCol1 = new Dimension(100, 900);
//System.out.println(pnlShain.getHeight());
tp.setPreferredSize(dimCol1);

JScrollPane scrollPane = new JScrollPane( tp ); // スクロールペイン
scrollPane.setBackground(Color.white);

contentPane.add( scrollPane );


}
catch(Exception e){
JOptionPane.showMessageDialog(null, e.getMessage());
}
}


}

/*
TestPanelクラス(スクロール内部に表示する)
*/

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JPanel;
import javax.swing.RepaintManager;

public class TestPanel extends JPanel {

private int PANEL_WIDTH = 100;//パネル幅
private int PANEL_HEIGHT = 900;//パネル高さ


public void paint(Graphics g){

//リペイントマネジャーを用いてダブルバッファを取り出す
RepaintManager rm = RepaintManager.currentManager( this );
//Image offImage = rm.getOffscreenBuffer(this, PANEL_WIDTH+5, PANEL_HEIGHT+5);
Image offImage = rm.getOffscreenBuffer(this, PANEL_WIDTH, PANEL_HEIGHT);
Graphics offGraphics = offImage.getGraphics();

//背景色を白にする
offGraphics.setColor(Color.white);
offGraphics.fillRect(0, 0, PANEL_WIDTH, PANEL_HEIGHT);

//文字出力
for(int i=0; i<=40; i++)
{
offGraphics.setColor(Color.black);
offGraphics.drawString(i+"a", 4, i*20);

}

g.drawImage(offImage,0,0,this);
offGraphics.dispose();
}
}

補足日時:2006/06/18 14:51
    • good
    • 0

スクロールメソッドがデフォルトのままではダメだったかもしれません。

Sun によると、そういう「仕様」とのことだとどこかに書いてあった記憶があります。
具体的には、

JScrollPane x;

...

x.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE);

のように指定すれば良かったかもしれません。
これらのメソッド名や定数でネットを検索されても良いでしょう。

ただ、ピクセル数の大小に依存するような場合は、もしかしたら別のことが原因かもしれません。

参考URL:http://www-128.ibm.com/developerworks/java/libra …
    • good
    • 0
この回答へのお礼

ありがとうございます。
他の開発をしていたので遅れてしまいました。
教えていただいた、メソッドなどを調べてみます。

お礼日時:2006/06/18 14:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!