2017-12-02 6 views
0

私は単純な四角形を描画しようとしていますが、paintComponentメソッドが呼び出されていないと思います。ここで は、mainメソッドを持つクラスのコードです:ここでの問題は何JavaのpaintComponent()が呼び出されていない

package painting; 
import java.awt.*; 
import javax.swing.*; 

public class Painting {  

    public static void main(String[] args) { 
     JFrame jf;  
     jf = new JFrame("JUST DRAW A RECTANGLE"); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.setLayout(null); 
     jf.setLocationRelativeTo(null); 
     jf.setSize(600,600);  
     jf.setVisible(true); 
     Mainting maint = new Mainting(); 
     jf.add(maint);   
    }  
} 

やpaintComponent(を持つクラス)

package painting; 
import java.awt.*; 
import javax.swing.*; 

public class Mainting extends JPanel { 
    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     g.drawRect(0, 0 , 200, 200); 
     System.out.println("haha"); 
     g.setColor(Color.red); 
    } 
} 

、私は...

+1

今後のヒント:JFrameの 'setVisible()'メソッドをメインメソッドの最後のステートメントと呼ぶ方が良いでしょう。これにより、 'repaint()'メソッドに対する不必要な呼び出しを避けることができます。 – STaefi

答えて

1

であなたのコンポーネントを追加し、アプローチが最適未満でした。この例は、より良いアプローチを示すことを目指しています。詳細は、コード内のコメントを参照してください。

EDTでSwing/AWT GUIを起動する必要があることに注意してください。これは読者のための練習として残されています。

import java.awt.*; 
import javax.swing.*; 

public class Painting { 

    public static void main(String[] args) { 
     JFrame jf = new JFrame("JUST DRAW A RECTANGLE"); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     // null layouts cause more problems than they solve. DO NOT USE! 
     //jf.setLayout(null); 
     jf.setLocationRelativeTo(null); 
     /* if components return a sensible preferred size, 
     it's better to add them, then pack */ 
     //jf.setSize(600, 600); 
     //jf.setVisible(true); // as mentioned, this should be last 
     Mainting maint = new Mainting(); 
     jf.add(maint); 
     jf.pack(); // makes the GUI the size it NEEDS to be 
     jf.setVisible(true); 
    } 
} 

class Mainting extends JPanel { 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.RED); 
     g.drawRect(10, 10, 200, 200); 
     System.out.println("paintComponent called"); 
     /* This does nothing useful, since nothing is painted 
     before the Graphics instance goes out of scope! */ 
     //g.setColor(Color.red); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     // Provide hints to the layout manager! 
     return new Dimension(220, 220); 
    } 
} 
0

を把握することはできませんレイアウトマネージャを設定してみてください。 BorderLayout

ので

jf.setLayout(new BorderLayout()); 

を使用して、すでに提供さ答えが表示される長方形をもたらしているかもしれませんが、いくつかの制約

Mainting maint = new Mainting(); 
jf.add(maint,BorderLayout.CENTER); 
関連する問題