- ベストアンサー
Graphicsについて
Graphicsで描かれた線や図形は、ダブルバッファリングを使用しないと、ウィンドウのサイズを変更したり、別のウィンドウで覆ったりすると、描かれたものは消えてしまいます。 そこで今回JPanelを用いて、消えてしまわないようにしたいですが、 JPanel p = new JPanel(); Graphics g = p.getGraphics(); g.drawLine( x, x, y, y); のようにして、を実行すると上記の行為をすると消えてしまいます。JPanelはデフォルトでダブルバッファリングを備えているはずですよね。なぜなのでしょうか? どなたかご教授願います。宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「回答に対する補足」の回答です。 この部分を、 c.add(new PanelTest4()); JPanel p =new JPanel(); c.add(p); - - - - - - - - - - - - - - - - - - - - PanelTest4 p = new PanelTest4(); c.add(p); としてみてください。 要点はJPanelを拡張したクラスはJPanelにもなるので、わざわざ標準のJPanelを使う必要はありません。 拡張したクラスPanelTest4(クラスA?)にコンポーネントを追加していけば良いだけです。 ※書き込んであるソースコードはクラス名が間違ってるようです。
その他の回答 (1)
- Bonjin
- ベストアンサー率43% (418/971)
ダブルバッファリングの意味を間違えています。ダブルバッファリングは画像のちらつきなどを防ぐための技法であって、描いたものを保持しておくための技法ではありません。 描いたものを保持したいのならば、描いた画像または描画するための情報などを別に保持しておく必要があります。
補足
ご返信ありがとうございます。そうだったのですか(;´Д`)とんだ勘違いをしてました。 ところでJPanelを継承した新たなクラス(クラス名:Aとします)で、paintComonentメソッドを使い、drawLineで1本線を引くとします。そしてJFrameを継承した別のクラス(クラス名:Bとします)に登録するにはどうすればいいのでしょうか?コンテントペインを取得し、addで登録をすればいいのは分かるのですが、クラスBでJPanelを生成し、そのパネルにボタンやラベルを登録し、そのボタンやラベルをコンテントペインを取得してaddで登録すると、クラスAで描いた線が消えてしまい、クラスBのボタンやラベルに置き換わっています。私としては両方とも残ってほしいのですが、どうすればよいでしょうか?もしよろしければご教授ねがいたいです。何度もすみません。 以下はプログラムです。 import java.awt.*; import java.awt.event.*; import javax.swing.*; class A extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); int x; for(x=0; x<=240; x=x+20) { g.drawLine(0, 0, x, 240); } } } class B extends JFrame { public FrameTest4() { setSize(300, 300); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); Container c = getContentPane(); c.add(new PanelTest4()); JPanel p =new JPanel(); c.add(p); p.setLayout(null); JLabel lb = new JLabel("ラベル"); p.add(lb); lb.setBounds(50,50,50,50); } } public class Test4 { public static void main(String[] args) { JFrame a = new A(); a.show(); } } 長文ですみません。ぜひよろしくお願いします。
お礼
動きました!すごい!ありがとうございます!!昨日一晩考えて全くだめだったのにほんとにありがとうございます。今後ともご教授を宜しくお願いしたいです。 クラス名間違ってましたね。紛らわしいことをしてしまし申し訳ありませんでした。 ありがとうございました。