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

标签 java swing awt jmenu

我有一个带有多个 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/

相关文章:

java - 跨类使用资源?

java - Repaint() 没有在 Java while 循环中被调用

Java输入错误

java - 停止 HtmlUnit 加载外部 Javascript/CSS 以测试性能?

java - 如何 "disable"Java对象?

java - 使用tomcat时无法使用java包

java - 将控制台数据写入文件并在新框架上显示相同的文件

java - 更改 JButton 对象上文本的颜色

当框架不可见时,Java 不处理对话框

java - JTextArea:如何将行、列转换为偏移量?