2011-02-26 62 views
3

我试图在我的软件中构建一个简单的帮助系统。
从JEditorPane构建的帮助系统(用HTML文件加载)包装在JScrollPane内部,在同一个窗口内部有一个JLabel。
当用户将鼠标移到特定单词上的JEditorPane上时--JLabel中会出现更多解释。Java:JEditorPane在JScrollPane内部的奇怪行为

我成功做它,但问题是,由于某种原因,它的文本的开始只是工作。(HTML文件很长,必须滚动...)
后,我向下滚动页面并徘徊在一个字,它扔我BadLocationException

在下面的代码中有一个JEditorPane包装在JScrollPane中。
当用户移动鼠标时,它会打印鼠标指向的当前字母。 (在帮助系统上,我找到这个位置的单词的值,并根据它向JLabel打印解释)
但是,正如我所说的那样,它只是在文本的开始处起作用。
为什么?



import java.awt.Component; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.LayoutManager; 
import java.awt.Point; 
import java.io.IOException; 

import javax.swing.JEditorPane; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.text.BadLocationException; 

public class JEditorPaneTestApp extends JFrame { 

    private JEditorPane editorPan; 
    private JScrollPane scrollPan; 

    public JEditorPaneTestApp() { 
     super(); 
     try { 
      editorPan = new javax.swing.JEditorPane("file:///path/toHTML/file/helpFile.html"); 
     } 
     catch (IOException e) {e.printStackTrace();} 

     scrollPan = new JScrollPane(editorPan); 

     this.add(scrollPan); 

     editorPan.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { 
        public void mouseMoved(java.awt.event.MouseEvent evt) { 
         Point p = new Point(evt.getX(), evt.getY()); 
         int pos = editorPan.viewToModel(p); 
         try { 
         System.out.println(editorPan.getText(pos--, pos).charAt(0)); 
         } 
         catch (BadLocationException e1) { 
          System.out.println("Invalid location");/* e1.printStackTrace();*/ 
         } 
        } 
       }); 
     scrollPan.setViewportView(editorPan); 
     this.add(scrollPan); 

     // 
     this.getContentPane().setLayout(new LayoutManager() { 
      @Override public Dimension preferredLayoutSize(Container arg0) {return null;} 
      @Override public Dimension minimumLayoutSize(Container arg0) {return null;} 
      @Override public void removeLayoutComponent(Component arg0) {} 
      @Override public void addLayoutComponent(String arg0, Component arg1) {} 
      @Override public void layoutContainer(Container conter) { 
       scrollPan.setBounds(0, 0, conter.getWidth(), conter.getHeight()); 
      } 
     }); 

     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setVisible(true); 

    } 

    public static void main(String[] args) { 
     JEditorPaneTestApp test = new JEditorPaneTestApp(); 
    } 
} 


感谢

回答

3
System.out.println(editorPan.getText(pos--, pos).charAt(0)); 

应该是:

System.out.println(editorPan.getText(pos--, 1).charAt(0)); 
+0

如此简单,如此真实,非常感谢!!!!! – Arnon 2011-02-26 03:55:49