我做了一个基于Java Swing的应用程序。
在我的应用程序上,如果我点击JFrame或任何地方的任何地方,那么我的右键单击不工作?
我没有设置这样的东西..那么为什么不工作?
为什么右键单击不能在java应用程序上工作?
基本上我的键盘不能正常工作的话,我尝试复制 - 使用鼠标,然后粘贴数据,我才要知道......我右键单击不工作在我的应用程序的任何区域...
我做了一个基于Java Swing的应用程序。
在我的应用程序上,如果我点击JFrame或任何地方的任何地方,那么我的右键单击不工作?
我没有设置这样的东西..那么为什么不工作?
为什么右键单击不能在java应用程序上工作?
基本上我的键盘不能正常工作的话,我尝试复制 - 使用鼠标,然后粘贴数据,我才要知道......我右键单击不工作在我的应用程序的任何区域...
你的右键单击工作得很好 - 在Swing中,通常不会获得你在其他应用中使用的上下文菜单。如果你想有一个弹出式菜单,例如用剪切/复制/粘贴操作右键单击,你必须自己实现它。我用我的应用程序是这样的:
public class ContextMenuMouseListener extends MouseAdapter {
private JPopupMenu popup = new JPopupMenu();
private Action cutAction;
private Action copyAction;
private Action pasteAction;
private Action undoAction;
private Action selectAllAction;
private JTextComponent textComponent;
private String savedString = "";
private Actions lastActionSelected;
private enum Actions { UNDO, CUT, COPY, PASTE, SELECT_ALL };
public ContextMenuMouseListener() {
undoAction = new AbstractAction("Undo") {
@Override
public void actionPerformed(ActionEvent ae) {
textComponent.setText("");
textComponent.replaceSelection(savedString);
lastActionSelected = Actions.UNDO;
}
};
popup.add(undoAction);
popup.addSeparator();
cutAction = new AbstractAction("Cut") {
@Override
public void actionPerformed(ActionEvent ae) {
lastActionSelected = Actions.CUT;
savedString = textComponent.getText();
textComponent.cut();
}
};
popup.add(cutAction);
copyAction = new AbstractAction("Copy") {
@Override
public void actionPerformed(ActionEvent ae) {
lastActionSelected = Actions.COPY;
textComponent.copy();
}
};
popup.add(copyAction);
pasteAction = new AbstractAction("Paste") {
@Override
public void actionPerformed(ActionEvent ae) {
lastActionSelected = Actions.PASTE;
savedString = textComponent.getText();
textComponent.paste();
}
};
popup.add(pasteAction);
popup.addSeparator();
selectAllAction = new AbstractAction("Select All") {
@Override
public void actionPerformed(ActionEvent ae) {
lastActionSelected = Actions.SELECT_ALL;
textComponent.selectAll();
}
};
popup.add(selectAllAction);
}
@Override
public void mouseClicked(MouseEvent e) {
if (e.getModifiers() == InputEvent.BUTTON3_MASK) {
if (!(e.getSource() instanceof JTextComponent)) {
return;
}
textComponent = (JTextComponent) e.getSource();
textComponent.requestFocus();
boolean enabled = textComponent.isEnabled();
boolean editable = textComponent.isEditable();
boolean nonempty = !(textComponent.getText() == null || textComponent.getText().equals(""));
boolean marked = textComponent.getSelectedText() != null;
boolean pasteAvailable = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null).isDataFlavorSupported(DataFlavor.stringFlavor);
undoAction.setEnabled(enabled && editable && (lastActionSelected == Actions.CUT || lastActionSelected == Actions.PASTE));
cutAction.setEnabled(enabled && editable && marked);
copyAction.setEnabled(enabled && marked);
pasteAction.setEnabled(enabled && editable && pasteAvailable);
selectAllAction.setEnabled(enabled && nonempty);
int nx = e.getX();
if (nx > 500) {
nx = nx - popup.getSize().width;
}
popup.show(e.getComponent(), nx, e.getY() - popup.getSize().height);
}
}
}
你到底应该这个监听器附加到要对右键快捷菜单的任何文本组件。
你的意思是你没有得到一个上下文菜单?在Swing应用程序中,你必须自己添加一个上下文菜单。 有关详细信息,请参见this article。
class Popup extends JPopupMenu
{
final static long serialVersionUID = 0;
Clipboard clipboard;
UndoManager undoManager;
JMenuItem jmenuItem_undo;
JMenuItem jmenuItem_cut;
JMenuItem jmenuItem_copy;
JMenuItem jmenuItem_paste;
JMenuItem jmenuItem_delete;
JMenuItem jmenuItem_selectAll;
JTextComponent jtextComponent;
public Popup()
{
undoManager = new UndoManager();
clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
jmenuItem_undo = new JMenuItem("undo");
jmenuItem_undo.setEnabled(false);
jmenuItem_undo.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
undoManager.undo();
}
});
this.add(jmenuItem_undo);
this.add(new JSeparator());
jmenuItem_cut = new JMenuItem("cut");
jmenuItem_cut.setEnabled(false);
jmenuItem_cut.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
jtextComponent.cut();
}
});
this.add(jmenuItem_cut);
jmenuItem_copy = new JMenuItem("copy");
jmenuItem_copy.setEnabled(false);
jmenuItem_copy.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
jtextComponent.copy();
}
});
this.add(jmenuItem_copy);
jmenuItem_paste = new JMenuItem("paste");
jmenuItem_paste.setEnabled(false);
jmenuItem_paste.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
jtextComponent.paste();
}
});
this.add(jmenuItem_paste);
jmenuItem_delete = new JMenuItem("delete");
jmenuItem_delete.setEnabled(false);
jmenuItem_delete.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
jtextComponent.replaceSelection("");
}
});
this.add(jmenuItem_delete);
this.add(new JSeparator());
jmenuItem_selectAll = new JMenuItem("select all");
jmenuItem_selectAll.setEnabled(false);
jmenuItem_selectAll.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
jtextComponent.selectAll();
}
});
this.add(jmenuItem_selectAll);
}
public void add(JTextComponent jtextComponent)
{
jtextComponent.addMouseListener(new MouseAdapter()
{
public void mouseReleased(MouseEvent event)
{
if (event.getButton() == 3)
{
processClick(event);
}
}
});
jtextComponent.getDocument().addUndoableEditListener(new UndoableEditListener()
{
public void undoableEditHappened(UndoableEditEvent event)
{
undoManager.addEdit(event.getEdit());
}
});
}
private void processClick(MouseEvent event)
{
jtextComponent = (JTextComponent)event.getSource();
boolean enableUndo = undoManager.canUndo();
boolean enableCut = false;
boolean enableCopy = false;
boolean enablePaste = false;
boolean enableDelete = false;
boolean enableSelectAll = false;
String selectedText = jtextComponent.getSelectedText();
String text = jtextComponent.getText();
if (text != null)
{
if (text.length() > 0)
{
enableSelectAll = true;
}
}
if (selectedText != null)
{
if (selectedText.length() > 0)
{
enableCut = true;
enableCopy = true;
enableDelete = true;
}
}
try
{
if (clipboard.getData(DataFlavor.stringFlavor) != null)
{
enablePaste = true;
}
}
catch (Exception exception)
{
System.out.println(exception);
}
jmenuItem_undo.setEnabled(enableUndo);
jmenuItem_cut.setEnabled(enableCut);
jmenuItem_copy.setEnabled(enableCopy);
jmenuItem_paste.setEnabled(enablePaste);
jmenuItem_delete.setEnabled(enableDelete);
jmenuItem_selectAll.setEnabled(enableSelectAll);
this.show(jtextComponent,event.getX(),event.getY());
}
}
,并实现它,
Popup popup = new Popup();
JTextArea jtextArea;
JTextField jtextField;
popup.add(jtextArea);
popup.add(jtextField);
太棒了!正是我在找的东西。对于任何新手而言,将其作为一个新文件添加到您的项目中,然后在您的txt组件上,像这样说: txtDescription.addMouseListener(new ContextMenuMouseListener()); – Richard 2012-01-07 14:03:43
完美,感谢分享。我已经在这里使用过你的课程:http://stackoverflow.com/a/11915456/549510 – Kingsolmn 2012-08-11 14:20:53