Swing/DefaultEditorKit のバックアップの現在との差分(No.11)
TITLE:DefaultEditorKitでポップアップメニューからコピー
Posted by terai at 2005-07-25
DefaultEditorKitでポップアップメニューからコピー
DefaultEditorKitを使って、JTextFieldなどでポップアップメニューを使ったコピー、貼り付け、切り取りを行います。- category: swing folder: DefaultEditorKit title: DefaultEditorKitでポップアップメニューからコピー tags: [DefaultEditorKit, JTextField, JTextComponent, JPopupMenu] author: aterai pubdate: 2005-07-25T08:41:31+09:00 description: DefaultEditorKitを使って、JTextFieldなどでポップアップメニューを使ったコピー、貼り付け、切り取りを行います。 image:
概要
DefaultEditorKit
を使って、JTextField
などでポップアップメニューを使ったコピー、貼り付け、切り取りを行います。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
#screenshot
サンプルコード
#spanend
#spandel
textField.setComponentPopupMenu(new TextFieldPopupMenu(textField));
#spanend
#spandel
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#spanadd
// textField.setComponentPopupMenu(new TextFieldPopupMenu());
#spanend
class TextFieldPopupMenu extends JPopupMenu {
private final Action cutAction = new DefaultEditorKit.CutAction();
private final Action copyAction = new DefaultEditorKit.CopyAction();
private final Action pasteAction = new DefaultEditorKit.PasteAction();
private final Action deleteAction;
private final Action cut2Action;
public TextFieldPopupMenu(final JTextField field) {
private final Action deleteAction = new AbstractAction("delete") {
@Override public void actionPerformed(ActionEvent e) {
Component c = getInvoker();
if (c instanceof JTextComponent) {
((JTextComponent) c).replaceSelection(null);
}
}
};
private final Action cut2Action = new AbstractAction("cut2") {
@Override public void actionPerformed(ActionEvent e) {
Component c = getInvoker();
if (c instanceof JTextComponent) {
((JTextComponent) c).cut();
}
}
};
#spanadd
#spanend
protected TextFieldPopupMenu() {
super();
add(cutAction);
add(copyAction);
add(pasteAction);
add(deleteAction = new AbstractAction("delete") {
public void actionPerformed(ActionEvent evt) {
field.replaceSelection(null);
}
});
add(deleteAction);
addSeparator();
add(cut2Action = new AbstractAction("cut2") {
public void actionPerformed(ActionEvent evt) {
field.cut();
}
});
add(cut2Action);
}
public void show(Component c, int x, int y) {
JTextField field = (JTextField)c;
boolean flg = field.getSelectedText()!=null;
cutAction.setEnabled(flg);
copyAction.setEnabled(flg);
deleteAction.setEnabled(flg);
cut2Action.setEnabled(flg);
super.show(c, x, y);
#spanadd
#spanend
@Override public void show(Component c, int x, int y) {
if (c instanceof JTextComponent) {
JTextComponent tc = (JTextComponent) c;
boolean f = tc.getSelectionStart() != tc.getSelectionEnd();
cutAction.setEnabled(f);
copyAction.setEnabled(f);
deleteAction.setEnabled(f);
cut2Action.setEnabled(f);
super.show(c, x, y);
}
}
}
解説
DefaultEditorKitには、エディタとして必要な最小限度の機能がデフォルトで実装されています。上記のサンプルでは、DefaultEditorKit.CopyActionで、システムクリップボードを使ったコピーをポップアップメニューで行っています。解説
-
DefaultEditorKit.CopyAction
をポップアップメニューに追加してクリップボードを使ったコピーなどが可能になるよう設定- サンプルの
cut2
のように、JTextComponent#cut()
メソッドなどを使用する方法もある
- サンプルの
- -
- サンプルを
Java Web Start
で起動した場合は、システム全体の共有クリップボードにはアクセス不可能でアプリケーション内部のみでのコピー、貼り付けとなる - ClipboardServiceでシステム全体の共有クリップボードにアクセスする
#screenshot(,screenshot2.png)
参考リンク
参考リンク
コメント
- 「今後この警告を表示しない」をやめて、セキュリティの警告を表示したいが方法が不明。 -- aterai
コメント
- 「今後この警告を表示しない」をやめて、セキュリティの警告を表示したいけど、やり方が分からないorz。 -- terai