2012-10-14 2 views
1

Ce code ici devrait créer une fenêtre, puis dessiner un polygone dessus.paintComponent non appelé

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

public class gui extends JComponent { 
    gui(String title){ 
    JPanel pane = new JPanel(); 
    JFrame frame = new JFrame(title); 
    Container con = frame.getContentPane(); 
    con.add(pane); 
    frame.setBounds(100,100,500,500); 
    frame.setVisible(true); 
    } 
    public static void main(String[] args){ 
    gui myGUI = new gui("test"); 
    new Drawer(); 
    repaint(); 
    } 
} 
class Drawer extends JComponent { 
    public Drawer() { 
    System.out.println("drawer"); 
    repaint(); 
    } 
    public void paintComponent(Graphics g) { 
    super.paintComponent(g);  
    System.out.println("drawerpC"); 

    Point p1 = new Point(400, 100); 
    Point p2 = new Point(100, 300); 
    Point p3 = new Point(200, 400); 

    int[] xs = { p1.x, p2.x, p3.x }; 
    int[] ys = { p1.y, p2.y, p3.y }; 
    Polygon triangle = new Polygon(xs, ys, xs.length); 

    g.setColor(new Color(255,255,255)); 
    g.fillPolygon(triangle); 
    } 
} 

La fenêtre est créée, mais paintComponent() n'est pas appelé.

repaint() dans public Drawer() semble ne rien faire. Comment appeler paintComponent()?

+0

Si ce composant personnalisé est 'tout rendu' et ne peut pas être redimensionné, il serait plus facile de peindre dans un 'BufferedImage' et de l'afficher dans une étiquette. –

Répondre

3

Vous devez ajouter le composant Drawer à votre JFrame:

Drawer drawer = new Drawer(); 
con.add(drawer); 

Pas besoin d'appeler explicitement paintComponent. En outre, l'appel repaint() dans le composant Drawer est inutile. Ce qui précède déplace votre paneJPanel de sorte que vous souhaitiez repenser la disposition de votre cadre.

3

Vous avez créé un appelé Drawer, qui exécute le dessin lui-même. Donc, vous devez ajouter une instance à votre cadre.

Drawer drawer = new Drawer(); 
con.add(drawer); 

appeler manuellement repaint() ne devrait pas être nécessaire si vous ne changez pas ce qui est peint sur le composant. Le framework Swing l'appellera pour vous, par exemple lorsque la taille de la fenêtre change.

De plus, les noms de classe doivent démarrer en majuscules.