【问题标题】:Swing - Changing different JLabels with the same Component Popup menuSwing - 使用相同的组件弹出菜单更改不同的 JLabel
【发布时间】:2014-01-26 22:49:13
【问题描述】:

我对 Swing 很陌生,任何帮助表示赞赏。 我有以下情况: 一个“主”类,我在其中定义我的主 JPanel 和默认标签文本。 一个“GUILabel”类(扩展了 JLabel),我在其中定义了文本标签的外观。 一个“popupmenu”类(扩展了 JPopupMenu),我在其中定义了 popupmenu 的内容。

目标: 当我右键单击面板时,应该会出现 popupMenu(这已经有效)。 当我选择这个 popupMenu 的一个菜单项时,我点击的标签的文本应该会改变。

我猜它目前不工作(我很抱歉这段代码不完整 - 这是我的第 5 次尝试),因为我在主类中创建了弹出菜单。然后我将此弹出菜单添加到每个标签。所以我猜这就是 getInvoker() 在弹出菜单类中返回 null 的原因。

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

主框架:

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"));
   }
}

GUI标签:

    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!" );
   }
}

【问题讨论】:

    标签: java swing actionlistener jcomponent jpopupmenu


    【解决方案1】:

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

    相反,向菜单项添加一个简单的 ActionListener,当被调用时,它使用 invoker 属性来确定应该发生哪个。

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

    【讨论】:

      【解决方案2】:

      向菜单项添加一个 ActionListener,例如:

      @Override
      public void actionPerformed(ActionEvent e)
      {
          Component c = (Component)e.getSource();
          JPopupMenu popup = (JPopupMenu)c.getParent();
          JLabel label = (JLabel)popup.getInvoker();
          ...
      }
      

      不要扩展 JPopupMenu 只是为了向弹出窗口添加一些菜单项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-11
        • 1970-01-01
        • 2011-08-25
        • 2017-01-10
        • 1970-01-01
        • 1970-01-01
        • 2013-06-16
        相关资源
        最近更新 更多