# Schließen von JPopupMenu



## Guest (30. Mrz 2006)

Hi
Ich habe ein JPopupMenu, welches ich gerne schliessen möchte. Ich habe es mit setVisible(false) versucht, aber es klappte irgendwie nicht. Kann mir da wohl jemand weiterhelfe? Danke im Voraus!


----------



## André Uhres (31. Mrz 2006)

Anonymous hat gesagt.:
			
		

> ...Ich habe ein _JPopupMenu_, welches ich gerne schliessen möchte...


Wie machst du das _JPopupMenu _sichtbar?
Normalerweise geht das ja mit einem Rechtsklick auf eine Komponente, z.B. auf eine _JTextArea_.
Ein _MouseListener _macht das dann mit _popup.show(..)_ sichtbar.
Es verschwindet automatisch wenn du einen Menüpunkt auswählst, 
oder wenn du neben das popup klickst, oder wenn du die Escape-Taste drückst.
http://java.sun.com/docs/books/tutorial/uiswing/components/example-1dot4/PopupMenuDemo.java
Gruß
André


----------



## RawBit (31. Mrz 2006)

probiers mal so


```
addMouseListener( new MouseAdapter() {
      public void mouseReleased( MouseEvent me ) {
        if(me.isPopupTrigger() )
          popman.show(me.getComponent(), me.getX(), me.getY());
      }
    });
```

popman ist das JPopMenu...


----------



## thE_29 (31. Mrz 2006)

Liest sich eigentlich irgendwer die Frage auch noch durch??


Er möchte es einfach, schließen und net wenn es automatisch zugehen sollte und auch net wie man es anzeigt....

Probier mal 

JPopupMenu.menuSelectionChanged(false);

Bei mir wars dann weg! (es verschwand aber auch mit setVisible(false))


----------



## André Uhres (31. Mrz 2006)

thE_29 hat gesagt.:
			
		

> Liest sich eigentlich irgendwer die Frage auch noch durch??..


Ja doch. Aber da Otto Normalverbraucher sich um's Popupschliessen nicht kümmern müssen sollte,
ist die *Ursache *des Problems höchstwahrscheinlich das eigentliche Problem.
In dem Fall wäre ein direkter Lösungversuch eigentlich nur Flickarbeit.


----------



## Caffè Latte (31. Mrz 2006)

Hi,

aus mir bekannten Anwendungen kenne ich das nur so wie von André beschrieben. Und soll in bestimmten Fällen kein Popup-Menü erscheinen verhindere ich das explizit für den Fall. 

Alles andere macht doch irgendwie keinen Sinn, oder? Und wie man anständige GUIs baut steht hier:  Java Look and Feel Design Guidelines

Caffè Latte


----------



## aze (29. Jul 2009)

Ich habe ein ähnliches Problem:

Ich habe ein JTextField,dass per Mausklick ein JPopMenu erzeugt und öffnet (Show Befehl).Der Inhalt des Popups ist abhängig von einen anderen JtextField.Das Schließen des Popups mit setVisible(false) klappt auch,aber wenn ich jetzt ein zweites mal das Popup öffne erscheint immer noch das alte.Gibt es nicht einen Weg ähnlich wie mit dispose() ein Popup ganz "zu zerstören" ?


----------



## Ebenius (29. Jul 2009)

PopupMenu's öffnet man nicht (mehr) per MouseListener. Dann funktioniert nämlich die hübsche Taste auf der Tastatur nicht. Daher besser: 
	
	
	
	





```
textField.setComponentPopupMenu(aPopupMenu)
```
Wenn das Popupmenü unterschiedlichen dynamischen Inhalt haben soll, kann man das mit einem Listener auf dem PopupMenu lösen.

Kleines Beispiel: 
	
	
	
	





