2016-11-10 5 views
0

Любая идея, как изменить html-страницу, просматриваемую внутри JEditorPane, на событиях нажатия кнопки в JFrame, извините, что я новичок в java, поэтому основное объяснение будет действительно оценено. (Необходимо изменить содержимое где страница 1 содержание здесь написано)Изменение страницы html внутри JEditorPane при нажатии кнопки

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 (новый файл (url) .toURI(). ToURL()); страница не изменится, мне нужно сделать что-нибудь, чтобы обновить содержимое JEditorPane, например repaint(); метод, который мы используем в applet @AndrewThompson – charle819

+0

Нет необходимости вызывать 'repaint()' для 'JEditorPane' в аплетах или приложениях. –

+0

Чтобы лучше помочь, опубликуйте [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). В этом случае вам нужно будет использовать фактические веб-страницы для URL-адресов, так как никто не имеет эти файлы в местах, где они существуют на вашем компьютере. –

ответ

1

Когда вещи не работают, то первое, что нужно сделать, это упрощает код вниз к простейшим, который отображает сообщение об ошибке. В этом коде было много ошибок, которые я просто удалил в процессе его упрощения. Но начните с этого рабочего кода и понемногу измените его, пока он не сломается снова, а затем подготовьте MCVE ошибки и опубликуйте его здесь.

Другие советы, прежде чем я получу рабочий пример.

  1. Не имеют четырех кнопок с одинаковыми именами! Это запутывает при отладке и запутывает конечного пользователя. Если вы не можете придумать для них более полезные имена, используйте тот же или похожий текст, что и имя атрибута.
  2. «Невидимая/видимая на кнопке« щелчок »часть не имела отношения к проблеме, поэтому, чтобы упростить код, удалите эту часть и панель, содержащая 3 кнопки, видимые с самого начала.
  3. Но, сказав это, нужно было только иметь 2 кнопки, чтобы увидеть, как они работают или не работают.
  4. Не используйте магические числа в ограничениях макета! Я сомневаюсь, что кнопки заканчиваются там, где вы намеревались появиться.
  5. Ресурсы приложения станут частью встроенных ресурсов к моменту развертывания, поэтому разумно начать доступ к ним, как если бы они были, прямо сейчас. должен быть доступен по URL, а не по файлу. См. info. page for embedded resource, как формировать URL-адрес.

Сказав все это, остальные проблемы были подведены в:

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

Атрибут является не URL, но String. Вызов атрибута url не изменит этого. Затем, когда вызывается jep.setPage(url);, метод предполагает, что String представляет собой путь 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