2009-04-20 37 views

cevap

127

. 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.

+0

yukarıdaki kodu kullandıktan sonra, ben, Vinay –

+1

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

+0

Klavyedeki içerik menüsü tuşu ile çalışmasını nasıl sağlarsınız? –

18

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

105

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); 
+0

Güncelleştirilmiş API ile bir eğitim sağlayabilir misiniz? –

+2

@ user681159 herhangi bir şey bilmiyor - ve buna gerek yok, IMO, sadece api dokümanı okuyun :-) :-) – kleopatra

+0

@downvoter - açıklamak ister misiniz? – kleopatra

5

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.

0

@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.

+0

Ayrıca, hala bu contextMenu'yu içe aktarmanız ve yeni örnek oluşturmanız gerektiğini unutmayın. –

İlgili konular