```
final JPopupMenu menu = new JPopupMenu();
menu.addPopupMenuListener(new PopupMenuListener() {

  int test = 0;

  public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
    menu.removeAll();
    if ((test++ % 2) == 0) {
      menu.add(new JMenuItem("A"));
    } else {
      menu.add(new JMenuItem("B"));
    }
  }

  public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {}

  public void popupMenuCanceled(PopupMenuEvent e) {}
});
final JTextField textField = new JTextField(40);
textField.setComponentPopupMenu(menu);

final JFrame f = new JFrame("Test Frame: GridBagTest"); //$NON-NLS-1$
f.setContentPane(textField);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
```
Ebenius


----------



## aze (29. Jul 2009)

Ich hab im meinen JPopUpmenu keine Menuitems drin sondern andere Komponenten,nämlich eine JTable und ein JPanel.LEider funktioniert es nicht

eigentlich bräuchte ich auch nur ein Popup aber bei der Popup Klasse von Swing wusste ich nicht wie man Hintergrundfarbe oder ähnliches einstellt oder überhaupt einstellen kann.


----------



## Ebenius (29. Jul 2009)

Eine JTable im PopupMenu... Das hab ich auch noch nicht gesehen.

Kleines Beispiel, wie man die PopupFactory benutzt: 
	
	
	
	





```
/* (@)PopupFun.java */

/* Copyright 2009 Sebastian Haufe

 * Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

 * Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package com.ebenius.swing;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

/**
 * Test class for {@link PopupFactory} usage.
 * 
 * @author Sebastian Haufe
 */
public class PopupFun {

  /**
   * Test main method.
   * 
   * @param args ignored
   */
  public static void main(String[] args) {

    final JButton button = new JButton(new AbstractAction("Popup") {

      public void actionPerformed(ActionEvent e) {
        final JScrollPane scrollPane = new JScrollPane(new JTable(7, 2));
        scrollPane.getViewport().setBackground(Color.GREEN);
        final Point p = MouseInfo.getPointerInfo().getLocation();
        final PopupFactory pfac = PopupFactory.getSharedInstance();
        final Popup popup =
              pfac.getPopup((Component) e.getSource(), scrollPane, p.x, p.y);
        popup.show();
        final Timer timer = new Timer(5000, new ActionListener() {

          public void actionPerformed(ActionEvent e) {
            popup.hide();
          }
        });
        timer.setRepeats(false);
        timer.start();
      }
    });

    final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
    contentPane.add(button);

    final JFrame f = new JFrame("Test Frame: PopupFun"); //$NON-NLS-1$
    f.setContentPane(contentPane);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }
}
```
Ebenius


----------



## aze (29. Jul 2009)

Hmm okay.

Es hat zwar nichts mit den ursprünglichen Thema zu tun ,aber wie bekomm ich es jetzt hin ,dass das Popup die Eigenschaften von JPopMenu bekommt.Das Popup soll verscheinden wenn man auf das ursprüngliche Fenster klickt oder auf eine Zelle der Tabelle.


----------



## Ebenius (29. Jul 2009)

Wenn es sich nicht um ein PopupMenu handelt, dann kannst Du durchaus einen MouseListener nehmen. Wofür ist das Popup denn da?

Ebenius


----------



## aze (29. Jul 2009)

Man soll in dem Popup ein Datum auswählen ,dass in der besagten JTable ist.
Nach der Auswahl soll sich das Popup schließen.Oder wenn man eben auf das Ursprungsfenster klickt.

Ich hab die Kompionente die vorher ein JPopUpMenu war jetzt zu einen JPanel geändert das per Popup geöffnet wird.Auf Msudruck auf die Tablle soll das Panel unsichtbar gesetzt werden(setVisible(false)).Es wird aber zu einer weisen Fläche


----------



## Ebenius (29. Jul 2009)

Steht doch in meinem Quelltext oben: Popups erzeugt man mit der PopupFactory, geschlossen werden sie mit [c]Popup.hide()[/c].

Ebenius


----------



## aze (29. Jul 2009)

Mit 
	
	
	
	





```
Popup.hide
```
 passiert leider dasselbe

Edit:Geht doch.


----------

