2017-10-02 7 views
0

現在、私は小さなコーディングプロジェクトに取り組んでおり、問題が発生しました。私は過去の仕事を見てきましたが、なぜこのプログラムがペイント方法を呼び出さないのか分かりません。現在、私はフレームに円を描こうとしています。オブジェクトクラスが画面にペイントしていません

以下は、描画しようとしているシンプルな円のウィンドウとオブジェクトクラスを作成します。私は、コンソールからの応答を取得するプログラムを実行すると、以下の

public class Main { 

public static void main(String[] args) { 

    final int WIDTH = 700, HEIGHT = 900; 

    JFrame frame = new JFrame("Physics Demo"); 
    JPanel content = new JPanel(); 

    content.setLayout(new GridLayout(1, 0, 0, 0)); 

    Character ball = new Character(WIDTH, HEIGHT); 

    Timer changeFrame = new Timer (100, ball); 

    frameSetup(frame, content, WIDTH, HEIGHT, ball, changeFrame); 

} 

public static void frameSetup(JFrame frame, JPanel content, int WIDTH, int HEIGHT, Character ball, Timer changeFrame){ 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    frame.setContentPane(content); 

    content.add(ball); 

    frame.addKeyListener(ball); 

    frame.setPreferredSize(new Dimension(WIDTH, HEIGHT)); 

    frame.setResizable(false); 
    frame.pack(); 
    frame.setLocationRelativeTo(null); 

    frame.setVisible(true); 
    changeFrame.start(); 

} 

}

クラスは、オブジェクトクラスです。キャラクターは一度トリガーする必要があります。また、actionPreformedメソッドは、タイマーをループで実行します。なんらかの理由で、ペイントクラスは実行されません。

public class Character extends JPanel implements ActionListener, KeyListener{ 
/* Identify the Objects values and physics, 
* Characters weight, size and properties are below. 
* 
*/ 
private static final long serialVersionUID = 1L; 

final int characterRadius = 30; 

final double characterWeight = 0.5; 

int characterY, characterX; 

boolean bouncy; 

public Character(int WIDTH, int HEIGHT){ 

    System.out.println("Character called upon... " + WIDTH); 

} 

public void characterObject(Graphics g, int WIDTH, int HEIGHT){ 

    super.paint(g); 

    System.out.println("characterObject graphics called upon... " + WIDTH); 

    g.setColor(Color.BLUE); 
    g.fillOval(350, 450, characterRadius, characterRadius); 

} 

/* 
* Ball does not have any player interactions 
*/ 

@Override 
public void keyPressed(KeyEvent buttonPressed) { 


} 

@Override 
public void keyReleased(KeyEvent arg0) { 

} 

@Override 
public void keyTyped(KeyEvent arg0) { 


} 

//****************************************** 

@Override 
public void actionPerformed(ActionEvent arg0) { 

    System.out.println("actionPreformed called upon..."); 

    repaint(); 

} 

}

私は今しばらく試行錯誤を行ってきたと私はので、私は最後の手段としてこれを使用していますそれを把握するように見えることはできません。

必要に応じてさらに情報を提供できます。

+2

なぜ'characterObject'から' super.paint'を呼び出していますか?これは、カスタム絵画の仕組みではありません。あなたはペインティングプロセスを制御しません、APIは – MadProgrammer

答えて

0

直接塗装を呼び出すべきではありません。再塗りが必要なときはいつでもフレームワークから呼び出されます。再描画を強制するには、 'repaint()'を呼び出します。

あなたがEventDispatchThreadを意味するEDTへの呼び出しを配置する必要があるかもしれませんタイマーからそれを呼び出す場合:ああ

EventQueue.invokeLater(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
    ball.repaint(); 
    } 
}); 

とあなたが本当にpaintメソッドオーバーライドする必要があります。

@Override 
public void paint(Graphics g) 
{ 
    super.paint(g); 
    g.setColor(Color.BLUE); 
    g.fillOval(350, 450, characterRadius, characterRadius); 
} 
+3

以来 'javax.Swing。Timer'はEDT上で登録された 'ActionListener'を呼び出し、' Ball'クラスは 'ActionListener'インターフェースを実装し、その中から' repaint'を呼び出します。これは問題ではないと考えるのが妥当でしょう。 'RepaintManager'が動作する方法のために議論することもできます。' repaint'は、一般にスレッドセーフであるいくつかのメソッドの1つです – MadProgrammer

3

super.paintはなぜcharacterObjectに電話していますか?これは、カスタム絵画の仕組みではありません。あなたは、APIは、あなたがAPIを再描画するコンポーネントですたいときに呼び出されるメソッドのいずれかをオーバーライドする必要が

を行い、塗装工程を制御しません。一般的な推奨事項として、これは、例えば

public class Character extends JPanel implements ActionListener, KeyListener { 

    /* Identify the Objects values and physics, 
    * Characters weight, size and properties are below. 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    final int characterRadius = 30; 

    final double characterWeight = 0.5; 

    int characterY, characterX; 

    boolean bouncy; 

    public Character(int WIDTH, int HEIGHT) { 

     System.out.println("Character called upon... " + WIDTH); 

    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); //To change body of generated methods, choose Tools | Templates. 
     System.out.println("characterObject graphics called upon... " + WIDTH); 

     g.setColor(Color.BLUE); 
     g.fillOval(350, 450, characterRadius, characterRadius); 

    } 

    /* 
    * Ball does not have any player interactions 
    */ 
    @Override 
    public void keyPressed(KeyEvent buttonPressed) { 

    } 

    @Override 
    public void keyReleased(KeyEvent arg0) { 

    } 

    @Override 
    public void keyTyped(KeyEvent arg0) { 

    } 

    //****************************************** 
    @Override 
    public void actionPerformed(ActionEvent arg0) { 

     System.out.println("actionPreformed called upon..."); 

     repaint(); 

    } 
} 

のために私は絵が実際にSwingでどのように機能するかの詳細についてはPerforming Custom PaintingPainting in Swingの読み取りを持つpaintComponent方法をお勧めします。

私もKeyListenerの代替としてHow to use Key Bindingsを見たお勧めします、あなたは次の明白な問題に対処するであろうあなたはまた、Java Coding Conventionsの読み取りがしたいことがあり

、それは他の人のためにそれが容易になりますあなたのコードを読むことができ、他の人を読むのが簡単です。

あなたはCharacterコンストラクタにwidthheightを渡しているが、それらを無視している、私はあなたがインスタンスフィールドにそれらの値を代入し、paintComponentメソッド内でそれらを使用する必要があるとしていることをお勧めしたい

関連する問題