• ベストアンサー

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

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

  • Java
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
  • 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

  • JScrollPaneのオブジェクトは位置位置

    JScrollPaneについて、質問させて頂きます。 JScrollPaneに、JTextAreaを縦一列に配置したJPanelを追加しようとしたのですが、何故かJScrollPaneに配置すると、JPanel内のJTextAreaの配置が横一列になってしまいます。 つまり、現在は TEST1 TEST2 TEST3 TEST4....(JTextAreaを並べたJPanelです) となっているJScrollPaneを Test1 Test2 Test3 Test4 のように表示したいのです。 大学の授業に絡むコードですので全てを貼付けるとネットから拾ってきたのではと思われてしまうため、全ては貼付けられませんがコードの一部を張りつけさせて頂きます。 まずはJScrollPaneの設定ですが private JScrollPane getScroll() { if (scroll == null) { scroll = new JScrollPane(innerHomeTimeLine); scroll.setPreferredSize(new Dimension(width, height)); scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); scroll.setWheelScrollingEnabled(true); } return scroll; } としてJScrollPaneを作成しています、innerHomeTimeLineはJTextAreaを縦一列に並べたJPanelです。 このJScrollPaneを this.add(getScroll(),BorderLayout.NORTH); でJPanelに追加し、そのJPanel(homeTimeLine)をthis.add(homeTimeLine,BorderLayout.CENTER); でJAppletに追加し、表示しています。 JPanel(innerHomeTimeLine)そのものをJAppletに追加すると縦一列に並んだまま表示出来るのは確認しているので、JScrollPaneの設定の問題だと思うのですが、どうすれば良いのでしょうか.... やり方をご存知の方がいましたら、解答して頂けると助かります、宜しくお願いします。 さすがにこのコードだけでは解答は無理、といったことでしたら、必要な部分を教えて頂ければ、抜き出して追記させて頂きます。

    • ベストアンサー
    • Java
  • Swing のJScrollPane について教えてください

    現在、Swing を使用して以下の様な処理のアプレットを作成しています。 ---------------------------------------------------------------  // 画面構成  JPanel p = new JPanel();  JScrollPane sp = new JScrollPane(   p,   ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,   ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED  ); ---------------------------------------------------------------  // パネルサイズの調整  public void resizePanel()  {   p.setPreferredSize(new Dimension(400, 少しづつ増やす));   p.revalidate();  } ---------------------------------------------------------------  // 一番下までスクロールさせる  public void scrollToMaximun()  {   JScrollBar sb = sp.getVerticalScrollBar();   sb.setValue(sb.getMaximum());  } --------------------------------------------------------------- 処理内容は、発生したデータを JPanel に時系列に描画していき、 常に一番下までスクロールさせるという物です。 具体的には、データが発生する度に、描画 & resizePanel() & scrollToMaximun() を行います。 その際、スライダが、一番下までスクロールされず、前回のサイズの 最大値に設定されてしまいます。 根本的なやり方がマズイのか、何がが足りないのかも分からない状態です。 申し訳ございませんが、ご教授頂いたいと思います。

    • ベストアンサー
    • Java
  • JPanel上での描画と各コンポーネントの配置について

    JPanel上で描画とコンポーネントを共存させたいと思っています。例えば、レイアウトはボーダーレイアウトで、North側にcomboboxとbuttonを、Center側に描画領域をとりたいときには、どうすればいいのでしょうか? 描画はダブルバッファリングを持っているのでどうしてもJPanel上でやりたいのです。よろしくお願いします。

    • ベストアンサー
    • Java
  • Graphicsについて

    Graphicsで描かれた線や図形は、ダブルバッファリングを使用しないと、ウィンドウのサイズを変更したり、別のウィンドウで覆ったりすると、描かれたものは消えてしまいます。 そこで今回JPanelを用いて、消えてしまわないようにしたいですが、 JPanel p = new JPanel(); Graphics g = p.getGraphics(); g.drawLine( x, x, y, y); のようにして、を実行すると上記の行為をすると消えてしまいます。JPanelはデフォルトでダブルバッファリングを備えているはずですよね。なぜなのでしょうか? どなたかご教授願います。宜しくお願いします。

    • ベストアンサー
    • Java
  • JScrollPane上のJTableの再描画

    JPanel上で,以下の初期化関数を作って,データが更新されたときに,この初期化関数を再度呼び出して,テーブルを作り直しています. 描画直後は,正しく表示されるのですが, スクロールバーに触ったり,セルをクリックしたりすると, 初めに作成したテーブルの表示に戻ってしまいます. 何が原因で,どのように対処すれば良いのでしょうか? ご回答いただけますよう,よろしくお願いいたします. public void init_table() { tablemodel1 = new DefaultTableModel(column_names1, text.keyword_num); table1 = new JTable(tablemodel1); scrollt1 = new JScrollPane(table1); add(scrollt1);     以下略 }

    • ベストアンサー
    • Java
  • PictureBoxのダブルバッファリングについて

    長文、失礼致します。 私は現在、趣味でRPGを作っているプログラム初心者です。 開発環境はVB2005 ExpressEditionです。 ゲーム中の描画処理は全て1つのPictureBoxで行っています。 PictureBoxのサイズは544×416ピクセルで、描画する画像はGIFやJPEGです。 そして、描画速度がちょっと遅いのが気になっています…。 (縦64、横58ピクセルのキャラが、2cmくらい移動するのに1秒くらい掛かります) どうにか描画速度を速くできないか調べたところ、 ダブルバッファリングという手法を見つけました。 それについて調べたところ、VB2005ではデフォルトでダブルバッファが有効になっているらしい事が分りました。 しかし、以下のように確認したところ「False」と表示され、ダブルバッファが有効になっていないようでした。 Me.Text = Me.GetStyle(ControlStyles.OptimizedDoubleBuffer) また、フォームのロード時に以下のように記述しても、描画速度に変化は見られませんでした。 Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True) Me.SetStyle(ControlStyles.UserPaint, True) Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True) ここで質問なのですが、既にダブルバッファリングされてこの程度の描画速度なら、もっと高速にするには、やはりWin32APIやDirectX等を使うしか方法が無いでしょうか…? あと、現在使っているPCの仕様です。 OS : Windows Vista Home Basic CPU : Celeron(1.73GHz) メモリ : 1GB 何だか色々と叩かれそうな予感がしますが、 ご回答のほど、宜しくお願い致します。

  • Java画像表示など

    5種類のGIF画像(10×10 *ピクセル)を、ランダムに400×300のスペースに敷き詰めたいんですけど、どうやったらいいでしょうか? ちなみにちらつきをなくすためにダブルバッファリングを使い、かるく画像表示が1000を超えてしまうので配列やfor文も使いたいのですが・・・。 言葉だとわかりにくいので、できればソースで教えてください><

  • JTableとJScrollPaneの問題

    JTableとJScrollPaneを使って、Excelのsheetのような表を作成したいのですが、 列の入れ替えが可能になっています。 列の入れ替えを出来ないようにしたいのですが、どうしたら良いのでしょうか? 教えて下さい。 また、各セルをセンターリングで表示したいです。 (以下の例の場合、Aと×とかです。) テストプログラム import java.awt.*; import javax.swing.JTable; import javax.swing.JPanel; import javax.swing.JFrame; import javax.swing.JScrollPane; public class testTable extends JFrame { public testTable() { Object[][] data = { {"A","B","×","A","A","×","B",}, {"C","C","C","C","C","×","B",}, {"×","×","×","A","A","×","B",}, {"F","F","F","A","A","×","B",}, }; String[] columnNames = {"日", "月", "火", "水", "木", "金", "土"}; JTable tblSchedule = new JTable(data, columnNames); JScrollPane scrollPane = new JScrollPane(tblSchedule); getContentPane().add(scrollPane, BorderLayout.CENTER); } public static void main(String[] args) { testTable frame = new testTable(); frame.pack(); frame.setVisible(true); } }

  • C# PictureBoxへの描画を行うとメッセージボックスが表示されません。

    いつもお世話になっております。 ふと、PictureBoxに描画をしてみようかと思い Paintイベントに以下のようにして描画を行いました。   myBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);   Graphics g = Graphics.FromImage(myBitmap);   pictureBox1.Image = myBitmap;      ・      ・(g.FillRectangle(・・・);など)      ・ (myBitmapはBitmap型のグローバル変数です。) PictureBoxは、自由にサイズ変更可能なフォームに貼り付け、四方をanchorで固めています。 そのためサイズが変更されるたびに、描画するときBitmapのサイズも変更しないといけないので この処理を毎回通っています。 (その部分が何だか無駄な気がするのですが、他にいい方法が思いつきませんでした。) ところが、描画はうまくいったのですが、メッセージボックスを出すと そのメッセージボックスが一度Altキーを押さないと表示されません。 色々調べて、ダブルバッファリングというものがあると知りました。 そこでPaintイベントで最初にこの処理をし   Image image = new Bitmap(pictureBox1.Width, pictureBox1.Height);   g = Graphics.FromImage(image); gに描画し終わってから   e.Graphics.DrawImage(image, 0, 0); としてみると、今度はフォームを移動するのにも一瞬フリーズするようになってしまいました。 (あまり深くプログラミングをしたことがないので、理解しきれなくてやり方が悪いのかも知れません・・・) メッセージボックスが表示されないのは、PictureBoxの描画のため 他のコントロールの描画ができていなためだと推測しているのですが どう直していいかわかりません。 どなたか、わかる方がいましたらよろしくお願いします。 <補足> OS:Vista VisualStudio2008 .NET Framework3.5

  • 文字のちらつきを抑えるには

    VisualStudio2005でAPIをを使ってマウスの位置を表示するソフトを作っています。WM_MOUSEMOVEメッセージがきたら位置を取得して、InvalidateRect関数を使って再描画しています。再描画する際に文字のちらつきが気になります。HPを調べたりいろいろやってみたのですが、ちらつきを起こす原因と対処法(ダブルバッファリング)の大まかな部分しか分かりませんでした。もし、参考になるサイトや詳しい方がいらっしゃったらご教授ください。※MFCは使っていません。