向 JPanel 添加 JPopupMenu

4

我的代码:

class PanelGlowny extends JPanel implements ActionListener{}

public class Formatka extends JFrame implements ActionListener{

private JMenuItem klienciMenuItem = new JMenuItem("Klienci");
private JPopupMenu menuPopup = new JPopupMenu();
private PanelGlowny panelGlowny = new PanelGlowny();


public Formatka() {

    add(panelGlowny, BorderLayout.CENTER);
    menuPopup.add(klienciMenuItem);
    panelGlowny.setComponentPopupMenu(menuPopup);


   }
}

当我点击鼠标右键时,弹出菜单没有显示,为什么呢?

当我在鼠标上单击右键时,我没有看到弹出菜单。 为什么?没有人知道,请发布一个 SSCCE - mKorbel
你来自波兰吗?Klienci是波兰词汇 xD - barwnikk
3个回答

8

当添加到JPanel时,它对我有效。

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;

public class Formatka extends JPanel {

    private JMenuItem klienciMenuItem = new JMenuItem("Klienci");
    private JPopupMenu menuPopup = new JPopupMenu();

    public Formatka() {
        this.add(new JLabel("Right-click for popup menu."));
        menuPopup.add(klienciMenuItem);
        this.setComponentPopupMenu(menuPopup);
    }

    private void display() {
        JFrame f = new JFrame("Formatka");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Formatka().display();
            }
        });
    }
}

谢谢,你解决了我的问题。它之前无法工作是因为我将按钮添加到了我的JPanel中,当我像你的代码一样将其删除后,一切都正常了。谢谢。 - user1304098

2

您没有设置布局,因此该组件可能未添加到JFrame中。使用setLayout(new BorderLayout());为JFrame设置布局。


那行代码很重要,我们不能猜测你是否已经写下它。 - Hidde
PanelGlowny的默认布局是FlowLayout,它是从JPanel派生而来的;Formatka的默认布局是BorderLayout,它是从JFrame派生而来的。我不确定再次设置后者会有什么帮助。 - trashgod

1

这适用于JFrame :D

    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import javax.swing.JMenuItem;
    import javax.swing.JPopupMenu;
    import javax.swing.JFrame;

    public class Popup extends JFrame{
        JMenuItem item1,item2;
        static JPopupMenu pop;

        Popup(){
          item1= new JMenuItem("This is Menu Item");
          item2= new JMenuItem("This is another Menu Item");

          pop= new JPopupMenu();

          MouseListener popListener = new PopupListener();

          pop.add(item1);
          pop.add(item2);

          addMouseListener(popListener);        

          setLocationRelativeTo(null);
          pack();
          setVisible(true);
    }

      public static void main(String a []){
          new Popup();
      }

    }

    class PopupListener extends MouseAdapter{

     public void mousePressed(MouseEvent e) {
          maybeShowPopup(e);
          }

       public void mouseReleased(MouseEvent e) {
        maybeShowPopup(e);
       }

       private void maybeShowPopup(MouseEvent e) {
        if (e.isPopupTrigger()) {
            Popup.pop.show(e.getComponent(),
                    e.getX(), e.getY());
        }
      }

    }

1
但是你不应该那样做,至少没有非常好的理由的情况下不应该这样做;-) 一般的规则是始终使用可用的最高抽象层,这里是setComponentPopup。 - kleopatra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接