2015-04-24 5 views
2

Je veux dessiner des composants JComponents différents dans un JPanel. Je crée des composants JComponents avec différentes méthodes de peinture. Ensuite, créez les objets dans le main et placez-les dans le JFrame. Mon problème est, que seul le dernier objet est peint dans la fenêtre.ajouter différents jcomponents à jframe dans java

Comment puis-je mettre différents composants JComponents dans la fenêtre, sans enlever ou repeindre les anciens?

(Model2 fonctionne comme Model1, mais le paintComponent est un peu différent)

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class GuiModel{ 
    public static void main(String[] args){   
     JFrame frame = new JFrame();   
     frame.setSize(600, 600); 
     frame.setLocation(150, 150); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true);     

     frame.getContentPane().add(new Model1(0,0)); 
     frame.getContentPane().add(new Model2(25,37,true));    

    } 
} 
import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JComponent;  
public class Model1 extends JComponent { 
    private int xPos, yPos; 


    Model1 (int x, int y){ 
     this.xPos = x; 
     this.yPos = y; 
    } 

    @Override 
    protected void paintComponent(Graphics g) {  
     g.setColor(Color.BLACK); 
     g.drawOval(xPos, yPos, 5, 5);     
    } 
} 

Répondre

3

Quand vous faites peinture personnalisée:

  1. Vous devez remplacer la méthode getPreferredSize() de votre composant pour retourner la taille du composant donc un gestionnaire de mise en page peut afficher le composant. En ce moment, la taille de vos composants est (0, 0) donc il n'y a rien à peindre.

  2. La peinture d'un composant est faite à partir de (0, 0), pas (x, y). Ensuite, si vous placez le composant à un point spécifique du panneau, vous utilisez setLocation (x, y) pour indiquer à Swing où peindre le composant.

  3. Si vous souhaitez peindre le composant à une position aléatoire, vous devez également utiliser une disposition nulle sur le panneau et vous devez également définir la taille du composant. Pour définir la taille du composant, utilisez setSize (getPreferredSize()) dans votre constructeur.

donc votre classe Model1 ressemblerait à quelque chose comme:

public class Model1 extends JComponent { 
    //private int xPos, yPos; 

    Model1 (int x, int y){ 
     //this.xPos = x; 
     //this.yPos = y; 
     setLocation(x, y); 
     setSize(getPreferredSize()); 
    } 

    @Override 
    public Dimension getPreferredSize() 
    { 
     return new Dimension(5, 5); 
    } 
    @Override 
    protected void paintComponent(Graphics g) {  
     g.setColor(Color.BLACK); 
     //g.drawOval(xPos, yPos, 5, 5);     
     g.drawOval(0, 0, 5, 5);     
    } 
} 
+0

merci! maintenant ça marche! –

2

JFrame utilise BorderLayout par défaut. Lors de l'ajout de composants sans spécifier les contraintes, chaque composant sera placé à CENTER.

Spécifiez les contraintes ou, si BorderLayout ne vous suffit pas, passez à une autre disposition.

Pour ajouter des contraintes:

frame.add(new Model1(0,0), BorderLayout.NORTH); 

Je vous suggère de lire How to use BorderLayout, ainsi que guides on the other predefined layouts. En outre, n'hésitez pas à regarder en ligne pour les mises en page 3ème partie, si aucune des dispositions disponibles via le JDK ne correspond à vos besoins. Ou vous pouvez créer votre propre LayoutManager si aucune mise en page existent qui correspondent à vos besoins


Je recommande également d'utiliser pack()-la taille de votre cadre en fonction des composants à l'intérieur au lieu de définir sa taille avec frame.setSize. Cela garantit que votre cadre s'enroule autour de tout ce qui s'y trouve, ne laissant aucun espace vide. Si vous voulez des espaces vides, ils doivent être gérés par le gestionnaire de disposition

-1

Vous pouvez spécifier la taille des composants ou utiliser les modèles pour placer les objets en un seul endroit. Vous pouvez également créer une copie de graphiques et d'écrire dans ce:

protected void paintComponent(Graphics g) { 
    g = g.create(); 
    g.setColor(Color.BLACK); 
    g.drawOval(xPos, yPos, 5, 5); 
    g.dispose(); 
} 

Mais la dernière variante est pas efficace: il fait une copie des graphiques sur chaque repeindre.