Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-如何在粘贴操作上设置Enabled()?_Java_Swing_Listener_Paste_Jmenuitem - Fatal编程技术网

Java-如何在粘贴操作上设置Enabled()?

Java-如何在粘贴操作上设置Enabled()?,java,swing,listener,paste,jmenuitem,Java,Swing,Listener,Paste,Jmenuitem,我正在用Java做我自己的记事本。基本部分差不多完成了。但是我对JMenuItem有一个大问题,它将单词粘贴到JTextPane。它可以工作(粘贴),但我希望JMenuItem能够做出反应: 什么时候内存中有东西(从任何地方复制)=>JMenuItem将setEnabled(true) 当不是内存中的某个内容时,JMenuItem将setEnabled(false) 我不知道,我应该听什么(什么样的听众??)为这个行动。我没有看到任何地方()。谢谢你的建议和关键词。我赢了,一部分:) 就我

我正在用Java做我自己的记事本。基本部分差不多完成了。但是我对
JMenuItem
有一个大问题,它将单词粘贴到
JTextPane
。它可以工作(粘贴),但我希望JMenuItem能够做出反应:

  • 什么时候内存中有东西(从任何地方复制)=>JMenuItem将
    setEnabled(true)
  • 当不是内存中的某个内容时,JMenuItem将
    setEnabled(false)


我不知道,我应该听什么(什么样的听众??)为这个行动。我没有看到任何地方()。

谢谢你的建议和关键词。我赢了,一部分:)

就我的案例而言:

// atributes
private static JMenuItem editPaste;
private static Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
// private method
clipboard.addFlavorListener(new ListenerPaste());
editPaste = new JMenuItem(new DefaultEditorKit.PasteAction());
editPaste.setEnabled(false);
// listener 
private static class ListenerPaste implements FlavorListener {
    public void flavorsChanged(FlavorEvent e) {
        checkPaste();
    }
}
// private method
private static void checkPaste() {
    try {
        if(clipboard.getData(DataFlavor.stringFlavor) != null) {
            editPaste.setEnabled(true);
            // JOptionPane.showMessageDialog(null, (String) clipboard.getData(DataFlavor.stringFlavor));
        }
    } catch (UnsupportedFlavorException e1) {
        e1.printStackTrace();
    } catch (IOException e1) {
        e1.printStackTrace();
    }
}
// in constructor we check it also
checkPaste();
我不知道这是否是最合适的解决方案,但对我来说,它是有效的。被评论的那一行——实时而言,它工作得不太好——更多: 下一来源:

是否希望将(自定义)内存与操作系统默认值分开?然后-是的,您可以实现它并在内存状态下触发事件changes@Tala不,我不想把它分开(我不确切知道)。我想要和记事本或记事本++一样的趣味性。嗯。。。剪贴板上不是总是有东西吗?无论如何,默认的textActions根本没有启用管理:您必须自己实现它。对于粘贴,您可以在剪贴板上尝试启用/禁用相应操作的FlavourListener。有关文本操作中(缺少)启用管理的一些详细信息:java中有一个类剪贴板,您可以在其上注册一个FlavourListener。希望这有帮助。我从来没有试过。
// atributes
private static JMenuItem editPaste;
private static Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
// private method
clipboard.addFlavorListener(new ListenerPaste());
editPaste = new JMenuItem(new DefaultEditorKit.PasteAction());
editPaste.setEnabled(false);
// listener 
private static class ListenerPaste implements FlavorListener {
    public void flavorsChanged(FlavorEvent e) {
        checkPaste();
    }
}
// private method
private static void checkPaste() {
    try {
        if(clipboard.getData(DataFlavor.stringFlavor) != null) {
            editPaste.setEnabled(true);
            // JOptionPane.showMessageDialog(null, (String) clipboard.getData(DataFlavor.stringFlavor));
        }
    } catch (UnsupportedFlavorException e1) {
        e1.printStackTrace();
    } catch (IOException e1) {
        e1.printStackTrace();
    }
}
// in constructor we check it also
checkPaste();