java - Swing:JPopupMenu 在 JFormattedTextField 上弹出时取消选择文本

标签 java swing popup

我尝试向 JFormattedTextField 添加“标准”剪切/复制/粘贴弹出菜单。

粘贴按预期工作,但剪切和复制则不然。问题是在弹出菜单期间 JFormattedTextField 丢失了它的选择。有什么想法为什么会发生这种情况以及如何解决它吗?

我的代码:

public class SwingTest {
    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setContentPane(new TestPanel());
        f.pack();
        f.setVisible(true);
    }

    public static class TestPanel extends JPanel {
        public TestPanel(){
            JFormattedTextField field = new JFormattedTextField("    ");
             JFormattedTextField component = field;
             final JPopupMenu menu = new JPopupMenu();
             JMenuItem item;
             item = new JMenuItem(new DefaultEditorKit.CopyAction());
             item.setText("Copy");
             item.setEnabled(component.getSelectionStart() != component.getSelectionEnd());
             menu.add(item);
             item = new JMenuItem(new DefaultEditorKit.CutAction());
             item.setText("Cut");
             item.setEnabled(component.isEditable() && component.getSelectionStart() != component.getSelectionEnd());
             menu.add(item);
             item = new JMenuItem(new DefaultEditorKit.PasteAction());
             item.setText("Paste");
             item.setEnabled(component.isEditable());
             menu.add(item);

            field.setComponentPopupMenu(menu);
            add(field, java.awt.BorderLayout.CENTER);
        }
    }
}

更新:快速调查显示上述代码在 OS X(我的操作系统)和 Windows(大多数评论者操作系统)下的工作方式不同。我正在寻找安全且跨平台的方式来显示弹出窗口。

最佳答案

我不确定这是你的问题。但是,

如果您的问题是右键单击时复制/剪切菜单被禁用,则会发生这种情况,因为您在 gui 启动(构造函数)时设置了可见性。因此没有文本,剪切复制项目被禁用,并且它们永远不会启用。您应该添加一个监听器,并应在操作触发时设置可见性。因此,当您右键单击菜单项时,菜单项将根据您的条件可见/隐藏。

例如

public class SwingTest {

    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setContentPane(new TestPanel());
        f.pack();
        f.setVisible(true);
    }

}

class TestPanel extends JPanel {

    public TestPanel() {
        setLayout(new BorderLayout());
        JFormattedTextField field = new JFormattedTextField("    ");
        JFormattedTextField component = field;
        final JPopupMenu menu = new JPopupMenu();
        JMenuItem item1, item2, item3;
        item1 = new JMenuItem(new DefaultEditorKit.CopyAction());
        item1.setText("Copy");

        menu.add(item1);
        item2 = new JMenuItem(new DefaultEditorKit.CutAction());
        item2.setText("Cut");

        menu.add(item2);
        item3 = new JMenuItem(new DefaultEditorKit.PasteAction());
        item3.setText("Paste");

        menu.add(item3);
        menu.addPopupMenuListener(new PopupMenuListener() {

            @Override
            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
                item1.setEnabled(component.getSelectionStart() != component.getSelectionEnd());
                item2.setEnabled(component.isEditable() && component.getSelectionStart() != component.getSelectionEnd());
                item3.setEnabled(component.isEditable());
            }

            @Override
            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
            }

            @Override
            public void popupMenuCanceled(PopupMenuEvent e) {
            }
        });
        field.setComponentPopupMenu(menu);
        add(field, java.awt.BorderLayout.CENTER);

    }
}

旁注:

1) 如果没有理由,请避免将 jpanel 声明为静态。将其作为实例。

2) 边框布局不是 jpanel 的默认布局管理器。您必须将布局设置为 TestPanel 的边框。

在您的代码中,您的面板布局是流布局(默认),但您调用

add(field, java.awt.BorderLayout.CENTER);

要纠正这个问题,您需要像这样设置边框布局

setLayout(new BorderLayout());

关于java - Swing:JPopupMenu 在 JFormattedTextField 上弹出时取消选择文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32433272/

相关文章:

java - 我想在两种不同类型的子 Activity 中重用父 Activity 的大部分可见部分

java - 如何测试基于ajax的网站?

java - 从 CellEditorListener 获取已编辑的 TreeNode

java JOptionPane 跳过按下 OK 按钮

javascript - 如何在弹出窗口而不是内部 html 中显示消息

java - 将实体持久化到数据库和搜索引擎

java - 使用相对路径读取 JAR 中的文件

java - 我的 JFrame 中的另一个重画问题

java - 如何使用 JSpinner 分别更改小时、分钟和秒?

javascript - 如何在不添加新行的情况下添加动画消失文本