2011-10-18 4 views
0

Je dois réinstituer un JPanel dans une application que j'écris (fondamentalement c'est une fenêtre de saisie où l'utilisateur peut construire un graphique, et je voudrais que l'utilisateur puisse le vider, donc en utilisant CardLayout est pas une option), et je pensais à utiliser quelque chose comme ceci:Redéfinir jpanels

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Toolkit; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class AppletProve extends JPanel implements MouseListener, MouseMotionListener{ 

private JPanel p1; 
public AppletProve(){ 
    super(); 
    setLayout(null); 
    Dimension dim=Toolkit.getDefaultToolkit().getScreenSize(); 
    dim.width=(int) (dim.width*0.66); 
    dim.height=(int) (dim.height*0.75); 
    setPreferredSize(dim); 
    addMouseListener(this); 
} 
public void crea(){ 
    p1=new JPanel(); 
    p1.setBounds(10,10,60,70); 
    p1.setBackground(Color.YELLOW); 
    JLabel lbl1=new JLabel("prova1"); 
    p1.add(lbl1); 
    add(p1); 
} 
public void collega(){ 
    remove(p1); 
    p1=new JPanel(); 
    p1.setBounds(10,10,60,70); 
    p1.setBackground(Color.BLUE); 
    JLabel lbl2=new JLabel("prova2"); 
    p1.add(lbl2); 
    add(p1); 
} 
@Override 
public void mouseClicked(MouseEvent arg0) { 
    System.out.println("chiamato"); 
    collega(); 

} 
@Override 
public void mouseEntered(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void mouseExited(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void mousePressed(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void mouseReleased(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void mouseDragged(MouseEvent arg0) { 
    repaint(); 

} 
@Override 
public void mouseMoved(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 
} 

le problème est que si le panneau p1 est reinstantiated, étant donné que les changements de couleur d'arrière-plan, lbl2 n'apparaît pas, qui ne serait pas si mauvais que je devais seulement rétablir le panneau à un état vide, mais je pensais utiliser cette méthode aussi pour ajouter des responsabilités au panneau à travers le modèle de décorateur, donc je dois montrer les composants de la nouvelle reinsta panneau lié.

Répondre

3

J'aimerais l'utilisateur d'être en mesure de le vider, donc l'utilisation CardLayout est pas une option

Bien sûr, il est. Voir, CardLayout.removeLayoutComponent(Component).

+0

Donc, vous dites que je devrais créer un nouveau JPanel, l'ajouter à la mise en page, puis retirer l'ancien? Cela pourrait m'aider à mettre le panneau dans son JFrame, puisque j'ai utilisé WindowBuilder d'Eclipse pour le composer (oh btw, je me suis juste demandé ce qui n'allait pas avec le code: j'ai oublié de valider()) – Orgrim

+1

Je n'y avais pas pensé profondément (ni regardé votre code de près). Je soulignais simplement que votre message est basé sur un malentendu. –