Probleme mit JPopupMenu und JMenuItem

Status
Nicht offen für weitere Antworten.

pinerski

Mitglied
Hallo,

hab ein Problem und komme einfach nicht weiter, trotz suche im Forum. Suchmaschine hilft leider auch nicht weiter.

Hier erstmal mein Quellcode:

Java:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;

public class PopupTest extends JFrame {

	private static final long serialVersionUID = 1L;

	private JPanel jContentPane = null;

	private JPopupMenu jPopupMenu = null;

	private JMenuItem jMenuItem1 = null;

	private JMenuItem jMenuItem2 = null;

	public JButton jButton = null;

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				PopupTest thisClass = new PopupTest();
				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				thisClass.setVisible(true);
			}
		});
	}

	public PopupTest() {
		super();
		initialize();
		getJPopupMenu();
	}

	private void initialize() {
		this.setSize(300, 200);
		this.setContentPane(getJContentPane());
		this.setTitle("JFrame");
	}

	private JPanel getJContentPane() {
		if (jContentPane == null) {
			GridBagConstraints gridBagConstraints = new GridBagConstraints();
			gridBagConstraints.gridx = 0;
			gridBagConstraints.gridy = 0;
			jContentPane = new JPanel();
			jContentPane.setLayout(new GridBagLayout());
			jContentPane.add(getJButton(), gridBagConstraints);
		}
		return jContentPane;
	}

	private JPopupMenu getJPopupMenu() {
		if (jPopupMenu == null) {
			jPopupMenu = new JPopupMenu();
			jPopupMenu.add(getJMenuItem1());
			jPopupMenu.add(getJMenuItem2());
		}
		return jPopupMenu;
	}

	private JMenuItem getJMenuItem1() {
		if (jMenuItem1 == null) {
			jMenuItem1 = new JMenuItem();
			jMenuItem1.setText("Item1 mit keyReleased oder MouseClicked");
			jMenuItem1.addKeyListener(new java.awt.event.KeyAdapter() {
				public void keyReleased(java.awt.event.KeyEvent e) {
					System.out.println(e.getKeyCode());
					if (e.getKeyCode() == 10 || e.getKeyCode() == 32) {
						// enter oder leerzeichen
						macheEtwas();
					}
				}
			});
			jMenuItem1.addMouseListener(new java.awt.event.MouseAdapter() {
				public void mouseClicked(java.awt.event.MouseEvent e) {
					if (e.getButton() == 1) {
						macheEtwas();
					}
				}
			});
		}
		return jMenuItem1;
	}

	private JMenuItem getJMenuItem2() {
		if (jMenuItem2 == null) {
			jMenuItem2 = new JMenuItem();
			jMenuItem2.setText("Item2 mit actionPerformed");
			jMenuItem2.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					macheEtwas();
				}
			});
		}
		return jMenuItem2;
	}

	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			jButton.setText("start popup");
			jButton.addKeyListener(new java.awt.event.KeyAdapter() {
				public void keyReleased(java.awt.event.KeyEvent e) {
					System.out.println(e.getKeyCode());
					if (e.getKeyCode() == 10 || e.getKeyCode() == 32) {
						// enter oder leerzeichen
						jPopupMenu.show(jButton, 0, 0);
					}
				}
			});
			jButton.addMouseListener(new java.awt.event.MouseAdapter() {
				public void mouseClicked(java.awt.event.MouseEvent e) {
					if (e.getButton() == 1) {
						jPopupMenu.show(jButton, 0, 0);
					}
				}
			});
		}
		return jButton;
	}

	private void macheEtwas() {
		System.out.println("es funktioniert :-)");
	}

}


Nun die Beschreibung:

Ich würde gerne ein JPopupMenu aufrufen und dann mit der Entertaste, Leertaste oder mit Mausklick ein JMenuItem auswählen.
So wenn ich nun im JMenuItem ein actionPerformed benutze, funktioniert es auch doch wenn ich enter drücke bleibt das enter im Buffer und ruft dann wieder das JPopupMenu auf.

Ich würde gerne für das JMenuItem ein keyReleased verwenden, aber das JPopupMenu ruft dann die methode nicht auf.

Vielleicht hat jemand einen Tipp, wie man das JPopupMenu so verändert, dass es erst verschwindet wenn ich eine Tast los lasse und nicht schon beim drücken verschwindet.

Gruß aus Gummersbach
 

velaluka

Aktives Mitglied
Hallo,
habe leider keine Möglichkeit jetzt Code zu testen, aber warum hängst du einen MouseListener an den Button. Ein Action Listener sollte doch reichen um auf MouseEvents zu reagieren. Ansonsten würde ich vorher testen ob mein Popup nicht schon angezeigt wird und nur wenn nicht die show Methode aufrufen....
Popup hat irgendwas in der Richtung ..... isPopupShown()

