J'ai rencontré le problème suivant dans mon programme. J'ai un JPanel avec un GridBagLayout dans un JScrollPanel. Il devrait avoir le comportement suivant:JTextPane dans un GridBagLayout ne pas se comporter de la manière désirée
- Le défilement ne devrait être possible que verticalement.
- Dans les lignes JPanel sont ajoutés dynamiquement. Ces lignes ont deux colonnes. Les deux colonnes doivent diviser l'espace de manière égale.
- Chaque champ (colonne/ligne) de cette table est un JTextPane, car le texte peut être modifié et peut afficher du code HTML. Si le texte est trop long, il sera enveloppé avec l'effet que la hauteur du champ augmente.
- Lors du redimensionnement de la fenêtre, les colonnes sont également redimensionnées.
Le problème est, quand il y a un long texte:
- Lorsque vous utilisez JTextPane sans PreferredSize que l'emballage ne fonctionne pas et les colonnes ne sont pas répartis également. Définition de la taille préférée, le JTextPane coupe le texte sur la deuxième ligne. JEditorPane ne fonctionne pas non plus.
- Lorsque vous utilisez JTextArea avec l'habillage activé, cela fonctionne! Cependant, je ne peux pas afficher le HTML. De plus, le quatrième point n'est pas rempli. Lors de l'extension de la fenêtre, le champ est également redimensionné. Mais lorsque vous redimensionnez la fenêtre, elle ne se redimensionne pas.
Comment puis-je obtenir le comportement souhaité et éviter ces problèmes? J'ai déjà épuisé toutes les possibilités auxquelles je peux penser.
Voici une image du comportement souhaité à l'aide JTextPanes
(mais sans HTML):
Voici le mauvais comportement à l'aide JTextPanes
:
Et ici un code pour un SSCCE:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.WindowConstants;
public class EditorTest extends JFrame {
private JPanel jPanel1;
private JPanel jPanel2;
private JScrollPane jScrollPane1;
private JTextPane jTextPane1;
private JTextPane jTextPane2;
public EditorTest() {
initComponents();
}
private void initComponents() {
GridBagConstraints gridBagConstraints;
jScrollPane1 = new JScrollPane();
jPanel2 = new JPanel();
jPanel1 = new JPanel();
jTextPane2 = new JTextPane();
jTextPane1 = new JTextPane();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setPreferredSize(new Dimension(500, 500));
getContentPane().setLayout(new GridBagLayout());
jScrollPane1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
jScrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
jPanel2.setBorder(BorderFactory.createEmptyBorder());
jPanel2.setLayout(new BorderLayout());
jPanel1.setLayout(new GridBagLayout());
jTextPane2.setContentType("text/html");
gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = GridBagConstraints.BOTH;
gridBagConstraints.weightx = 0.5;
gridBagConstraints.insets = new Insets(0, 0, 3, 3);
jPanel1.add(jTextPane2, gridBagConstraints);
jTextPane1.setContentType("text/html");
jTextPane1.setText("This is a very long text that also sometimes is "
+ "<span style=\"color:blue\">blue</span> and so on and so on.");
gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = GridBagConstraints.BOTH;
gridBagConstraints.weightx = 0.5;
gridBagConstraints.insets = new Insets(0, 0, 3, 3);
jPanel1.add(jTextPane1, gridBagConstraints);
jPanel2.add(jPanel1, BorderLayout.NORTH);
jScrollPane1.setViewportView(jPanel2);
gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
getContentPane().add(jScrollPane1, gridBagConstraints);
pack();
}
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new EditorTest().setVisible(true);
}
});
}
}
Merci beaucoup pour votre aide!
Update1
Pour rendre plus clair le comportement souhaité que j'ai créé une autre capture d'écran avec un JTextArea
, comme dans la première tête d'image. Les TextPanes doivent être au sommet et seulement aussi élevés que nécessaire (c'est-à-dire le texte). Pour illustrer ce comportement, modifiez également l'arrière-plan du champ de texte.
Vous devez spécifier la taille préférée et maximale de la feuille jtext. La largeur devrait être la moitié de votre jpanel, et la hauteur devrait être celle par défaut. (c'est-à-dire Super.getPreferredSize(). height). – Sharcoux
Cher @ user1967800, merci pour votre commentaire! La définition de 'setMaximumSize()' n'a aucun effet. Cependant, en définissant 'getPreferredSize()' avec les paramètres que vous suggérez, la largeur est affichée correctement, mais la hauteur remplit toute la fenêtre. Peut-être que cela vient très près! Avez-vous une autre idée, comment ajuster la hauteur maintenant? – Rolch2015