• ベストアンサー

JScrollPaneで、表示がおかしくなります

いつも、お世話になっております。 JScrollPaneを使って、大きなサイズのJpanelを表示しようとしていますが、Jpanelのheightが770ピクセルを超えたあたりから、上で表示したものが重なって表示されてしまったりして、正常に表示できなくなってしまい困っています。 Jpanelでは文字や線などを描画して表示しているので、ダブルバッファリングしていないのかと考え、調べてみましたが、ダブルバッファは行っていました。 回避する方法等をご存知でしたら、教えていただけないでしょうか。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • kacchann
  • ベストアンサー率58% (347/594)
回答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)); } } }

kiyohu16
質問者

お礼

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

その他の回答 (2)

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.2

似たような経験があります。が、JPanelを大きくした時ではなくて、それまでよりも(JScrollPaneの枠よりも)狭い領域に描画領域を変更した時に発生したように記憶してます。 JPanelの public void paintComponent(Graphics g){} 内で、目的の絵を描く前に、JPanel全体を塗りつぶして対処しました。 あと、私の場合、実際には、JSplitPaneの左右にJScrollPaneを載せて 片方のJScrollPaneには、ボタンなどを配備したJPanelを、もう一方は、描画用にJPanelを載せていて、 描画用の方のJScrollPane枠との隙間に対側のボタンが写り込む現象があったのですけど JSplitPaneとの兼ね合いもあったかもしれません。 ボタン配備側でrepaint()が発生した時にはJSplitPaneの両側のJPanelをrepaint()するようにしたら写り込みは発生しないようでした。 あと、setPreferredSizeも設定しておいた方が良さそうです。これはJSplitPaneに載せる時の問題だったかもしれませんけど。 その後発生してないのと、古いソースも残してはあるのだけど、もういちど戻そうとしたら うまく実行出来なくて、どのソースで再現出来たか、どれが最適解か解らなくなってしまいました。 大体の実行状況が解る程度にソースを載せてみられてはいかがでしょう。

kiyohu16
質問者

補足

ありがとうございます。 テスト用に作った文字を出力する簡単な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(); } }

  • unibon
  • ベストアンサー率47% (160/340)
回答No.1

スクロールメソッドがデフォルトのままではダメだったかもしれません。Sun によると、そういう「仕様」とのことだとどこかに書いてあった記憶があります。 具体的には、 JScrollPane x; ... x.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE); のように指定すれば良かったかもしれません。 これらのメソッド名や定数でネットを検索されても良いでしょう。 ただ、ピクセル数の大小に依存するような場合は、もしかしたら別のことが原因かもしれません。

参考URL:
http://www-128.ibm.com/developerworks/java/library/j-jtctips/j-jtc0117a.html
kiyohu16
質問者

お礼

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

関連するQ&A

専門家に質問してみよう