Hoffe es hilft
Ciao velaluka
 
G

Gast2

Gast
Java:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
 
public class PopupTest extends JFrame {
 
    private static final long serialVersionUID = 1L;
 
    private JPanel jContentPane = null;
 
    private JPopupMenu jPopupMenu = null;
 
    private JMenuItem jMenuItem1 = null;
 
    private JMenuItem jMenuItem2 = null;
 
    public JButton jButton = null;
 
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                PopupTest thisClass = new PopupTest();
                thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                thisClass.setVisible(true);
            }
        });
    }
 
    public PopupTest() {
        super();
        initialize();
        getJPopupMenu();
    }
 
    private void initialize() {
        this.setSize(300, 200);
        this.setContentPane(getJContentPane());
        this.setTitle("JFrame");
    }
 
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            GridBagConstraints gridBagConstraints = new GridBagConstraints();
            gridBagConstraints.gridx = 0;
            gridBagConstraints.gridy = 0;
            jContentPane = new JPanel();
            jContentPane.setLayout(new GridBagLayout());
            jContentPane.add(getJButton(), gridBagConstraints);
        }
        return jContentPane;
    }
 
    private JPopupMenu getJPopupMenu() {
        if (jPopupMenu == null) {
            jPopupMenu = new JPopupMenu();
            jPopupMenu.add(getJMenuItem1());
            jPopupMenu.add(getJMenuItem2());
        }
        return jPopupMenu;
    }
 
    private JMenuItem getJMenuItem1() {
        if (jMenuItem1 == null) {
            jMenuItem1 = new JMenuItem();
            jMenuItem1.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent arg0) {
					 macheEtwas();
					
				}});
        }
        return jMenuItem1;
    }
 
    private JMenuItem getJMenuItem2() {
        if (jMenuItem2 == null) {
            jMenuItem2 = new JMenuItem();
            jMenuItem2.setText("Item2 mit actionPerformed");
            jMenuItem2.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    macheEtwas();
                }
            });
        }
        return jMenuItem2;
    }
 
    private JButton getJButton() {
        if (jButton == null) {
            jButton = new JButton();
            jButton.setText("start popup");
            jButton.setComponentPopupMenu(getJPopupMenu());
        }
        return jButton;
    }
 
    private void macheEtwas() {
        System.out.println("es funktioniert :-)");
    }
 
}

Was für ein OS hast du ???
Unter Window schließt er es beim keyReleased und nicht beim press...
Ich würde bei Componenten immer die setComponentPopupMenu aufrufen, damit öffnet er Popupmenues wie Sie im OS eingestellt sind...
 
Zuletzt bearbeitet von einem Moderator:

pinerski

Mitglied
Hallo,
habe leider keine Möglichkeit jetzt Code zu testen, aber warum hängst du einen MouseListener an den Button. Ein Action Listener sollte doch reichen um auf MouseEvents zu reagieren. Ansonsten würde ich vorher testen ob mein Popup nicht schon angezeigt wird und nur wenn nicht die show Methode aufrufen....
Popup hat irgendwas in der Richtung ..... isPopupShown()

Hoffe es hilft
Ciao velaluka


Gibt es einen Grund warum du erst beim keyReleased das machen willst?

Also wenn ich das JPopMenu mit einem ActionListener realisiere dann verschwindet es so bald ich ein JMenuItem anklicke. Ist ja auch korrekt.
Wenn ich nun ein JMenuItem mit der Entertaste auswähle, dann verschwindet das JMenuItem auch, aber schon wenn ich auf die Taste drücke und wenn ich nun die Taste loslasse dann wird wieder ein Event ausgeführt und zwar von dem JButton das den Focus hat.

Deswegen wollte ich, dass JPopmenu erst verschwindet wenn ich die Tast los lasse.

Hoffe mein Problem ist verständlich.
 

pinerski

Mitglied
Was für ein OS hast du ???
Unter Window schließt er es beim keyReleased und nicht beim press...
Ich würde bei Componenten immer die setComponentPopupMenu aufrufen, damit öffnet er Popupmenues wie Sie im OS eingestellt sind...

Ich benutze Windows Vista und arbeite mit Eclipse.

Hab den Quellcode mal getestet. Da öffnet sich das Popup nun gar nicht.
Mein anderes Problem ist dass ich auch gerne mit enter einen Buttonklick auslösen möchte.
Deshalb auch der keyReleased.
 

Michael...

Top Contributor
Lösen könnte man das, in dem Du für den Button die keyPressed-Methode verwendest. Darin könntest Du abfragen, ob das Popupmenu gerade angezeigt wird
Code:
#isShowing()
und dem entsprechend darauf regieren.
Allerdings müsste man das für alle anderen Komponenten auch machen, die den Focus haben können und auf die Entertaste reagieren.
 
