当前位置: 首页 > 知识库问答 >
问题:

Swing-使用同一组件弹出菜单更改不同的JLabel

汪高岑
2023-03-14

我是Swing的新手,感谢任何帮助。我有以下情况:一个“主”类,我在其中定义了我的主JPanel和默认标签文本。一个“GUILabel”类(扩展JLabel),我在其中定义了文本标签的外观。一个“弹出菜单”类(扩展JPopupMenu),我在其中定义了弹出菜单的内容。

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

我猜它目前不起作用(很抱歉,这段代码不完整——这是我第五次尝试),因为我在主类中创建了一次弹出菜单。然后我将这个弹出菜单添加到每个标签上。所以我想这就是为什么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());
    }

}

PopupMenu:

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

吉亚贝尔:

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

共有2个答案

董高逸
2023-03-14

将ActionListener添加到菜单项,如下所示:

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

不要仅仅为了在弹出窗口中添加几个菜单项而扩展JPopupMenu。

耿星雨
2023-03-14

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

相反,在菜单项中添加一个简单的ActionListener,当调用它时,它会使用invoker属性来确定应该发生什么。

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

 类似资料:
  • 我有一个组件(Widget——扩展了JPanel),我在上面实现了一个简单的弹出菜单。当点击面板的边框时,它会起作用,基本上除了面板布局包含面板内其他组件的地方之外,其他地方都会起作用。 因此,如果面板中有一个JTable,我可以在单击旁边的菜单时调用它(如果没有其他内容),但是当单击JTable时,什么也不会发生(表显然位于面板顶部,阻止MouseAdapter注册单击)。 我能以某种方式在右键

  • 问题内容: 我正在实现一个菜单,当用户单击头像时该菜单将打开。问题在于菜单在完全不同的位置呈现: 化身是右边的绿色“ OB”按钮。没有控制台错误,没有检查元素,它正在接收道具: 化身右侧的语言菜单呈现得很好,可以在应打开的位置打开。我的代码看起来不错,我真的不确定为什么位置错误: 我正在使用,但是我尝试在没有此程序包的情况下“现场”实现,结果是相同的。 在这方面的任何帮助表示赞赏。提前致谢 问题答

  • 我正在尝试使用Jetpack Compose重写我的项目UI。有没有办法在Android中使用jetpack compose添加弹出菜单?就像这个 我试图使用Stack()布局实现它,但结果并不理想。 而PopupState是 结果是 截图

  • 本文向大家介绍Java Swing中的下拉式菜单(menu)、弹出式菜单(JPopupMenu)、选项卡窗体(JTabbedPane)组件使用案例,包括了Java Swing中的下拉式菜单(menu)、弹出式菜单(JPopupMenu)、选项卡窗体(JTabbedPane)组件使用案例的使用技巧和注意事项,需要的朋友参考一下 菜单是GUI中最常用的组件,菜单不是Component类的子类,不能放置

  • mui框架内置了弹出菜单插件,弹出菜单显示内容不限,但必须包裹在一个含.mui-popover类的div中,如下即为一个弹出菜单内容: <div id="popover" class="mui-popover"> <ul class="mui-table-view"> <li class="mui-table-view-cell"><a href="#">Item1</a></li

  • 我有RecyclerView和信息旁边的每个项目都有一个按钮,三个点代表一个弹出菜单。当用户点击该按钮时,弹出菜单将显示更多信息。项目的某些部分变得可见。我不能使用一次性回收工具,我必须用这个。但问题是,当我点击它时,它只会展开和折叠我的RecyclerView上的最后一个项目,而不是点击的项目。我试过这样做:为RecyclerView项目创建选项菜单,并结合其他解决方案。我的代码就是基于这个问题