2016-11-10 1 views
0

Toute idée de comment changer la page html vue dans un JEditorPane sur les événements de clic de bouton dans JFrame, désolé je suis nouveau à Java, donc une explication basique sera vraiment appréciée. (Besoin de changer le contenu où la page 1 contenu ici est écrit)Changement de la page html dans JEditorPane sur le bouton cliquez sur

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

il ne fonctionne pas même lorsque j'ai créé un objet fichier et passé comme jep.setPage (new File (url) .toURI() toURL().); la page ne changera pas, ai-je besoin de faire quelque chose pour rafraîchir le contenu de JEditorPane comme repaint(); méthode que nous utilisons dans l'applet @AndrewThompson – charle819

+0

Il n'est pas nécessaire d'appeler 'repaint()' pour un 'JEditorPane' dans les applets ou les applications. –

+0

Pour une meilleure aide plus rapidement, postez un [MCVE] ou [Short, Self Contained, Example correct] (http://www.sscce.org/). Dans ce cas, vous devez utiliser des pages Web réelles pour les URL, puisque personne d'autre n'a ces fichiers aux emplacements où ils se trouvent sur votre machine. –

Répondre

1

Quand les choses ne fonctionnent pas, la première chose à faire est de simplifier le code jusqu'à la plus simple qui affiche l'erreur. Il y avait beaucoup d'erreurs dans ce code que j'ai simplement enlevé dans le processus de simplification. Mais commencez à partir de ce code de travail et changez-le, petit à petit, jusqu'à ce qu'il se casse à nouveau, puis préparez un MCVE de l'erreur et affichez-le ici.

D'autres conseils avant d'entrer dans un exemple de travail.

  1. Ne pas avoir quatre boutons avec des noms identiques! Il est déroutant lors du débogage, et déroutant pour l'utilisateur final. Si vous ne pouvez pas trouver de noms plus utiles pour eux, utilisez le même texte ou un texte similaire au nom de l'attribut. La partie 'invisible/visible au clic du bouton' ne s'appliquait pas au problème, donc pour simplifier le code, supprimez cette partie et ayez le panneau contenant les 3 boutons visibles depuis le début. Mais après avoir dit cela, il était seulement nécessaire d'avoir 2 boutons pour le voir fonctionner ou échouer. N'utilisez pas de nombres magiques dans les contraintes de mise en page! Je doute que les boutons se soient retrouvés là où vous vouliez qu'ils apparaissent.
  2. Les ressources d'application deviendront des ressources incorporées au moment du déploiement, il est donc sage de commencer à y accéder comme si elles l'étaient, en ce moment. Un doit être accessible par URL plutôt que par fichier. Voir le info. page for embedded resource pour savoir comment former l'URL.

Ceci étant dit, le problème reste a été résumée dans:

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

L'attribut est pas un URL, mais un String. Appeler l'attribut url ne changera pas cela. Ensuite, lorsque jep.setPage(url); est appelée, le procédé suppose que le String représente un chemin File et le traite en conséquence (ou échoue en conséquence). Comme cette chaîne ne représente pas un chemin de fichier valide, elle échouera.

Voici un code fonctionnant en utilisant seulement 2 boutons, et les URL réelles.

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

En passant, ce code édité conserve encore beaucoup de choses qui seraient mieux changé, mais comme ils ne faisaient pas partie du problème (immédiat) actuel, j'ai décidé de les laisser tels quels. –

+1

cela a fonctionné, merci beaucoup l'apprécie vraiment. Je suis nouveau ici, merci pour les conseils aussi. – charle819