G

Gast2

Gast
Ich benutze Windows Vista und arbeite mit Eclipse.

Hab den Quellcode mal getestet. Da öffnet sich das Popup nun gar nicht.
Mein anderes Problem ist dass ich auch gerne mit enter einen Buttonklick auslösen möchte.
Deshalb auch der keyReleased.

Doch es öffnet sich mit rechtsklick so wie das üblich unter windows ist beim contextmenü ;)...

buttonclick mit enter ausführen brauchst du die actionmap von deinem button.
 

pinerski

Mitglied
Hab mich jetzt dafür entschieden mein eigenes Popupmenu zu erstellen. Das kann ich dann meinen Anforderungen am leichtesten anpassen.

  • Dafür benutze ich ein JDialog und setze es setUndecorated(true); damit es keinen Rahmen hat.
  • Mit einem FocusListener in dem Fenster aus dem ich das JDialog aufrufe, kann man nun sobald der Focus wieder da ist abfragen, welche auswahl getätigt wurde.
  • Zuvor muss man natürlich im JDialog eine public variable haben in der man die Auswahl speichert und bei einer getätigten Auswahl muss man den JDialog setVisible(false); setzen.
  • Damit der JDialog auch an der richtigen Stelle erscheint, muss man mit setLocation(Point p) die Position bestimmen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Probleme bei der Positionierung von JPopupMenu AWT, Swing, JavaFX & SWT 2
