2016-04-12 6 views
0

Ich habe eine Seite mit Objekten darauf. Die Objektpositionen sind definiert durch Rectangle2D.Double. Wenn ich die Maus bewege, überprüfe ich, ob ein Rechteck den Mauszeiger enthält oder nicht. Wenn ja, möchte ich ein Hover-Over-Menü des Objekts anzeigen (bisher nur Text).Verwenden von JPopupMenu als Hover-Over-Anzeige immer noch sichtbar nach Alt-Tabbing

Was ich im Konstruktor haben, ist diese

annnotationPopupMenu = new JPopupMenu(); 
annotationTextArea = new JTextArea(5,20); 
annotationTextArea.setLineWrap(true); 
annnotationPopupMenu.add(annotationTextArea); 

und wenn ich über ein Objekt bin betreibe ich dieses

annotationTextArea.setText(annotation.getContent()); 
annnotationPopupMenu.setLocation(MouseInfo.getPointerInfo().getLocation().x+30, MouseInfo.getPointerInfo().getLocation().y); 
annnotationPopupMenu.setVisible(true); 

Wenn ich das Objekt

annnotationPopupMenu.setVisible(false); 

verlassen ist Lauf. Das Problem, das ich jetzt habe, ist, dass, wenn ich aus der Anwendung Tab und die Maus über ein Objekt war das JPopupMenu immer noch sichtbar ist, obwohl der Rest der Anwendung jetzt hinter dem Fenster ist, das ich übergebe.

Was muss ich tun, dass das JPopup-Menü entweder unsichtbar wird oder zumindest keine Priorität gegenüber dem Fenster hat, in das ich getippt habe.

Unterhalb eines MWE, die nur eine PopupMenu öffnet die auf der Oberseite bleibt auch Alt-Tab:

package popupmenutest; 

import javax.swing.JPopupMenu; 
import javax.swing.JTextArea; 

public class PopupMenuTest 
{ 

    public static void main(String[] args) 
    { 
    JPopupMenu annotationPopupMenu = new JPopupMenu(); 
    JTextArea annotationTextArea = new JTextArea(5,20); 
    annotationTextArea.setLineWrap(true); 
    annotationPopupMenu.setLocation(500, 400); 
    annotationPopupMenu.add(annotationTextArea); 
    annotationPopupMenu.setVisible(true); 
    } 
} 
+0

Bearbeiten Sie Ihre Frage gehören ein [MCVE] das ist das Problem zeigt Sie beschreiben, und identifiziert die Plattform betroffen. – trashgod

+0

Verwenden Sie 'setComponentPopupMenu()', für [Beispiel] (http://stackoverflow.com/a/5129757/230513). – trashgod

+0

Haben Sie erwogen, die bereits vorhandene Tooltip-Funktionalität zu nutzen? – MadProgrammer

Antwort

0

ich dieses Problem behoben, indem Sie den oberen Rahmen auf die WindowFocusListener Hinzufügen und dann auf windowLostFocus nenne ich die besondere Scheibe und Setzen Sie die Sichtbarkeit des JPopupMenu auf false.

Etwas wie folgt aus:

package popupmenutest; 

import javax.swing.JPopupMenu; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JFrame; 

import java.awt.Dimension; 
import java.awt.MouseInfo; 
import java.awt.event.WindowEvent; 
import java.awt.event.WindowFocusListener; 

public class PopupMenuTest implements WindowFocusListener 
{ 

    public PopupMenuTest() 
    { 

     frame = new JFrame(); 
     frame.setSize(800, 600); 
     popupMenu = new JPopupMenu(); 
     JTextArea annotationTextArea = new JTextArea(5,20); 
     JScrollPane scrollPane = new JScrollPane(annotationTextArea); 
     popupMenu.setPreferredSize(new Dimension(300, 120)); 
     annotationTextArea.setText("Dies hier ist ein Blindtext zum Testen von Textausgaben. Wer diesen Text liest, ist selbst schuld. Der Text gibt lediglich den Grauwert der Schrift an. Ist das wirklich so? " 
      + " Ist es gleichgültig, ob ich schreibe: Dies ist ein Blindtext oder Huardest gefburn? Kjift – mitnichten! Ein Blindtext bietet mir wichtige Informationen. An ihm messe ich die Lesbarkeit einer Schrift, " 
      + "ihre Anmutung, wie harmonisch "); 

     annotationTextArea.setLineWrap(true); 
     annotationTextArea.setWrapStyleWord(true); 
     annotationTextArea.invalidate(); 
     scrollPane.setVisible(true); 
     popupMenu.setLocation(MouseInfo.getPointerInfo().getLocation().x, MouseInfo.getPointerInfo().getLocation().y); 
     popupMenu.add(scrollPane); 
     popupMenu.pack(); 
     frame.add(popupMenu); 
     frame.addWindowFocusListener(this); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    } 

    @Override 
    public void windowGainedFocus(WindowEvent e) 
    { 

    } 

    @Override 
    public void windowLostFocus(WindowEvent e) 
    { 
     popupMenu.setVisible(false); 

    } 
    private JPopupMenu popupMenu; 
    private JFrame frame; 
} 
Verwandte Themen