我是Swing的新手,不胜感激。
我有以下情况:
我定义主JPanel和默认Label文本的“ Main”类。
我定义文本标签外观的“ GUILabel”类(扩展了JLabel)。
我定义了popupmenu内容的“ popupmenu”类(扩展了JPopupMenu)。

目标:
当我右键单击面板时,应该会出现popupMenu(这已经起作用了)。
当我选择此popupMenu的菜单项时,我单击的标签的文本应更改。

我猜它当前不起作用(对不起,这段代码不完整-这是我的第五次尝试),因为我在Main Class中创建了一次弹出菜单。然后,我将此弹出菜单添加到每个标签。因此,我猜这就是为什么getInvoker()在弹出菜单类中返回null的原因。

但是我真的必须为每个JLabel创建一个新的popupmenu吗?不能将此单一菜单处理所有分配给的组件吗?

主框架:

package popupshit;

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.border.BevelBorder;

public class Model implements ActionListener {

   public static void main(String[] args) {
      JFrame frame = new JFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setLayout(new GridLayout(0, 3));
      frame.setVisible(true);

      GUIPopupMenu popup = new GUIPopupMenu(9);

      JLabel label1 = new GUILabel();
      label1.setComponentPopupMenu(popup);

      JLabel label2 = new GUILabel();
      label2.setComponentPopupMenu(popup);

      JLabel label3 = new GUILabel();
      label3.setComponentPopupMenu(popup);

      frame.add(label1);
      frame.add(label2);
      frame.add(label3);

      frame.pack();
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      ((JLabel) e.getSource()).setText("" + e.getActionCommand());
    }

}


弹出菜单:

package popupshit;

import java.awt.event.ActionListener;

import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;

public class GUIPopupMenu extends JPopupMenu {

   public GUIPopupMenu(int numbers) {

      for (int i = 1; i < numbers; i++) {
         JMenuItem popMenuItem = new JMenuItem("" + i);
         popMenuItem.addActionListener ((ActionListener) this.getInvoker());
         System.out.println(this.getParent());
         this.add(new JMenuItem("" + i));
      }
      this.addSeparator();
      this.add(new JMenuItem("remove"));
   }
}


GUILabel:

    package popupshit;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.border.BevelBorder;

import javax.swing.border.BevelBorder;

public class GUILabel extends JLabel implements ActionListener {

   public GUILabel() {
      this.setBorder(new BevelBorder(BevelBorder.LOWERED));
      this.setVisible(true);
      this.setPreferredSize(new Dimension(50, 50));
      this.setText("0");
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      this.setText((String) e.getActionCommand());
      JOptionPane.showMessageDialog(null, "worked!" );
   }
}

最佳答案

invokernull,因为在实际调用弹出菜单之前,它没有调用程序。

而是,向菜单项添加一个简单的ActionListener,该菜单项在调用时将使用invoker属性来确定应发生的情况。

我个人的喜好是分别为每个组件创建弹出菜单的新实例,并根据需要传递有关组件或其他控制器的引用...但这就是我...

10-05 21:31
查看更多