いつも、お世話になっております。
JScrollPaneを使って、大きなサイズのJpanelを表示しようとしていますが、Jpanelのheightが770ピクセルを超えたあたりから、上で表示したものが重なって表示されてしまったりして、正常に表示できなくなってしまい困っています。
Jpanelでは文字や線などを描画して表示しているので、ダブルバッファリングしていないのかと考え、調べてみましたが、ダブルバッファは行っていました。
回避する方法等をご存知でしたら、教えていただけないでしょうか。
宜しくお願い致します。
No.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));
}
}
}
No.2
- 回答日時:
似たような経験があります。
が、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();
}
}
No.1
- 回答日時:
スクロールメソッドがデフォルトのままではダメだったかもしれません。
Sun によると、そういう「仕様」とのことだとどこかに書いてあった記憶があります。具体的には、
JScrollPane x;
...
x.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
のように指定すれば良かったかもしれません。
これらのメソッド名や定数でネットを検索されても良いでしょう。
ただ、ピクセル数の大小に依存するような場合は、もしかしたら別のことが原因かもしれません。
参考URL:http://www-128.ibm.com/developerworks/java/libra …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#で、あるクラスのメンバーす...
-
大量のデータを読み込んで表示...
-
Junitテストでvoid戻り値メッソ...
-
C# 半角カナの文字化けについて
-
C# 矢印キーの取得
-
C# バイナリダンプを構造体に簡...
-
C# メソッドが実行されているか...
-
ボタンの複数割り当てについて
-
プログラミングお願いします(JAVA)
-
なぜ、clickイベントが起こって...
-
C# DataGridView列カスタマイズ
-
C# visibleプロパティをfalseに...
-
C# タスクバーを隠したフォーム...
-
[C#.net]スレッド化された別フ...
-
ループ処理の際、最後だけ","を...
-
JSPやサーブレットでSystem.out...
-
変数を動的に利用するには?
-
System.err. printlnとSystem.o...
-
オブジェクトの中のプロパティ...
-
ダブルクォーテーションのrepla...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C#で、あるクラスのメンバーす...
-
C#でのWNetAddConnection3の使...
-
Junitテストでvoid戻り値メッソ...
-
ボタンの複数割り当てについて
-
C# DataGridView列カスタマイズ
-
C# WinForm のDataGridView Cel...
-
C# visibleプロパティをfalseに...
-
[C#.net]スレッド化された別フ...
-
C# 矢印キーの取得
-
unityでのC++エラーの原因がわ...
-
C#から、C++で作成したdll内の...
-
コンボボックスを使う時の警告
-
JavaFXでの表内のチェックボッ...
-
C#で別のFormへ複数の値を返そ...
-
vc++ 2005 Pictureboxの透過処理
-
プログラミング(Java)じゃん...
-
C#でキーイベントが発生しない...
-
正規表現
-
C# MouseHoverを何度も呼ぶには
おすすめ情報