我尝试向 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/