我有一个使用第三方软件包的应用程序,它有一个工厂,它返回给我的JTextField对象,然后添加到GUI。这占所使用的JTextField的大约10%。
我无法更改第三方软件包,但需要在所有字段中添加右键(剪切,复制和粘贴)选项。
现在我有一个RightClickTextField,它扩展了JTextField并具有内置的所有功能,这可以解决90%的应用程序的问题。
然而,对于使用第三方软件包获取JTextFields的10%,我无法想到一个解决方案,它允许我将字段声明为RightClickTextFields但是使用工厂我必须取回Boxes。我知道我无法转换结果,因为返回的对象不是层次结构中的高级类型,并且复制构造函数将无法工作,因为我无法复制工厂设置的每个属性,但我不知道一种将JTextField转换为我的类型的方法。有吗?
答案 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;
}
}
}