2012-04-30 6 views
1

웹 페이지를 렌더링하고 그 안에있는 위치로 스크롤하려고합니다. 그러나 스크롤 기능이 작동하지 않습니다. 웹 페이지의 다른 부분으로 스크롤

import org.lobobrowser.html.*; 
import org.lobobrowser.html.gui.HtmlPanel; 
import org.lobobrowser.html.parser.*; 
import org.lobobrowser.html.test.*; 
import org.w3c.dom.*; 
import org.xml.sax.*; 

public class finall { 

    Node goTo; 


    public void show(URL url,Node theFinalNode) throws MalformedURLException, IOException, SAXException { 
     goTo = theFinalNode; 
     String uri=url.toString(); 

     URLConnection connection = url.openConnection(); 
     InputStream in = connection.getInputStream(); 
     Reader reader = new InputStreamReader(in); 
     InputSource is = new InputSourceImpl(reader, uri); 
     UserAgentContext uAgent=new SimpleUserAgentContext(); 

     final HtmlPanel htmlPanel = new HtmlPanel(); 
     HtmlRendererContext rendererContext = (HtmlRendererContext) new LocalHtmlRendererContext(htmlPanel, uAgent); 
     DocumentBuilderImpl builder = new DocumentBuilderImpl(uAgent, rendererContext); 
     Document document = builder.parse(is); 

     JFrame frame = new JFrame(); 
     frame.getContentPane().add(htmlPanel); 
     htmlPanel.setDocument(document, rendererContext); 
     frame.setSize(300, 450); 
     frame.setVisible(true); 

     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
      htmlPanel.scrollTo(goTo); 
     } 
    }); 

} 

누군가가 스크롤이 작동하지 않는 이유를 내가 이해하는 데 도움이 시겠어요 ... 내 코드입니다.

+0

예외가 있습니까? 디버깅이나 로그 나 콘솔에 메시지를 쓰는 것과 같이'run()'코드가 작동하는지 확인 했습니까? – wattostudios

+0

@WATTOStudios도 예외는 아닙니다. run() 메소드는 작동 중입니다. 함수가 작동하지만 거기에 필요한 것은 하나뿐입니다. – lonesome

답변

0

show 메소드에 전달중인 노드가 HtmlPanel에서보고있는 문서에없는 것처럼 보입니다. 코드에서 다음을 사용하여 문서를 빌드하십시오.

Document document = builder.parse(is); 

그러면 새 문서와 많은 새 노드가 작성됩니다. theFinalNode 매개 변수는. 서를 작성하기 전에 작성되었으므로이. 서의 일부가 아 U니다. 당신은, 또는 XPath는 같은 것을 사용하여 문서 오브젝트의 메소드를 호출하면 새 문서에서 원하는 노드를 추출해야합니다

http://www.roseindia.net/tutorials/xPath/java-xpath.shtml

당신은 실제로 본 문서의 일부 노드가 있으면 scrollTo 메소드가 작동해야합니다.

+0

음침한 내가 API를 읽은 후에도 의심 스러웠다. 문서에 따라 다르다는 것을 깨달았다. 함수에서 finallNode를 얻은 문서를 보낼 수있다. 그런 다음이 함수를 사용하여 언급 한 행으로 바꾼다. * htmlPanel.setDocument (doc.getOwnerDocument(), rendererContext) ** 어떤 문서가 finalNode가 결과로 나온 DOM의 rootNode이지만 어떤 문제가있는 인터넷에 나중에 변경 사항을 확인하고 만들어 주셔서 감사드립니다. 문서에 관한 것이 확실하다 :) 이번에는 작동하길 바란다. – lonesome

0

나는 HtmlPanelJScrollPane 안에 GUI에 추가되지 않았기 때문에 스크롤하지 않는 것 같습니다. 당신의 htmlPanel.scrollTo(goTo);가 나중에 실행될 때

JFrame frame = new JFrame(); 
frame.add(new JScrollPane(htmlPanel)); // CHANGED LINE HERE 
htmlPanel.setDocument(document, rendererContext); 
// Set the size of the JFrame when the root 
// component does not have a preferred size. 
frame.setSize(300, 450); 
frame.setVisible(true); 

지금,이 위치로 스크롤 할 수 있어야합니다 ... 다음 코드를 변경해보십시오.

+0

여전히 동일합니다. 이상한 것은 X의 좌표를 사용하는 다른 mjethod tto 스크롤을 사용할 때입니다. 그러나 Y를 사용하면 단어를 스크롤 할 때 노드를 사용하는 방법을 사용할 때 틀릴 수도있어? – lonesome

+0

두 가지 가능성이 곧바로 마음에 듭니다. 1. 아마도'scrollTo (goTo)'가'JFrame'이 표시되기 전에 실행되지 않았거나 최소한'JFrame'이 배치되기 전에 실행되지 않을 수도 있습니다. 어쩌면'scrollTo (goTo)'를 별도의'Thread'에 두거나 아마도'scrollTo (goTo)'바로 앞에'Thread.sleep (5000);을 시도해보십시오. 2. 다른 가능성은 'Node goTo'가 값을 가지지 않거나 문서에 없다는 것입니다. – wattostudios

+0

메신저 노드가 값을 가지고 있는지 확인하기 전에 함수로 보내기 전에 ... thread.sleep을 시도해보십시오 – lonesome

관련 문제