Juelin Probleme bei Stage.close() AWT, Swing, JavaFX & SWT 23
XWing Swing Image anzeigen und probleme mit klassen AWT, Swing, JavaFX & SWT 3
E repaint Probleme AWT, Swing, JavaFX & SWT 13
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
S GridBagLayout - Probleme mit Bilderanzeige AWT, Swing, JavaFX & SWT 3
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
J Probleme mit idividueller Tablecell AWT, Swing, JavaFX & SWT 0
D JavaFX Probleme beim nachtäglichen hinzufügen der jfx dependency AWT, Swing, JavaFX & SWT 7
J Probleme mit InputDialog AWT, Swing, JavaFX & SWT 4
D JavaFX TextArea Probleme bei langen Zeilen AWT, Swing, JavaFX & SWT 1
G JavaFX SplitPane Anwendung - Controller Probleme AWT, Swing, JavaFX & SWT 5
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
B Probleme Action Listener Taschenrechner AWT, Swing, JavaFX & SWT 27
pph080560 JavaFX Probleme mit FX AWT, Swing, JavaFX & SWT 3
M Probleme mit OpenJDK AWT, Swing, JavaFX & SWT 6
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
L JavaFX Probleme beim Installieren JavaFX11 / JavaFX12 -- Eclipse 2019-03 AWT, Swing, JavaFX & SWT 3
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
H JFreeChart - DemoDataSetFactory Probleme AWT, Swing, JavaFX & SWT 1
H LayoutManager Probleme mit Positionierung/Abständen der Komponenten AWT, Swing, JavaFX & SWT 14
A Probleme mit gridheight (GridBagLayout) AWT, Swing, JavaFX & SWT 6
U Opaque Probleme AWT, Swing, JavaFX & SWT 3
H JavaFX Probleme Beim Wechseln der scene als .fxml AWT, Swing, JavaFX & SWT 7
F JavaFX Probleme beim automatischen Konvertieren AWT, Swing, JavaFX & SWT 4
S Probleme mit JComboboxen(?) AWT, Swing, JavaFX & SWT 18
S Swing Probleme mit MigLayout AWT, Swing, JavaFX & SWT 2
C Probleme mit createImage AWT, Swing, JavaFX & SWT 1
J Probleme mit contex Menu (javafx) AWT, Swing, JavaFX & SWT 1
J Probleme bei GameofLife AWT, Swing, JavaFX & SWT 24
S JavaFx - Button ActionEvent Probleme AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 0
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 5
J LayoutManager GridBagLayout, probleme mit Anordnung von Objekten AWT, Swing, JavaFX & SWT 6
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit dem adden von JButtons zur JScrollPane AWT, Swing, JavaFX & SWT 2
D Swing Probleme mit dem Resizing AWT, Swing, JavaFX & SWT 7
G Probleme mit TextArea AWT, Swing, JavaFX & SWT 5
G JFrame Probleme AWT, Swing, JavaFX & SWT 2
K Probleme beim JPasswordField AWT, Swing, JavaFX & SWT 11
G Cardlayout Refresh Probleme AWT, Swing, JavaFX & SWT 2
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
D JavaFX Probleme bei Service-Klasse beim ändern der GUI AWT, Swing, JavaFX & SWT 8
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
M JButton Probleme AWT, Swing, JavaFX & SWT 14
L Probleme mit Programm AWT, Swing, JavaFX & SWT 13
blazingblade komischerweise probleme mit jtextfield.gettext() AWT, Swing, JavaFX & SWT 9
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
Sin137 LayoutManager GridBagLayout Probleme AWT, Swing, JavaFX & SWT 6
H Netbeans Designer: Probleme mit JPanel und JFrame AWT, Swing, JavaFX & SWT 2
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
C Java FX Probleme beim Schließen einer Stage AWT, Swing, JavaFX & SWT 11
M Swing JProgressbar und Outoputstream probleme AWT, Swing, JavaFX & SWT 2
S Swing Probleme mit transparenz der Hintergrundfarbe und JRadioButtons AWT, Swing, JavaFX & SWT 2
Z Probleme mit JPanel's AWT, Swing, JavaFX & SWT 6
T Probleme mit Anzeige von Elementen im JPanel AWT, Swing, JavaFX & SWT 1
Shams Probleme bei dem Hinzufügen von Komponenten zu einem JFrame AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit JScrollPane AWT, Swing, JavaFX & SWT 6
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
J JavaFX JavaFX Probleme bei der Anzeige von Text AWT, Swing, JavaFX & SWT 18
A Probleme mit TilledBorder("***") AWT, Swing, JavaFX & SWT 4
F Bildschirmschoner Probleme mit Preview AWT, Swing, JavaFX & SWT 8
X Panel Probleme (Tetris) AWT, Swing, JavaFX & SWT 8
N JTable probleme AWT, Swing, JavaFX & SWT 5
B Probleme bei ImageIO.read (?!) AWT, Swing, JavaFX & SWT 9
P JFrame Location-/Size-Probleme AWT, Swing, JavaFX & SWT 5
U LayoutManager Probleme mit Layouts AWT, Swing, JavaFX & SWT 5
C 3 kleine Probleme... AWT, Swing, JavaFX & SWT 13
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
A Probleme mit 2 JFrames in einem Programm AWT, Swing, JavaFX & SWT 7
K LayoutManager Probleme mit 2 Komponenten AWT, Swing, JavaFX & SWT 9
C Probleme mit Buttons und einem ActionListener AWT, Swing, JavaFX & SWT 2
M Probleme mit Verkleinern eines GUI AWT, Swing, JavaFX & SWT 7
B Swing label.setText() macht probleme AWT, Swing, JavaFX & SWT 5
B ImageIcon - Probleme mit dem Dateipfad AWT, Swing, JavaFX & SWT 5
H JTree Probleme AWT, Swing, JavaFX & SWT 9
F Probleme mit (Graphics g) II AWT, Swing, JavaFX & SWT 4
F Probleme mit (Graphics g) AWT, Swing, JavaFX & SWT 3
K 2D-Grafik .GIF macht mir Probleme AWT, Swing, JavaFX & SWT 14
B Probleme bei Sortierung einer Tabelle mit DefaultTableModel AWT, Swing, JavaFX & SWT 6
T JTable Graphik probleme AWT, Swing, JavaFX & SWT 3
H GridBagLayout macht Probleme... AWT, Swing, JavaFX & SWT 4
vandread Swing Probleme mit jTextField im zusammenspiel mit einem Einblendeffekt (inkl. KSKB) AWT, Swing, JavaFX & SWT 6
S Swing Lauftext Performance Probleme, in größerer Anwendung AWT, Swing, JavaFX & SWT 6
B Infolabel Probleme mit Paint() ? AWT, Swing, JavaFX & SWT 8
P Probleme mit setIconImage AWT, Swing, JavaFX & SWT 8
U Swing Probleme mit Asynchronen Prozessen und Swing: AWT, Swing, JavaFX & SWT 3
das-mo Probleme mit GridBagLayout AWT, Swing, JavaFX & SWT 6
N 2D-Grafik 2 Probleme beim zeichnen AWT, Swing, JavaFX & SWT 18
L Probleme mit JPanel AWT, Swing, JavaFX & SWT 8
D Probleme bei Übertrag von ArrayList in Jtable AWT, Swing, JavaFX & SWT 2
G kleinere Probleme mit GUI AWT, Swing, JavaFX & SWT 2
G Mehrere Probleme mit Java's GUI AWT, Swing, JavaFX & SWT 6
M Swing Erste Schritte mit der GUI, viele Probleme AWT, Swing, JavaFX & SWT 36
J GUI-Aktualisierungs-Probleme AWT, Swing, JavaFX & SWT 4
B Performance-Probleme AWT, Swing, JavaFX & SWT 17

Ähnliche Java Themen

Neue Themen


Oben