如何将swing JTextField组件转换为扩展它的类型的对象

时间:2012-09-07 14:53:30

标签: java swing inheritance jtextfield mouse-listeners

我有一个使用第三方软件包的应用程序,它有一个工厂,它返回给我的JTextField对象,然后添加到GUI。这占所使用的JTextField的大约10%。

我无法更改第三方软件包,但需要在所有字段中添加右键(剪切,复制和粘贴)选项。

现在我有一个RightClickTextField,它扩展了JTextField并具有内置的所有功能,这可以解决90%的应用程序的问题。

然而,对于使用第三方软件包获取JTextFields的10%,我无法想到一个解决方案,它允许我将字段声明为RightClickTextFields但是使用工厂我必须取回Boxes。我知道我无法转换结果,因为返回的对象不是层次结构中的高级类型,并且复制构造函数将无法工作,因为我无法复制工厂设置的每个属性,但我不知道一种将JTextField转换为我的类型的方法。有吗?

3 个答案:

答案 0 :(得分:2)

您可以将右键单击功能放入其自己的实现MouseInputListener interface的类中,而不是将其进行子类化或尝试强制转换,只需将右键单击处理程序的实例添加到相关的JTextField对象中?

答案 1 :(得分:1)

也许使用Decorator Pattern。通过这种方式,您可以完全停止使用RightClickTextField - 开始使用RightClickTextFieldDecorator并使用您自己的JTextField或您从第三方获得的内容提供。

答案 2 :(得分: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;
    }
}

}