Şu anda sağ tıklama ile yeni bir JMenu
örneğini başlatarak ve farenin konumunun konumuna ayarlayarak sağ tıklama içerik menüsü oluşturuyorum ... Daha iyi bir yolu var mı?Java Swing'de sağ tıklama bağlamı menüsünü nasıl oluşturabilirim?
cevap
. Bu menüde bazı kötü buggy davranışa neden olabilir.
show(Component, int x, int x)
yöntemi, setVisible(true)
'un yalnızca herhangi bir ek davranış eklemeden menüyü gösterdiği yerde, gerçekleşmesi gereken tüm şeyleri işler, (fareyle ilgili öğeleri vurgulayarak ve gerektiğinde pencereyi kapatırken).
Sağ tıklatma yapmak için açılan menüden bir JPopupMenu
oluşturun.
class PopUpDemo extends JPopupMenu {
JMenuItem anItem;
public PopUpDemo(){
anItem = new JMenuItem("Click Me!");
add(anItem);
}
}
Ardından, tüm yapmanız gereken sizin için pop-up menü istiyorum bileşenlerine özel bir MouseListener
eklemektir.
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());
Tabii ki, öğreticiler bir slightly more in-depth açıklama var.
Not: Eğer açılır menü kullanıcı tıklandığında yerden yolu kapalı göründüğünü fark ederse, x ve y koordinatları için e.getXOnScreen()
ve e.getYOnScreen()
yöntemleri kullanmayı deneyin.
JPopupMenu
sınıfının nasıl kullanılacağını açıklayan The Java Tutorials'un How to Use Menus yazısında Bringing Up a Popup Menu makalesinde bir bölüm bulunmaktadır.
Öğreticide yer alan örnek kod, bir açılır menüyü görüntülemesi gereken bileşenlere MouseListener
s bileşenlerinin nasıl ekleneceğini gösterir ve menüyü buna göre görüntüler.
(açıkladığınız yöntemi öğretici bir bileşeni üzerinde bir pop-up menü göstermek için bir yol sunar yol oldukça benzer.) Muhtemelen elle menüsünde setVisible(true)
aradığınız
Bu soru biraz eski - cevaplar (ve aynı zamanda öğretici)
Swing bir PopupMenu ayarlamak için geçerli API
myComponent.setComponentPopupMenu(myPopupMenu);
o automagicallylar gösterilir Bu yoludur gibi Hem fare hem de klavye tetikleyicileri için (ikincisi LAF'ye bağlıdır). Ayrıca, aynı açılır pencereyi bir kapsayıcının çocuklarında yeniden kullanmasını destekler. Tümünü seçmek geri ve işlevleri yinelemek,
myChild.setInheritsPopupMenu(true);
Aşağıdaki kod kopyalama, kesme, yapıştırma ile Windows
bilinen varsayılan bir içerik menüsünü uygulayan: Bu özelliği etkinleştirmek için. Ayrıca Linux
ve Mac OS X
çalışır:
import javax.swing.*;
import javax.swing.text.JTextComponent;
import javax.swing.undo.UndoManager;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class DefaultContextMenu extends JPopupMenu
{
private Clipboard clipboard;
private UndoManager undoManager;
private JMenuItem undo;
private JMenuItem redo;
private JMenuItem cut;
private JMenuItem copy;
private JMenuItem paste;
private JMenuItem delete;
private JMenuItem selectAll;
private JTextComponent textComponent;
public DefaultContextMenu()
{
undoManager = new UndoManager();
clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
addPopupMenuItems();
}
private void addPopupMenuItems()
{
undo = new JMenuItem("Undo");
undo.setEnabled(false);
undo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
undo.addActionListener(event -> undoManager.undo());
add(undo);
redo = new JMenuItem("Redo");
redo.setEnabled(false);
redo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
redo.addActionListener(event -> undoManager.redo());
add(redo);
add(new JSeparator());
cut = new JMenuItem("Cut");
cut.setEnabled(false);
cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
cut.addActionListener(event -> textComponent.cut());
add(cut);
copy = new JMenuItem("Copy");
copy.setEnabled(false);
copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
copy.addActionListener(event -> textComponent.copy());
add(copy);
paste = new JMenuItem("Paste");
paste.setEnabled(false);
paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
paste.addActionListener(event -> textComponent.paste());
add(paste);
delete = new JMenuItem("Delete");
delete.setEnabled(false);
delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
delete.addActionListener(event -> textComponent.replaceSelection(""));
add(delete);
add(new JSeparator());
selectAll = new JMenuItem("Select All");
selectAll.setEnabled(false);
selectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
selectAll.addActionListener(event -> textComponent.selectAll());
add(selectAll);
}
private void addTo(JTextComponent textComponent)
{
textComponent.addKeyListener(new KeyAdapter()
{
@Override
public void keyPressed(KeyEvent pressedEvent)
{
if ((pressedEvent.getKeyCode() == KeyEvent.VK_Z)
&& ((pressedEvent.getModifiersEx() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()) != 0))
{
if (undoManager.canUndo())
{
undoManager.undo();
}
}
if ((pressedEvent.getKeyCode() == KeyEvent.VK_Y)
&& ((pressedEvent.getModifiersEx() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()) != 0))
{
if (undoManager.canRedo())
{
undoManager.redo();
}
}
}
});
textComponent.addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent releasedEvent)
{
handleContextMenu(releasedEvent);
}
@Override
public void mouseReleased(MouseEvent releasedEvent)
{
handleContextMenu(releasedEvent);
}
});
textComponent.getDocument().addUndoableEditListener(event -> undoManager.addEdit(event.getEdit()));
}
private void handleContextMenu(MouseEvent releasedEvent)
{
if (releasedEvent.getButton() == MouseEvent.BUTTON3)
{
processClick(releasedEvent);
}
}
private void processClick(MouseEvent event)
{
textComponent = (JTextComponent) event.getSource();
textComponent.requestFocus();
boolean enableUndo = undoManager.canUndo();
boolean enableRedo = undoManager.canRedo();
boolean enableCut = false;
boolean enableCopy = false;
boolean enablePaste = false;
boolean enableDelete = false;
boolean enableSelectAll = false;
String selectedText = textComponent.getSelectedText();
String text = textComponent.getText();
if (text != null)
{
if (text.length() > 0)
{
enableSelectAll = true;
}
}
if (selectedText != null)
{
if (selectedText.length() > 0)
{
enableCut = true;
enableCopy = true;
enableDelete = true;
}
}
if (clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor) && textComponent.isEnabled())
{
enablePaste = true;
}
undo.setEnabled(enableUndo);
redo.setEnabled(enableRedo);
cut.setEnabled(enableCut);
copy.setEnabled(enableCopy);
paste.setEnabled(enablePaste);
delete.setEnabled(enableDelete);
selectAll.setEnabled(enableSelectAll);
// Shows the popup menu
show(textComponent, event.getX(), event.getY());
}
public static void addDefaultContextMenu(JTextComponent component)
{
DefaultContextMenu defaultContextMenu = new DefaultContextMenu();
defaultContextMenu.addTo(component);
}
}
Kullanımı: Doğru-tıklandığında açıkken
JTextArea textArea = new JTextArea();
DefaultContextMenu.addDefaultContextMenu(textArea);
Şimdi textArea
bağlam menüsünü olacaktır.
@BullyWillPlaza'nın önerdiği bu yöntemin kullanımını düzelteceğim.Bunun nedeni, yalnızca contextMenu'ya textArea eklemeyi denediğimde görünmüyor ve hem contextMenu'ya hem de bazı panellere eklediğimde, şunları yapıyor: Tasarım editörüne geçmeyi denediğimde farklı üst duble ilişkilendirmesi. Metin nesnesi için böyle
TexetObjcet.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)){
contextmenu.add(TexetObjcet);
contextmenu.show(TexetObjcet, 0, 0);
}
}
});
Yap fare dinleyici sen popup'ların olması gerekir. Bunu yapacağınız şey, metin nesnesine sağ tıkladığınızda, o açılır pencereyi ekleyip görüntüleyecektir. Bu şekilde bu hatayla karşılaşmazsınız. @BullyWillPlaza'nın yaptığı çözüm, programınızda uygulamak için çok iyi, zengin ve hızlıdır, bu yüzden onu nasıl göreceğinizi görmelisiniz.
Ayrıca, hala bu contextMenu'yu içe aktarmanız ve yeni örnek oluşturmanız gerektiğini unutmayın. –
- 1. Sağ Tıklama MainMenu
- 2. jQuery Bağlam Menüsünü Sağ Tık Yardım!
- 3. ClojureScript'te Sağ Tıklama Yapılsın mı?
- 4. Açısal 2 sağ tıklama olayları?
- 5. autohotkey ctrl + click = sağ tıklama
- 6. Bulucuya nasıl bir sağ tıklama menüsü ekleyebilirim
- 7. JavaScript'te sağ tıklama etkinliğini nasıl yakalarım?
- 8. Chrome Uzantısı - Sağ Tıklama Tarayıcısını Değiştir Eylem Menüsü
- 9. Menü Bağlamı Android'i, liste görüntüleme adaptöründeki tıklama düğmesiyle nasıl açılır?
- 10. Objective-C: NSStatusBar sağ ve sol tıklama
- 11. DataGridView sağ tıklama menüsü/kopya örneği?
- 12. Visual C# Form sağ tıklama düğmesi
- 13. Chrome eklentisi: Sağ tıklama menüsüne işlevler ekle
- 14. Sağ tıklama özel menüsü düzgün çalışmıyor
- 15. Sol sağdan farklı hareket etme sağ tıklama
- 16. Java sanal alanını nasıl oluşturabilirim?
- 17. Orijinal Nautilus içerik menüsünü düzenle
- 18. nasıl omurga içerisine uzun tıklama ve sağ tıklama olayları işlemek için JS
- 19. Java Swing JTable; Sağ Tıklama Menüsü (Seçimi seçmek için "seç" seçeneğini belirleyin.)
- 20. CSS3 ile akordeon menüsünü nasıl yapabilirim?
- 21. QPushButton bağlamında contextMenu öğesini sağ tıklayın
- 22. FreeTextBox menüsünü nasıl özelleştirebilirim?
- 23. Java kaynak kodundan dizi şemalarını nasıl oluşturabilirim?
- 24. Eclipse'de bir java masaüstü uygulaması nasıl oluşturabilirim?
- 25. , google-maps-v3'teki 'çift sağ tıklama' etkinliğini yakalayabilir miyiz?
- 26. Google Maps API 3: Sağ Tıklama Koordinatlarını Alın
- 27. Internet Explorer denetiminde içerik menüsünü devre dışı bırakma
- 28. Delphi menü öğesini sağ tıklatın sağ tıklayın
- 29. TinyMCE'de Bağlam Menüsünü Çıkarma
- 30. Akordeon'u sadece sağ sembolün sağ tarafında tıklayın
yukarıdaki kodu kullandıktan sonra, ben, Vinay –
user1035905 @ sen emin mı Saygılar "tipi Şekil yöntem addMouseListener (MouseListener) argümanlar (PopClickListener) için geçerli değildir" diyerek hatayı alıyorum ' PopClickListener, 'MouseAdapter' öğesini genişletiyor mu? – jjnguy
Klavyedeki içerik menüsü tuşu ile çalışmasını nasıl sağlarsınız? –