2009-09-08 8 views
0
import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class MyDrawPanel extends JPanel{ 
    public void paintComponents(Graphics g){ 
     g.setColor(Color.orange); 
     g.fillRect(20,50,100,100); 
    } 
    public static void main(String[] args){ 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(500, 500); 
     frame.getContentPane().add(paintComponents(g)); 
     frame.setVisible(true); 
    } 
} 

Je pense que je devrais ajouter des arguments dans frame.getContentPane().add(paintComponents(g));. J'ai regardé Graphics cours mais je suis toujours aux prises avec ça. Quel devrait être le paramètre de celui-ci?Problème avec ce code simple

+0

s'il vous plaît faire votre titre de la question afin qu'il reflète ce que vous essayez de faire et ce qui est votre problème – marcgg

+1

Je ne sais pas comment cela compiler, comme méthode de paintComponents ne retourne rien. – Jorn

Répondre

3

essayer cette

public class MyDrawPanel extends JPanel{ 
    MyDrawPanel() 
     { 
     setOpaque(true); 
     } 


    protected void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setColor(Color.orange); 
     g.fillRect(20,50,100,100); 
    } 
    public static void main(String[] args){ 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.getContentPane().add(new MyDrawPanel()); 
     frame.setBounds(10,10,500, 500); 
     frame.setVisible(true); 
    } 

} 
+0

Fantastique. ça fonctionne merci. –

+0

C'est génial, mais savez-vous pourquoi ça marche? – Jorn

+0

désolé, il est tard ici. Pas le temps de commenter ce code. – Pierre

0

Je ne suis pas expert en AWT, mais ce que je pense que vous voulez faire est d'ajouter un objet Canvas à votre volet de contenu de la JFrame, puis peindre un objet graphique sur elle.

0

D'accord, voilà ce que je suis venu avec:

public class MyDrawPanel extends JPanel 
{ 
    private static void createAndShowGUI() 
    { 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(500, 500); 
    MyDrawPanel panel = new MyDrawPanel(); 
    panel.setOpaque(true); 
    frame.getContentPane().add(panel); 
    frame.setVisible(true); 
    } 

    @Override 
    public void paintComponent(Graphics g) 
    { 
    super.paintComponent(g); 
    g.setColor(Color.orange); 
    g.fillRect(20,50,100,100); 
    } 

    public static void main(String[] args) 
    { 
    SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() 
     { 
     createAndShowGUI(); 
     } 
    }); 

    } 

} 

Notes:

  1. Il y a plusieurs problèmes avec votre ligne frame.getContentPane().add(paintComponents(g));. Ce que vous avez dit est "ajouter au volet de contenu le résultat de l'appel paintComponents sur g D'où vient g Vous ne pouvez pas utiliser une variable jusqu'à ce que déclaré.Le résultat de l'appel paintComponents est void ce qui signifie que le résultat ne peut pas être utilisé comme argument à une méthode. on peut supposer que vous avez eu des erreurs du compilateur.

  2. J'ai changé paintComponents-paintComponent. Le premier est utilisé pour contrôler la peinture de sous-composants et en général ne devrait pas être surchargée.

  3. objets Swing ne doivent pas être créés sur le fil principal.Les détails sont compliqués pour un débutant (et décrit here en détail). mémorisez simplement le motif SwingUtilities.invokeLater utilisé ci-dessus.

+0

Aussi le @Override est utilisé dans Java 5 ou plus tard. Si vous utilisez une version antérieure, vous devez les ignorer. –