import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.text.DefaultEditorKit;
public class TextExample extends JFrame {
private static final long serialVersionUID = 1L;
private JTextArea textArea;
public TextExample() {
super();
initUI();
}
private void initUI() {
textArea = new JTextArea();
textArea.addMouseListener(new MouseAdapter() {
JPopupMenu popup;
public void mouseReleased(MouseEvent e) {
if(e.isPopupTrigger()) {
getPopup().show(textArea, e.getX(), e.getY());
}
}
private JPopupMenu getPopup() {
if(popup == null) {
popup = new JPopupMenu();
// Ich gehe hier davon aus, dass copyAction existiert!
popup.add(new DelegateAction("Kopieren", findAction(DefaultEditorKit.copyAction)));
}
return popup;
}
});
add(new JScrollPane(textArea));
}
private Action findAction(Object actionName) {
Action result = null;
for(Action action : textArea.getActions()) {
if(actionName.equals(action.getValue(Action.NAME))) {
result = action;
break;
}
}
return result;
}
class DelegateAction extends AbstractAction {
private static final long serialVersionUID = 1L;
private Action target;
public DelegateAction(String displayName, Action target) {
super(displayName);
this.target = target;
}
@Override
public void actionPerformed(ActionEvent e) {
target.actionPerformed(e);
}
}
public static void main(String[] args) {
final TextExample frame = new TextExample();
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
frame.setVisible(false);
System.exit(0);
}
});
frame.setSize(320, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}