摆动 - 使用相同的组件弹出菜单更改不同的 JLabel



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

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

我想它目前不起作用(很抱歉这段代码不完整 - 这是我的第 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"));
}
}

圭拉贝尔:

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属性来确定应发生的事件。

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

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

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

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

最新更新