1

GUI に追加される JTextField オブジェクトを返すファクトリを持つサード パーティ パッケージを使用するアプリケーションがあります。これは、使用される JTextField の約 10% を占めます。

サード パーティのパッケージを変更することはできませんが、すべてのフィールドに右クリック (切り取り、コピー、貼り付け) オプションを追加する必要があります。

これで、JTextField を拡張し、すべての機能が組み込まれた RightClickTextField ができました。これにより、アプリケーションの 90% の問題が解決されます。

ただし、サード パーティのパッケージを使用して JTextFields を取得している 10% については、フィールドを RightClickTextFields として宣言しながら、ボックスを取得する必要があるファクトリを使用できるソリューションが思い浮かびません。返されるオブジェクトは階層の上位にあるタイプではないため、結果をキャストできないことはわかっています。また、ファクトリによって設定されているすべてのプロパティをコピーできないため、コピー コンストラクターは機能しませんが、わかりません。 JTextField を自分の型にアップキャストする方法。ありますか?

4

3 に答える 3

2

右クリック機能をサブクラス化またはキャストするのではなく、 MouseInputListener インターフェイスを実装する独自のクラスに入れ、右クリック ハンドラのインスタンスを問題の JTextField オブジェクトに単純に追加できますか?

于 2012-09-07T15:02:07.860 に答える
1

多分Decorator Patternを使用してください。RightClickTextFieldこのようにして、使用をまったく停止できます。使用を開始しRightClickTextFieldDecoratorて、自分JTextFieldのまたはサードパーティから入手したものを使用してください。

于 2012-09-07T15:30:32.667 に答える
0

すべてのコメントをありがとう。私の質問に対する実際の答えは次のとおりです。

できません。

すべての提案は有効ですが、それらすべてを実行できることはわかっていましたが、最初に自分のやり方で実行できるかどうかを知りたかっただけです。

私の解決策(ここでのフィードバックと私自身の好みに基づく)は、以下にこのクラスを作成し、シングルトンからその単一のインスタンスを管理および公開することでした。

この解決策について考えていただければ幸いです。

import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.HashMap;
import java.util.Map;

import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.text.JTextComponent;

public class CopyPasteTextComponentPopoupMenu extends JPopupMenu implements
    ActionListener {


private JTextComponent lastInvoker;
private JMenuItem cutMenuItem;
private JMenuItem copyMenuItem;
private JMenuItem pasteMenuItem;

private Map<JTextComponent, JTCProperties> managedComponents;

private MouseListener heyListen;

public CopyPasteTextComponentPopoupMenu() {
    super();
    init();
}

public CopyPasteTextComponentPopoupMenu(String label) {
    super(label);
    init();
}

@Override
public void show(Component invoker, int x, int y) {

    JTCProperties props = managedComponents.get(invoker);
    if(props!=null) {
        this.lastInvoker = (JTextComponent) invoker;
        setEnabled(props);
        super.show(invoker, x, y);
    } else {
        this.lastInvoker = null;
    }
}

public void manageTextComponent(JTextComponent jtc, boolean canCut,
        boolean canCopy, boolean canPaste) {

    jtc.addMouseListener(heyListen);

    JTCProperties props = new JTCProperties(canCut,canCopy,canPaste);
    managedComponents.put(jtc,props);

}

public void dispose() {
    for (JTextComponent component : managedComponents.keySet()) {
        component.removeMouseListener(heyListen);
        managedComponents.remove(component);
    }
}

@Override
public void actionPerformed(ActionEvent e) {
    if (lastInvoker != null) {
        if (e.getSource() == cutMenuItem) {
            lastInvoker.cut();
        } else if (e.getSource() == copyMenuItem) {
            lastInvoker.copy();
        } else if (e.getSource() == pasteMenuItem) {
            lastInvoker.paste();
        }
    }
}

private void setEnabled(JTCProperties props) {
    cutMenuItem.setEnabled(props.canCut);
    copyMenuItem.setEnabled(props.canCopy);
    pasteMenuItem.setEnabled(props.canPaste);
}

private void init() {
    this.managedComponents = new HashMap<JTextComponent, JTCProperties>();
    this.setPreferredSize(new Dimension(100, 70));
    cutMenuItem = new JMenuItem("Cut");
    copyMenuItem = new JMenuItem("Copy");
    pasteMenuItem = new JMenuItem("Paste");

    cutMenuItem.addActionListener(this);
    copyMenuItem.addActionListener(this);
    pasteMenuItem.addActionListener(this);

    this.add(cutMenuItem);
    this.add(copyMenuItem);
    this.add(pasteMenuItem);

    heyListen = new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
            if (e.isPopupTrigger()) {
                show(e.getComponent(), e.getX(), e.getY());
            }
        }

        public void mouseReleased(MouseEvent e) {
            if (e.isPopupTrigger()) {
                show(e.getComponent(), e.getX(), e.getY());
            }
        }
    };
}

private class JTCProperties {
    public boolean canCut, canCopy, canPaste;

    public JTCProperties(boolean canCut, boolean canCopy, boolean canPaste) {
        this.canCut = canCut;
        this.canCopy = canCopy;
        this.canPaste = canPaste;
    }
}

}

于 2012-09-10T12:01:35.800 に答える