JScrollPane taille dynamique
Bonjour,
Je vous écris car j'ai un vrai problème avec le JSrollPane.
Voici la situation :
J'ai un composant TestJSP (qui hérite de JPanel) que je veux placer dans le layer POPUP d'une fenetre.
La position et la longueur de ce composant TestJSP dépendent des dimensions de le fenêtre, mais AUSSI du texte du JEditorPane contenu dans ce TestJSP . Lorsque la fenêtre est redimensionnée les dimensions de son contenu doit être mis à jour.
L'élément TestJSP contient un JScrollPane qui lui meme un JEditorPane.
Le problème est que jsp (le JScrollPane) n'affiche jamais complètement jep (le JEditorPane)
J'ai essayé les méthodes jsp.revalidate et jep.setPreferredSize, mais sans succès.
Je ne sais vraiment pas ce qui ne va pas.
Ci -dessous se trouve le code, où je n'ajoute que le JEditorPane dans le TestJSP (dans ce cas tout s'affiche bien, mais j'ai besoin d'un JScrollPane car il y a une taille limite maximale pour le TestJSP ).
Tout ce qui concerne le JScrollPane est mis en commentaires (Il suffit de décommenter pour que TestJSP contienne à nouveau un JScrollPane).
En espérant que vous pourrez m'aidez car c'est la seule partie de mon projet qui me pose un problème et que j'ai ben du mal à trouver de la documentation à ce propos.
Le code ci-dessous se trouve un code court qui présente mon problème.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| package testSizeJSP2pack;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class TestJSP extends JPanel{
private JFrame f;
private JPanel bg;
JEditorPane jep;
JScrollPane jsp;
public TestJSP(JFrame f){
this.f=f;
this.jep= new JEditorPane();
jep.setContentType("text/html");
jep.setText(" test ");
//this.jsp=jsp =new JScrollPane(jep);
this.add(jep/*jsp*/,
new GridBagConstraints(0,0,1,1,1,1, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0)
);
bg= new JPanel();
bg.setBackground(Color.red);
bg.setPreferredSize(new Dimension(400,400));
this.f.getContentPane().add(bg, BorderLayout.CENTER);
f.getLayeredPane().addComponentListener(this.topLevelContainerListener);
f.getLayeredPane().add(this,JLayeredPane.POPUP_LAYER);
f.pack();
f.setVisible(true);
}
final ComponentAdapter topLevelContainerListener = new ComponentAdapter(){
public void componentResized(ComponentEvent e){
setPosition();
}
};
public static void main(String[] args){
JFrame f = new JFrame();
TestJSP t = new TestJSP(f);
t.jep.setText("<html>Bonjour <br> je voudrais <br> une canette SVP </html>");
t.jep.setPreferredSize(t.jep.getPreferredSize());
//t.jsp.revalidate();
t.setPosition();
}
public void setPosition(){
this.jep.setPreferredSize(jep.getPreferredSize());
//this.jsp.revalidate();
// La position du panneau t se calcule à partir du milieu de la fenetre qui la contient
int xDroit = (int)(this.bg.getWidth()/2.0); //Extrémité droite du panneau à afficher
int yBas = (int) (this.bg.getHeight()/2.0); //Extrémité basse du panneau à afficher
int xGauche = (int) (xDroit - this.getPreferredSize().getWidth());
int yHaut = (int) (yBas - this.getPreferredSize().getHeight());
System.out.println("xG "+ xGauche +" xD "+ xDroit);
System.out.println("yT "+ yHaut +" yB "+ yBas);
System.out.println("largeur "+ this.getPreferredSize().getWidth() + " longueur "+ this.getPreferredSize().getHeight());
System.out.println("largeur jep "+ this.jep.getPreferredSize().getWidth() + " longueur jep "+ this.jep.getPreferredSize().getHeight());
if(xGauche<0){
xGauche = 0;
}
if(yHaut<0){
yHaut = 0;
}
int longueur = xDroit - xGauche;
int largeur = yBas - yHaut;
this.setBounds(xGauche, yHaut, largeur, longueur);
this.jep.setPreferredSize(jep.getPreferredSize());
//this.jsp.revalidate();
//this.revalidate();
}
} |
[EDIT] : Si je mes jsp.setPreferredSize(new Dimension(200,200)) par exempe, le résultat est convenable mais je prefererais que la taille du JScrollPane s'adapte le plus possible au texte. (Tout en ayant une taille limite)