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 :

Jtable personnalisé: renderer ignoré


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par défaut Jtable personnalisé: renderer ignoré
    Bonjour,

    Je voudrais afficher un JPanel dans chacune des cases d'un JTable.

    Le problème c'est que la méthode qui définis l'affichage est complètement ignorée et le tableau appel la méthode toString pour l'affichage..

    Si vous aviez une idée..


    Ca c'est ma class qui contient le tableau (JTable0).
    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
     
    package lo43.graphics;
     
    import java.util.ArrayList;
     
    import javax.swing.BorderFactory;
    import javax.swing.DefaultListModel;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.JProgressBar;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.border.BevelBorder;
     
    import lo43.game.Item;
    import lo43.game.World;
    import lo43.plants.Plant;
     
    import org.dyno.visual.swing.layouts.Bilateral;
    import org.dyno.visual.swing.layouts.Constraints;
    import org.dyno.visual.swing.layouts.GroupLayout;
    import org.dyno.visual.swing.layouts.Leading;
    import org.dyno.visual.swing.layouts.Trailing;
     
    //VS4E -- DO NOT REMOVE THIS LINE!
    public class MainFrame extends JFrame {
     
    	private static final long serialVersionUID = 1L;
     
    	private MyAbstractTableModel tModel;
     
    	private JLabel jLabel0;
    	private JLabel jLabel1;
    	private JLabel jLabel2;
    	private JProgressBar jProgressBar0;
    	private JPanel jPanel1;
    	private JScrollPane jScrollPane0;
    	private JTable jTable1;
    	private JScrollPane jScrollPane1;
     
    	private JList jList0; 
     
     
    	public MainFrame(ArrayList<Plant> bList, World world) {
    		tModel = new MyAbstractTableModel(world);
    		initComponents();
    		buildPlantList(bList);
    	}
     
    	private void initComponents() {
    		setTitle("Energy tycoon");
    		setLayout(new GroupLayout());
    		jList0 = getJList0();
    		add(getJPanel1(), new Constraints(new Leading(3, 554, 10, 10), new Leading(2, 45, 10, 10)));
    		add(getJScrollPane1(), new Constraints(new Leading(3, 554, 39, 112), new Leading(50, 381, 12, 12)));
    		add(getJScrollPane0(), new Constraints(new Trailing(0, 269, 10, 10), new Leading(2, 429, 10, 10)));
    		setSize(830, 466);
    	}
     
    	private JList getJList0(){
    		if(jList0==null){
    			jList0 = new JList();
    			jList0.setCellRenderer(new PlantWidget());
    			jList0.setAutoscrolls(false);
    		}
    		return jList0;
    	}
     
    	private JScrollPane getJScrollPane1() {
    		if (jScrollPane1 == null) {
    			jScrollPane1 = new JScrollPane();
    			jScrollPane1.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED, null, null, null, null));
    			jScrollPane1.setViewportView(getJTable1());
    		}
    		return jScrollPane1;
    	}
     
    	private JTable getJTable1() {
    		if (jTable1 == null) {
    			jTable1 = new JTable(tModel);
    			jTable1.setDefaultRenderer(JPanel.class, new CellPannel());
    		}
    		return jTable1;
    	}
     
    	private JScrollPane getJScrollPane0() {
    		if (jScrollPane0 == null) {
    			jScrollPane0 = new JScrollPane(jList0);
    			jScrollPane0.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED, null, null, null, null));
    		}
    		return jScrollPane0;
    	}
     
    	private JPanel getJPanel1() {
    		if (jPanel1 == null) {
    			jPanel1 = new JPanel();
    			jPanel1.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED, null, null, null, null));
    			jPanel1.setLayout(new GroupLayout());
    			jPanel1.add(getJLabel0(), new Constraints(new Leading(9, 10, 10), new Leading(12, 12, 12)));
    			jPanel1.add(getJLabel1(), new Constraints(new Leading(56, 10, 10), new Leading(12, 12, 12)));
    			jPanel1.add(getJLabel2(), new Constraints(new Leading(137, 10, 10), new Leading(12, 12, 12)));
    			jPanel1.add(getJProgressBar0(), new Constraints(new Bilateral(241, 12, 10), new Leading(12, 12, 12)));
    		}
    		return jPanel1;
    	}
     
    	private JProgressBar getJProgressBar0() {
    		if (jProgressBar0 == null) {
    			jProgressBar0 = new JProgressBar();
    			jProgressBar0.setString("0 %");
    		}
    		return jProgressBar0;
    	}
     
    	private JLabel getJLabel2() {
    		if (jLabel2 == null) {
    			jLabel2 = new JLabel();
    			jLabel2.setText("Energy Available:");
    		}
    		return jLabel2;
    	}
     
    	private JLabel getJLabel1() {
    		if (jLabel1 == null) {
    			jLabel1 = new JLabel();
    			jLabel1.setText("0€");
    		}
    		return jLabel1;
    	}
     
    	private JLabel getJLabel0() {
    		if (jLabel0 == null) {
    			jLabel0 = new JLabel();
    			jLabel0.setText("Money: ");
    		}
    		return jLabel0;
    	}
     
    	private void buildPlantList(ArrayList<Plant> list){
    		DefaultListModel model = new DefaultListModel();
    		for(Plant p: list){
    			model.addElement(p);
    		}
    		jList0.setModel(model);
    	}
     
    }
    Ca c'est le JPanel que je veux afficher dans les cases:
    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
     
    package lo43.graphics;
     
    import java.awt.Component;
     
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTable;
    import javax.swing.table.TableCellRenderer;
     
    import lo43.game.Decor;
    import lo43.game.Item;
     
    import org.dyno.visual.swing.layouts.Constraints;
    import org.dyno.visual.swing.layouts.GroupLayout;
    import org.dyno.visual.swing.layouts.Leading;
     
    //VS4E -- DO NOT REMOVE THIS LINE!
    public class CellPannel extends JPanel implements TableCellRenderer{
     
    	private static final long serialVersionUID = 1L;
    	private JLabel jLabel0;
     
    	public CellPannel() {
    		setOpaque(true);
    		initComponents();
    	}
     
    	private void initComponents() {
    		setLayout(new GroupLayout());
    		add(getJLabel0(), new Constraints(new Leading(21, 10, 10), new Leading(36, 10, 10)));
    		setSize(89, 76);
    	}
     
    	private JLabel getJLabel0() {
    		if (jLabel0 == null) {
    			jLabel0 = new JLabel();
    			jLabel0.setText("jLabel0");
    		}
    		return jLabel0;
    	}
     
    	@Override
    	public Component getTableCellRendererComponent(JTable table, Object value,
    			boolean isSelected, boolean hasFocus, int row, int column) {
    		Item p = ((Item)value);
    		if(p instanceof Decor){
    			jLabel0.setText("DECOR");
    		}else{
    			jLabel0.setText("USINE");
    		}
     
    		return this;
     
    	}
     
    }
    Et mon model de tableau
    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
     
    package lo43.graphics;
     
    import javax.swing.table.AbstractTableModel;
     
    import lo43.game.World;
     
    public class MyAbstractTableModel extends AbstractTableModel{
    	private static final long serialVersionUID = 1L;
    	private World myWorld;
     
    	public MyAbstractTableModel(World w) {
    		myWorld = w;
    	}
     
    	@Override
    	public int getColumnCount() {
    		return myWorld.getDimx();
    	}
     
    	@Override
    	public int getRowCount() {
    		return myWorld.getDimy();
    	}
     
    	@Override
    	public Object getValueAt(int x, int y) {
    		return myWorld.getItem(x, y);
    	}
     
    }
    Merci d'avance @+
    Seeme

  2. #2
    Membre expérimenté Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Par défaut
    Citation Envoyé par seeme Voir le message
    Je voudrais afficher un JPanel dans chacune des cases d'un JTable.
    Essaie d'utiliser la table "TableLayout". La classe "TableLayout" permet d'arranger des composants Swing sous forme de tableau. "TableLayoutDemo" montre un exemple d'utilisation: http://wiki.byte-welt.de/wiki/TableLayout

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Quel est le type renvoyer par la méthode getValueAt() de ton modèle pour la ligne indiqué ?
    Il faut que tu implémente la méthode getColumnClass() en conséquence, puis utiliser setDefaultRenderer() avec ce type là et non JPanel...

    Enfin pourquoi utiliser un JPanel alors qu'un simple JLabel semble suffire. Un DefaultListCellRenderer serait du coup plus adéquat...

    a++

  4. #4
    Membre chevronné Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par défaut
    Merci Uhran, le problème c'est que d'autres ont déjà commencé à travailler avec un JTable, je n'ai pas vérifié mais j'ai peur d'avoir à recoder pas mal de leur travail en changeant de type maintenant.

    AbiGuda: J'ai réussi, il y avait ce que tu disais + un problème de taille des cellules.

    Merci beaucoup

  5. #5
    Invité de passage
    Inscrit en
    Août 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1
    Par défaut JPanel pour chaque case
    Salut seeme,j'ai le même problème. est ce que tu peux me dire comment tu fais pour définir à chaque case une propriété différente (une couleur spécifique, un text ou image..) j'arrive à le faire avec toute un colonne mais pas avec chaque cellule. J'utilise aussi un JPanel pour chaque case

    Merci

Discussions similaires

  1. [JTABLE][MODEL][RENDERER]Communication
    Par cameleon2002 dans le forum Composants
    Réponses: 1
    Dernier message: 31/12/2005, 14h36
  2. [Jtable] DefaultTableModel renderer des boolean
    Par lilou77 dans le forum Composants
    Réponses: 2
    Dernier message: 20/12/2005, 15h32
  3. JTable ==> Personnalisé une cellule
    Par mehdi82 dans le forum Composants
    Réponses: 7
    Dernier message: 15/11/2005, 15h36
  4. [JTable] cell renderer
    Par biozaxx dans le forum Composants
    Réponses: 2
    Dernier message: 21/04/2005, 10h04
  5. [Swing]Case a cocher JTable, et Renderer
    Par bibx dans le forum Composants
    Réponses: 16
    Dernier message: 29/12/2004, 14h49

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