IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

Sélection de texte dans 1 JTextPane inclus dans 1 JTable


Sujet :

Composants Java

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Sélection de texte dans 1 JTextPane inclus dans 1 JTable
    Bonjour à tous,

    J'ai quelques difficultés à comprendre comment permettre la sélection manuelle d'une partie du texte contenu dans un JTextPane, lui-même inclus dans 1 JTable et créé via un CellRenderer...

    Plus précisément, je dispose d'une table à 2 colonnes, la 1ere contenant du texte, la seconde des flottants (les colonnes ne sont pas éditables). Pour chaque cellule de la 1ere colonne, j'utilise un CellRenderer pour créer un JTextPane à partir de la chaîne de caractères de départ (de façon à pouvoir en "colorier" certaines portions)

    Malheureusement, dans ce cas précis, je n'ai pas encore trouvé comment activer la sélection de texte à la souris (l'action "clic gauche enfoncé + déplacement" n'entraine aucune réaction). Apparemment, si j'ai bien saisi, cela serait dû au fait qu'il est impossible d'associer des événements à un JComponent créé via un CellRenderer.

    Jusque là, je n'ai pas trouvé comment contourner ce problème. Des idées ? Merci d'avance !

    (Si nécessaire, je peux poster une classe démo illustrant le phénomène).

  2. #2
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Pour mieux me faire comprendre, voici un code exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.Toolkit;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Random;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextPane;
    import javax.swing.ListSelectionModel;
    import javax.swing.RowSorter.SortKey;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.TableCellRenderer;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.Style;
    import javax.swing.text.StyleConstants;
    import javax.swing.text.StyledDocument;
    import javax.swing.text.html.HTMLDocument;
    import javax.swing.text.html.HTMLEditorKit;
     
    public class JTableTestFrame extends JFrame {
     
    	public JTableTestFrame(HashSet<String> fields)
    	{
    		super("Table Test");
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		MyTable myTable = new MyTable(fields);
     
    		JScrollPane tableScrollPane = new JScrollPane();
    		tableScrollPane.setViewportView(myTable);
    		setLayout(new BorderLayout());
    		getContentPane().add(tableScrollPane,BorderLayout.CENTER);
    		setMinimumSize(new Dimension(400,300));
    		pack();
     
    		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    		setLocation(screenSize.width/2 - (getSize().width/2),screenSize.height/2 - (getSize().height/2));
    	}
     
    	class MyTable extends JTable {
    		public MyTable(HashSet<String> fields)
    		{
    			MyTableModel myTableModel = new MyTableModel(fields);
    			setModel(myTableModel);
    			setDefaultRenderer(String.class, new TextPaneRenderer());
    			setRowHeight(60);
    			setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    			setCellSelectionEnabled(false);
    			setRowSelectionAllowed(true);
    			setOpaque(true);
    		}
    	}
     
    	class MyTableModel extends AbstractTableModel {
     
    		HashMap<Integer,HashMap<String, Float>> data = new HashMap<Integer,HashMap<String, Float>>(); 
     
    		public MyTableModel(HashSet<String> fields)
    		{
    			int cpt = 0;
    			Random rand = new Random();
     
    			for (String field:fields)
    			{
    				HashMap<String,Float> map = new HashMap<String, Float>();
    				map.put(field, rand.nextFloat());
    				data.put(cpt,map);
    				cpt++;
    			}
    		}
     
    		@Override
    		public int getColumnCount() {
    			return 2;
    		}
     
    		@Override
    		public String getColumnName(int col) {
    			if (col==0)
    				return "Field";
    			else
    				return "Cover";
    		}
     
    		@Override
    		public int getRowCount() {
    			return data.keySet().size();
    		}
     
    		@Override
    		public Object getValueAt(int row, int col) {
    			String content = data.get(row).keySet().iterator().next();
    			if (col==0)
    				return content;
    			else
    				return data.get(row).get(content);
    		}
     
    		@Override
    		public Class<?> getColumnClass(int columnIndex) {
    			if (columnIndex==0)
    				return String.class;
    			else
    				return Float.class;
    		}
     
    		@Override
    		public boolean isCellEditable(int rowIndex, int columnIndex) {
    			return false;
    		}
     
    	}
     
    	class TextPaneRenderer extends JTextPane implements TableCellRenderer {
     
    		public TextPaneRenderer()
    		{
    			super();
    			HTMLEditorKit htmlKit =new HTMLEditorKit(); 
    			StyledDocument doc = (HTMLDocument)htmlKit.createDefaultDocument();
    			setEditorKit(htmlKit);
    			setDocument(doc);
    			setEditable(false);
    		}
     
    		@Override
    		public Component getTableCellRendererComponent(JTable arg0,Object content, boolean isSelected, boolean hasFocus,int row, int column)  
    		{
    			String text = (String)content;
    			setContentType("text/html") ; 
    			setText("");
     
    			StyledDocument doc = (StyledDocument)getDocument();			
    			Style s = doc.addStyle("bkcolor",doc.getStyle("regular"));
    			StyleConstants.setBackground(s,Color.red);   
     
    			try {doc.insertString(0,text,doc.getStyle("bkcolor"));} 
    			catch (BadLocationException e) {e.printStackTrace();}
    			if (isSelected)
    				System.out.println("selected: "+content);
     
    			return this;
    		}
     
    	}
     
    	public static void main (String[] args)
    	{
    		HashSet<String> fields = new HashSet<String>();
    		fields.add("small test");
    		fields.add("sentence 2");
    		fields.add("sentence 3");
    		fields.add("woot");
    		JTableTestFrame frame = new JTableTestFrame(fields);
    		frame.setVisible(true);
    	}
    }
    Le comportement que j'aimerais avoir serait de pouvoir sélectionner à la souris une partie du texte dans une cellule donnée de la colonne de gauche.
    En espérant que l'exemple aide...

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Personne n'a rencontré ce problème ? Je suis tjs à la recherche d'une solution...

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/03/2015, 05h53
  2. [Swing] Centré un texte dans un JTextPane
    Par titi_22 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 24/06/2011, 16h09
  3. Réponses: 5
    Dernier message: 10/12/2007, 16h15
  4. Réponses: 4
    Dernier message: 16/05/2006, 23h15
  5. Empécher la sélection du texte des pages dans un WebBrowser
    Par DevelOpeR13 dans le forum Web & réseau
    Réponses: 2
    Dernier message: 05/06/2003, 18h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo