gpt4 book ai didi

java - 使用 TextAction 实现带有 actionPerformed 的 JMenu

转载 作者:行者123 更新时间:2023-11-30 03:45:25 27 4
gpt4 key购买 nike

我有一个带有多个 JTextArea 的 Java Swing 界面,并且我正在实现一个具有各种不同功能的“编辑”菜单,例如“查找”、“复制”、“粘贴”等。我点击 JMenuItem 我需要知道哪个 JTextArea 拥有焦点,这可以通过 TextAction 实现(我还没有沿着这条路线走下去FocusListener 并跟踪最后获得焦点的内容):

JMenuItem miFind = new JMenuItem(new EditHandler("Find"));

class EditHandler extends TextAction {
private String s = null;

public EditHandler(String vs) {
super(vs);
s = vs;
}

@Override
public void actionPerformed(ActionEvent e) {
JTextComponent c = getFocusedComponent();
if (s.equals("Find")) {
showFindDialog(c);
}
}
}

这工作得很好,但我希望能够在某些上下文下禁用“查找”JMenuItem(即,如果特定的JTextArea被禁用或为空。我可以在 JMenu 上实现 ActionListener,但无法使用 getFocusedComponent() 来识别 JTextArea 的内容重点。

根据 Java 文档,JMenu 构造函数采用 Action (如 JMenuItem),我尝试了以下操作:

mEdit = new JMenu(new EditHandler("Edit"));

但是,尽管构造函数触发,但 actionPerformed() 事件并未在 JMenuEditHandler 内触发。如果我能让它启动,那么我计划启用或禁用我的“查找”JMenuItem

最佳答案

最好的方法是使用文本组件的 Action 映射来放置相应的 Action 。在这种情况下,您可以对某些文本组件禁用它。

@Override
public void actionPerformed(ActionEvent e) {
JTextComponent c = getFocusedComponent();
if (s.equals("Find")) {
Action a = c.getActionMap().get("Find");
if (a.isEnabled()) {
// generate new event to modify the source (menu item -> text component)
ActionEvent ae = new ActionEvent(c, e.getID(), e.getCommand());
a.actionPerformed(ae);
}
}
}

对于每个文本组件,您必须提供一个操作并使用该组件的操作映射来注册它。

public class UniversalFindAction extends AbstractAction {
public void actionPerformed(ActionEvent ae) {
JTextComponent c = (JTextComponent) ae.getSource();
showFindDialog(c);
}
}

// registering of action
JTextComponent comp = new JTextArea();
comp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_DOWN_MASK), "Find");
comp.getActionMap().put("Find", new UniversalFindAction());

关于java - 使用 TextAction 实现带有 actionPerformed 的 JMenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25864037/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com