Obecnie tworzę menu kontekstowe prawego przycisku myszy, tworząc instancję nowego JMenu
po kliknięciu prawym przyciskiem myszy i ustawiając jego lokalizację na położenie myszy ... Czy jest lepszy sposób?
źródło
Obecnie tworzę menu kontekstowe prawego przycisku myszy, tworząc instancję nowego JMenu
po kliknięciu prawym przyciskiem myszy i ustawiając jego lokalizację na położenie myszy ... Czy jest lepszy sposób?
Prawdopodobnie ręcznie wywołujesz setVisible(true)
menu. Może to spowodować nieprzyjemne zachowanie w menu.
Te show(Component, int x, int x)
uchwyty metoda wszystkie rzeczy trzeba się stało, (Podświetlanie rzeczy po najechaniu myszą i zamykając okienko w razie potrzeby), gdzie przy użyciu setVisible(true)
tylko pokazuje menu bez dodawania żadnego dodatkowego postępowania.
Aby wyświetlić menu podręczne prawego przycisku myszy, po prostu utwórz plik JPopupMenu
.
class PopUpDemo extends JPopupMenu {
JMenuItem anItem;
public PopUpDemo() {
anItem = new JMenuItem("Click Me!");
add(anItem);
}
}
Następnie wszystko, co musisz zrobić, to dodać niestandardowe MouseListener
do komponentów, dla których ma się pojawiać menu.
class PopClickListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger())
doPop(e);
}
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger())
doPop(e);
}
private void doPop(MouseEvent e) {
PopUpDemo menu = new PopUpDemo();
menu.show(e.getComponent(), e.getX(), e.getY());
}
}
// Then on your component(s)
component.addMouseListener(new PopClickListener());
Oczywiście samouczki mają nieco bardziej szczegółowe wyjaśnienie.
Uwaga: Jeśli zauważysz, że menu podręczne pojawia się daleko od miejsca, w którym użytkownik kliknął, spróbuj użyć metod e.getXOnScreen()
i e.getYOnScreen()
dla współrzędnych x i y.
PopClickListener
rozszerzaMouseAdapter
?component
?To pytanie jest trochę stare - podobnie jak odpowiedzi (i samouczek)
Bieżący interfejs API do ustawiania popupMenu w Swing to
W ten sposób zostanie to pokazane automagicznie, zarówno dla wyzwalaczy myszy, jak i klawiatury (ten ostatni zależy od LAF). Ponadto obsługuje ponowne użycie tego samego wyskakującego okienka w elementach podrzędnych kontenera. Aby włączyć tę funkcję:
źródło
JTable
tak, że pojawia się w wybranym wierszu lub w wierszu, w którym klikasz prawym przyciskiem myszy? Czy w tym scenariuszu należy wybrać starą metodę?Jest sekcja na wychowywanie Menu kontekstowe w Jak korzystać z menu artykule Java Tutorial , który wyjaśnia, jak korzystać z
JPopupMenu
klasy.Przykładowy kod w samouczku pokazuje, jak dodać
MouseListener
s do komponentów, które powinny wyświetlać wyskakujące menu, i odpowiednio wyświetla menu.(Metoda, którą opisujesz, jest dość podobna do sposobu, w jaki samouczek przedstawia sposób wyświetlania wyskakującego menu komponentu).
źródło
Poniższy kod implementuje domyślne menu kontekstowe znane
Windows
z funkcji kopiowania, wycinania, wklejania, zaznaczania wszystkiego, cofania i ponawiania. Działa również naLinux
iMac OS X
:Stosowanie:
Teraz
textArea
będzie mieć menu kontekstowe po kliknięciu prawym przyciskiem myszy.źródło
releasedEvent.isPopupTrigger()
zamiastreleasedEvent.getButton() == MouseEvent.BUTTON3
działać poprawnie na wszystkich platformach.pressedEvent.getModifiersEx() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
muszą to być obaEx
lub nieEx
.Ex
WersjagetMenuShortcutKeyMask()
jest dostępna tylko od java 10+.Poprawię użycie tej metody, którą zasugerował @BullyWillPlaza. Powodem jest to, że kiedy próbuję dodać pole textArea tylko do contextMenu, nie jest to widoczne, a jeśli dodam je zarówno do contextMenu, jak i do jakiegoś panelu, następuje liczenie: Różne podwójne skojarzenie nadrzędne, jeśli spróbuję przejść do edytora projektu.
Uczyń nasłuchiwanie myszy w ten sposób dla obiektu tekstowego, na którym chcesz mieć wyskakujące okienko. To, co zrobisz, to kliknięcie prawym przyciskiem myszy na obiekt tekstowy, a następnie doda to wyskakujące okienko i wyświetli je. W ten sposób nie napotkasz tego błędu. Rozwiązanie, które stworzył @BullyWillPlaza jest bardzo dobre, bogate i szybkie do wdrożenia w twoim programie, więc powinieneś go wypróbować, zobacz, jak ci się podoba.
źródło