java supprimer un composant
Actuel je peux ajouter un tas de personalisés des objets composant le Composite en appuyant sur "ajouter" JButton. J'ai aussi eu un "supprimer" JButton que je veux faire le contraire de "ajouter".
Mon intention est que je peux sélectionner un composant avec une souris et cliquez sur le bouton supprimer et pressto!, le composant est allé.
- Je brancher un MouseListener pour le panneau, et l'utilisation MouseEvent, e.getComponent() pour obtenir w/e de la composante de clics de la souris sur. Donc, si elle renvoie un composant personnalisé alors une variable "privé myComponent actuel" (déjà défini à null) point à ce composant. Alors je peux juste cliquer sur le bouton "supprimer" pour le supprimer. Un actionListener déjà ajouté dans le bouton "supprimer" et dans le corps, il appelle cette.supprimer(en cours) (si le courant n'est pas nul).
Toutefois, cela ne fonctionne pas car je ne peux pas supprimer un composant! Un pointeur?
Si il est une manière élégante de la gestion d'ajouter/supprimer des composants s'il vous plaît suggérer!
public class MainDisplayPanel extends JPanel implements ActionListener, MouseListener{
private JButton newClassButton;
private JButton deleteButton;
private Resizable current;
private Resizable resizer;
public MainDisplayPanel(LayoutManager layout) {
super(layout);
newClassButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
addResizer();
}
});
deleteButton = new JButton("Delete");
deleteButton.addActionListener(this);
this.addMouseListener(this);
this.add(newClassButton);
this.add(deleteButton);
}
public void addResizer() {
//JPanel panel = new JPanel();
//panel.setBackground(Color.white);
resizer = new Resizable( new ClassBox());
this.add(resizer);
this.revalidate();
this.repaint();
}
public void actionPerformed(ActionEvent e) {
if(current!=null)
{
this.remove(current);
this.revalidate();
this.repaint();
}
}
public void mouseClicked(MouseEvent e) {
System.out.println(e);
Component component = e.getComponent();
if(component instanceof Resizable)
current= (Resizable) e.getComponent();
}
public static void main(String[] args) {
JFrame jframe = new JFrame();
jframe.add(new MainDisplayPanel(null));
jframe.setSize(new Dimension(600,400));
jframe.setVisible(true);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Doh!
Maintenant, dans le addResizer() la méthode. Chaque fois que j'appuie sur le bouton ajouter pour ajouter un nouvel objet Redimensionnable, est-ce qu'arriver à la déjà ajouté des objets? Je suis certain qu'ils sont nuls parce que resizer variable n'est plus en se référant à eux??? Même si c'est le cas, ils sont toujours affichés sur le panneau...Et si j'appuie sur supprimer uniquement le nouvellement ajouté Redimensionnable objet est supprimé. Alors, suis-je sur la bonne voie?
Edit: pour résumer mon problème, j'ai accroché le MouseListener à un mauvais objet. Il devrait être Redimensionnable objet au lieu de le groupe. Par conséquent, la variable est toujours null.
- Peu difficile à dire exactement le problème sans une partie de votre code, mais je dirais une sorte de délimitation de l'étendue de la question (surtout avec anonyme auditeurs). Sinon, je pense que c'est à peu près ce que j'avais essayer aussi...
- Oui, j'utilise anonyme auditeurs. Ajouté le code dans certains trop.
Vous devez vous connecter pour publier un commentaire.
Votre problème est votre MouseLisetener. Vous êtes à l'écoute de la MainDisplayPanel, et ainsi, lorsque vous cliquez sur le Composite, le MouseEvent#getComponent méthode retournées par l'e, dans votre méthode mousePressed sera de retour le MainDisplayPanel exemple car c'est ce qui est en train d'être écouté, de ne pas le Redimensionnable instance qui est sous la souris.
Solutions:
componentAt(...)
méthode.Remarque que je devais créer mon propre SSCCE de résoudre ce problème. Dans l'avenir, veuillez nous faire une faveur et faire cela pour nous qu'il est vraiment dans votre et notre meilleur intérêt, et montre que vous respectez notre temps et de notre aide.
Edit 1
Mon SSCCE:
très fou, mais tout est possible, mais
1) dans le cas où vous Layed
JComponent
par l'utilisation de certaines deLayoutManager
vous pouvez supprimerJComponents
deContainer
, et thenafter vous devez/devoir appelerrevalidate()
+repaint()
, mais cette action a des effets secondaires ->ReLayout Container
et puis Conteneur du contenu pourrait être regarder très***
2) dans le cas où vous layed
Container
avecAbsoluteLayout
, qui devrait être peut-être plus belle, mais la question est ce que avec le vide de l'espace à l'intérieur deContainer
il est très facile de la manière de le faire, vous devez ajouter
JPopupMenu
à laContainer
,sur
RightMouseClick
vous devez trouverJComponent
en vertu de laMouseCursor
alors appel
Container#remove(myComponent)
, thenafter vous devez appelerrevalidate()
+repaint()
pour l'actualisation GUIou est de même pour moi
appel
myComponent.setVisible(false)
, pas de re-mise en page, pas de revalider + repeindre, JComponent en attente sur la place pour (enfin) la réutilisationexcellent thread sur la façon de LayoutManagers ajouter/supprimer des JComponents + revalider + repeindre
Component component = SwingUtilities.getDeepestComponentAt(...)
doit être un travail pour queJe crois que le problème est que vous devez forcer Swing à la disposition de l'composants de nouveau après la suppression d'un. Après la suppression de l'(courant), appelez-revalidate().
revalidate
et puisrepaint
le dernier surtout si un composant est supprimé.