让我描述一下我的情况,我有SWTText
在我的JavaSESWT应用程序中:假设用户将在应用程序运行时向创建的Text
写入一些内容(String
)。我想介绍一些MouseListener,它会做到这一点:当用户单击Text
对象/小部件时,这个Text
会自行清除(setText("");
)(如果以前写过一些字符串)。
MouseListener
有3种方法:mouseDown(…)
,mouseUp(…)
,mouseDoubleClick(…)
-
在mouseDown(…)
方法中,我需要调用实际Text对象引用的方法:"XY". setText("");
鼠标点击进入的文本。-
我想以某种方式让它像通用MouseListener onMouseClickText
一样,它可以应用于我将在我的应用程序中使用的任何SWTText
。
有人知道如何执行这样的MouseListener
或更好的操作吗:如何在MouseListener
中获取对现有单击的SWTText
的引用?
这是示例代码:
package sk.tokra.example;
//imports here
.
.
import org.eclipse.swt.widgets.Text;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
.
.
public class Application {
//class fields
Text text;
private static final Logger logger = LoggerFactory.getLogger(Application.class);
.
.
.
// main
public static void main(String[] args) {
logger.debug("main(), Starting app!");
try {
Application window = new Application();
window.open();
} catch (Exception e) {
e.printStackTrace();
}
logger.debug("main(), Exiting app!");
return;
}
/**
* Open the window.
*/
public void open() {
logger.debug("open()");
Display display = Display.getDefault();
createContents();
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
/**
* Create contents of the window.
*/
protected void createContents() {
text = new Text(shell, SWT.BORDER);
text.addMouseListener(onMouseClickText);
.
.
.
}
//other stuff/methods/listener part
private MouseListener onMouseClickText = new MouseListener() {
@Override
public void mouseUp(MouseEvent arg0) {
logger.debug("onMouseClickFind, mouseUp()");
}
@Override
public void mouseDown(MouseEvent arg0) {
logger.debug("onMouseClickFind, mouseDown()");
// HERE I WOULD NEED to obtain refence of Text
// then call .setText("");
}
@Override
public void mouseDoubleClick(MouseEvent arg0) {
logger.debug("onMouseClickFind, mouseDoubleClick()");
}
};
}
正如Naveen建议的那样,使用焦点侦听器要好得多,因为同一个文本小部件可以通过多种不同的方式(如键盘上的选项卡)接收焦点。你可能也想处理这种情况。
在任何情况下,无论您在Text
上使用Focus usListener
还是MouseListener
,您都可以获取实际导致事件的小部件。在鼠标侦听器的情况下,您会收到MouseEvent
的实例,并且您可以使用MouseEvent#widget
访问Text控件。您的代码在侦听器实现中如下所示:
//other stuff/methods/listener part
private MouseListener onMouseClickText = new MouseListener() {
@Override
public void mouseUp(MouseEvent arg0) {
((Text) arg0.widget).setText("");
}
...
}
您可以将相同的侦听器实例添加到多个Text
小部件,它应该可以工作。