-1
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
class GraphicsFunda extends JPanel implements ActionListener
{
 Graphics myg;
 JButton jb;
 GraphicsFunda()
{

 jb = new JButton("Draw");
 add(jb);
 setBackground(Color.YELLOW);
 jb.addActionListener(this);
}
public void paintComponent(Graphics g)
{ 
 myg=g;
 g.drawOval(100,300,50,50);
}
public void actionPerformed(ActionEvent ae)
{
 if(ae.getSource()==jb)
 myg.fillRect(10,10,200,200);
}  
public static void main(String... sd)
{
 GraphicsFunda gf = new GraphicsFunda();
 JFrame jf = new JFrame();
 jf.add(gf,BorderLayout.NORTH);
 jf.setBackground(Color.blue);
 jf.setSize(400,400);
 jf.setVisible(true);
}

その中の問題を解決するのを手伝ってください。PaintComponent から Graphics クラスの参照を取得すると、それを他の形状の描画に使用できますが、ここでは機能しません :(

4

3 に答える 3

2

Graphics のインスタンスを保持して、このようにいつでも呼び出すことはできません。paintComponent()描画は、引数として渡された Graphics オブジェクトを使用して、メソッド内で排他的に実行する必要があります。

actionPerformed()メソッドで、パネルの状態を変更し、を呼び出しますrepaint()。次に、メソッドで、パネルの状態paintComponent()を読み取り、それに応じてペイントします。あなたの場合、状態は、たとえば、ペイントする形状のリストになる可能性があります。

于 2013-08-01T19:57:51.487 に答える
1

型メソッドの外でグラフィックスを描画すると、paint問題が発生する傾向があります。の Graphicsへのすべての描画は、メソッド内で行う必要があります。これが機能したとしても、再描画が呼び出されたときにユーザーが画面のサイズを変更するなどの操作を行うと、変更が上書きされます。JPanelpaintComponent

でのみ描画を行うようにプログラムを再構築できない場合paintComponent、代替手段の 1 つは、すべての描画をBufferedImageで行い、再描画時にイメージを に再描画することGraphicsです。もちろん、これにも問題があります (画像が十分に大きくない場合、サイズ変更のコストが高くなるなど)。したがって、これは goto メソッドではありません。代わりに、コードを変更して、可能な場合は再描画メソッドが何を描画するかを認識できるようにします。

于 2013-08-01T19:57:44.927 に答える