我正在使用 tuio 客户端-服务器设置和扩展多点触控 4 java 的触控库开发基于触控的 Windows 7 应用程序。我正在努力使用的功能之一是在使用触摸时启用文本突出显示。我使用 JTextPane 显示一个简单的 txt 文件来显示文本,突出显示是通过拖动操作完成的。我得到了拖动事件开始的单击位置,然后当它停止并尝试将这些坐标转换为文本面板的空间时,我得到的值与我应该拥有的值不同,通常在实际文本之前。
我用来显示文档的代码如下:
//Create the JDialog that is the container of it
window = new JDialog(parent);
window.setUndecorated(true);
//Create the JTextPane
text = new JTextPane();
text.setPage(newFile.toURI().toURL());
text.setEditable(false);
text.setHighlighter(null);
//ScrollPane that will be used to display the text
JScrollPane scroll = new JScrollPane(text);
scroll.setPreferredSize(new Dimension(500, 700));
window.getContentPane().add(scroll, BorderLayout.CENTER);
window.pack();
window.setVisible(true);
window.validate();
JDialog 父级是我的应用程序中使用的主要显示组件。
拖拽处理如下:
@Override
public boolean processGestureEvent(GestureEvent ge) {
if((ge instanceof DragEvent) && this.component.isHighlight())
{
tapCount=0;
if(this.component.isHighlight())
{
//do highlighting
DragEvent drag = (DragEvent) ge;
switch (drag.getId()) {
case GestureEvent.GESTURE_STARTED:
Point start = drag.getFrom();
Point calcStart = new Point(start.x - compPosition.x, start.y - compPosition.y);
startPos = this.textDisplay.viewToModel(calcStart);
break;
case GestureEvent.GESTURE_ENDED:
Point end = drag.getTo();
Point calcEnd = new Point(end.x - compPosition.x, end.y - compPosition.y);
endPos = this.textDisplay.viewToModel(calcEnd);
System.out.println("I have this positions:" + startPos + "/" + endPos);
System.out.println("Should have " + this.textDisplay.getSelectionStart() + "/" + this.textDisplay.getSelectionEnd());
System.out.println("And the text is: " + this.textDisplay.getText().substring(startPos, endPos));
break;
case GestureEvent.GESTURE_CANCELED:
startPos = 0;
endPos = 0;
break;
}
}
return true;
}
其中 compPosition 是保存文本窗格的 JDialog 的位置。我正在模拟鼠标的触摸,因此我从带有鼠标的文本窗格的内置突出显示功能中获得了突出显示的正确文本位置。
问题是因为 JDialog 和 JScroll 窗格以某种方式扭曲了转换吗?我从触摸中获得的点的坐标系位于屏幕左上角的原点,文本窗格的坐标系原点位于同一个左上角。
关于如何解决问题的任何想法?任何建议表示赞赏。
LE:我做错了,因为我在初始化组件时添加了手势处理器,它的位置是 (0,0),然后我才将它移动到我想要的位置。
我改变了位置计算如下:
Point calcStart = new Point(start.x - this.component.getLocation().x, start.y -this.component.getLocation().y);
而是传递对实际组件的引用并在需要时获取位置。