2016-11-10 10 views
0

JFrame의 버튼 클릭 이벤트에서 JEditorPane 내에서 볼 수있는 html 페이지를 변경하는 방법에 대해 알고 싶습니다. 정말 미안 해요. 기본 설명이 정말 감사하겠습니다. 여기 페이지 1 내용)에 기록된다버튼 클릭시 JEditorPane 내의 html 페이지 변경하기

package test1; 

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URI; 
import java.net.URL; 

import javax.swing.JButton; 
import javax.swing.JEditorPane; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.event.HyperlinkEvent; 
import javax.swing.event.HyperlinkListener; 

public class check1 extends JFrame implements ActionListener{ 
    JEditorPane jep; 
    JScrollPane scroll; 
    JPanel p,p1; 
    JButton b,b1,b2,b3; 
    Dimension d; 
    String url; 
    public check1() { 
     d = new Dimension(500, 1500); 

     b = new JButton("Click ME"); 
     b.addActionListener(this); 

     b1 = new JButton("Click ME"); 

     b2 = new JButton("Click ME"); 
     //b2.setBounds(0, 100, 70, 40); 
     b3 = new JButton("Click ME"); 
     //b3.setBounds(0, 150, 70, 40); 

     p = new JPanel(); 
     p.setLayout(new FlowLayout()); 
     p.add(b); 

     p1 = new JPanel(); 
     p1.setLayout(new GridLayout(4, 2, 1, 1)); 
     p1.add(b1,0,0); 
     p1.add(b2,0,1); 
     p1.add(b3,2,0); 
     p1.setVisible(false); 



     try { 
      jep = new JEditorPane("file:///C:/Users/Chinmay/workspace/project1/src/page1.html"); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     jep.setEditable(true); 



     scroll = new JScrollPane(jep); 
     setLayout(new BorderLayout()); 
     getContentPane().add(p,BorderLayout.NORTH); 
     getContentPane().add(p1,BorderLayout.WEST); 
     getContentPane().add(scroll,BorderLayout.CENTER); 

     setSize(1000, 800); 
     setVisible(true); 
     setLocationRelativeTo(null); 

    } 
    public static void main(String args[]) 
    { 
     new check1().setVisible(true); 
    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if(e.getSource().equals(b)) 
     { 

      p1.setVisible(true); 
     } 
     else if(e.getSource().equals(b1)) 
     { 

      url ="file:///C:/Users/Chinmay/workspace/project1/src/page.html"; 
      try { 
       jep.setPage(url); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 
     else if(e.getSource().equals(b2)) 
     { 
      url ="file:///C:/Users/Chinmay/workspace/project1/src/page1.html"; 
      try { 
       jep.setPage(url); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 
     else if(e.getSource().equals(b3)) 
     { 
      url ="file:///C:/Users/Chinmay/workspace/project1/src/page2.html"; 
      try { 
       jep.setPage(url); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 

    } 

} 

https://i.stack.imgur.com/Iz7Jt.png

+0

파일 객체를 생성하고 jep.setPage (new file (url) .toURI(). toURL())로 전달한 경우에도 작동하지 않았습니다. 페이지가 변경되지 않습니다. repaint()와 같이 JEditorPane의 내용을 새로 고침하기 위해 someting을 수행해야합니까? 애플릿에서 사용하는 메소드 @AndrewThompson – charle819

+0

애플릿이나 응용 프로그램에서'JEditorPane'을 위해'repaint()'를 호출 할 필요가 없습니다. –

+0

더 나은 도움을 받으려면 [MCVE] 또는 [짧은 내용, 자체 포함, 올바른 예] (http://www.sscce.org/)를 게시하십시오. 이 경우 URL에 실제 웹 페이지를 사용해야합니다. 아무도 시스템에있는 위치에 해당 파일이 없기 때문입니다. –

답변

1

일들이 작동하지 않는, 할 수있는 첫 번째 일은 오류를 표시하는 간단한에 아래 코드를 단순화합니다. 이 코드에는 많은 오류가 있었으며 간단하게 제거하는 과정에서 제거했습니다. 하지만이 작업 코드에서 시작하여 다시 깨질 때까지 비트 단위로 변경 한 다음 오류 MCVE를 준비하고 여기에 게시하십시오.

작업 예제를 시작하기 전에 다른 팁.

  1. 동일한 이름의 버튼이 4 개 없습니다. 디버깅 할 때 혼란스럽고 최종 사용자에게 혼란을줍니다. 더 유용한 이름을 생각할 수 없다면 속성의 이름과 같거나 비슷한 텍스트를 사용하십시오.
  2. '보이지 않는/보이지 않는 버튼 클릭'부분은 문제와 관련이 없으므로 코드를 단순화하고 해당 부분을 제거하고 처음부터 3 개의 버튼이 표시된 패널을 표시하게하십시오.
  3. 하지만 그렇게 말하면 단지 작동하거나 실패하는 것을보기 위해 2 개의 버튼 만 있으면됩니다.
  4. 레이아웃 제약 조건에 마법 번호를 사용하지 마십시오! 나는 당신이 그들이 의도했던 곳에서 버튼이 끝나고 있다는 것을 의심합니다.
  5. 배포시 응용 프로그램 리소스가 포함 리소스가 될 것이므로 지금 당장 리소스를 액세스하는 것이 좋습니다. 은 파일이 아닌 URL로 액세스해야합니다. URL을 구성하는 방법은 info. page for embedded resource을 참조하십시오.

는 모두가, 나머지 문제로 요약했다 가졌어요 :

url = "file:///C:/Users/Chinmay/workspace/project1/src/page1.html"‌​; 

속성이 아닌 URL하지만 String이다. 속성 url을 호출해도 변경되지 않습니다. 그런 다음 jep.setPage(url);이 호출 될 때이 메서드는 을 나타내는 것으로 가정하고 File 경로를 처리하고 이에 따라 처리합니다 (또는 그에 따라 실패합니다). 이 문자열은 유효한 파일 경로를 나타내지 않으므로 실패합니다.

여기에는 단 2 개의 버튼과 실제 URL을 사용하는 작동 코드가 나와 있습니다.

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.io.IOException; 
import java.net.URL; 

public class check1 extends JFrame implements ActionListener { 

    JEditorPane jep; 
    JScrollPane scroll; 
    JPanel p, p1; 
    JButton b1, b2; 
    String url; 

    public check1() { 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     b1 = new JButton("Button 1"); 
     b1.addActionListener(this); 
     b2 = new JButton("Button 2"); 
     b2.addActionListener(this); 

     p = new JPanel(); 
     p.setLayout(new FlowLayout()); 

     p1 = new JPanel(); 
     p1.setLayout(new GridLayout(4, 2, 1, 1)); 
     p1.add(b1); 
     p1.add(b2); 

     try { 
      jep = new JEditorPane(
        new URL("http://docs.oracle.com/javase/8/docs/api/javax/swing/JFrame.html#constructor.summary")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     scroll = new JScrollPane(jep); 
     setLayout(new BorderLayout()); 
     getContentPane().add(p, BorderLayout.NORTH); 
     getContentPane().add(p1, BorderLayout.WEST); 
     getContentPane().add(scroll, BorderLayout.CENTER); 

     setSize(1000, 800); 
     setVisible(true); 
     setLocationRelativeTo(null); 
    } 

    public static void main(String args[]) { 
     new check1().setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getSource().equals(b1)) { 
      url = "http://docs.oracle.com/javase/8/docs/api/javax/swing/JButton.html#constructor.summary"; 
     } else if (e.getSource().equals(b2)) { 
      url = "http://docs.oracle.com/javase/8/docs/api/javax/swing/JApplet.html#constructor.summary"; 
     } 
     try { 
      jep.setPage(new URL(url)); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
    } 
} 
+0

제쳐두고,이 편집 된 코드는 여전히 변경 될 수있는 많은 것들을 포함하고 있지만, 현재 (즉각적인) 문제의 일부가 아니기 때문에, 나는 그대로 남겨두기로 결정했습니다. –

+1

감사합니다. 정말 고맙습니다. 나는 여기 새로운 팁도 주셔서 감사합니다. – charle819