JTable : avoir plusieurs cellules par ligne pour une colonne

Résolu
kobee12
Messages postés
153
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
31 octobre 2006
- 16 juin 2005 à 09:05
mvacher
Messages postés
1
Date d'inscription
jeudi 13 décembre 2007
Statut
Membre
Dernière intervention
24 décembre 2007
- 24 déc. 2007 à 13:30
Bonjour à tous,

j'ai fait un tableau avec des en-têtes et tout s'affiche correctement.
Seulement j'aimerais savoir s'il est possible d'avoir plusieurs cellules sur une même ligne sous un seul header.
J'ai essayé de représenté ci-dessous ce que j'aimerais avoir un peu pres :

|_HEADER_| |_HEADER_|
|__|__|__|__| AU LIEU DE |_________|
|__|__|__|__| |_________|

Merci d'avance pour ceux qui me répondront

Kobee12

5 réponses

Akbarr
Messages postés
15
Date d'inscription
mercredi 15 juin 2005
Statut
Membre
Dernière intervention
23 juin 2005
1
16 juin 2005 à 16:31
Effectivement il y a des petits bugs, notament au niveau de la récup. du renderer.

La version du code que j'utilise:

package test;


import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;


import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumnModel;


import test.util.swing.tableheader.group.*;


public class JTableTest extends JPanel
{
private JTable testTable;


public JTableTest()
{
initialize();
}


private void initialize()
{
this.setLayout(new GridBagLayout());


testTable = new JTable(10, 13)
{
protected JTableHeader createDefaultTableHeader()
{
return new GroupableTableHeader(columnModel);
}
};


setNestingDisplay(testTable);


JScrollPane scrollPane = new JScrollPane(testTable);


this.add(scrollPane, new GridBagConstraints(0, 1, 1, 1, 1.0, 1.0,
GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));


this.setVisible(true);
}


protected static void setNestingDisplay(JTable table)
{
TableColumnModel cm = table.getColumnModel();
ColumnGroup group1 = new ColumnGroup("Group1");


ColumnGroup subgroup1 = new ColumnGroup("Sub-Group1");
subgroup1.add(cm.getColumn(5));
subgroup1.add(cm.getColumn(6));


ColumnGroup subgroup2 = new ColumnGroup("Sub-Group2");
subgroup2.add(cm.getColumn(7));
subgroup2.add(cm.getColumn(8));


group1.add(subgroup1);
group1.add(subgroup2);


ColumnGroup group2 = new ColumnGroup("Group2");


ColumnGroup subgroup3 = new ColumnGroup("Sub-Group3");
subgroup3.add(cm.getColumn(9));
subgroup3.add(cm.getColumn(10));


ColumnGroup subgroup4 = new ColumnGroup("Sub-Group4");
subgroup4.add(cm.getColumn(11));
subgroup4.add(cm.getColumn(12));


group2.add(subgroup3);
group2.add(subgroup4);


GroupableTableHeader header = (GroupableTableHeader)table.getTableHeader();
header.addColumnGroup(group1);
header.addColumnGroup(group2);
}


/* TEST */
public static void main(String args[])
{
// Quick main to test the display
javax.swing.JFrame frame = new javax.swing.JFrame();
frame.setContentPane(new JTableTest());
frame.pack();
frame.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}



package test.util.swing.tableheader.group;


import java.util.Enumeration;
import java.util.Vector;


import java.awt.Component;
import java.awt.Dimension;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;


public class ColumnGroup
{
protected TableCellRenderer renderer;
protected Vector v;
protected String text;
protected int margin = 0;


public ColumnGroup(String text)
{
this(null, text);
}


public ColumnGroup(TableCellRenderer renderer, String text)
{
if (renderer == null)
{
this.renderer = new DefaultTableCellRenderer()
{
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column)
{
JTableHeader header = table.getTableHeader();
if (header != null)
{
setForeground(header.getForeground());
setBackground(header.getBackground());
setFont(header.getFont());
}
setHorizontalAlignment(JLabel.CENTER);
setText( (value == null) ? "" : value.toString());
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
return this;
}
};
}
else
{
this.renderer = renderer;
}
this.text = text;
v = new Vector();
}


/**
* @param obj TableColumn or ColumnGroup
*/
public void add(Object obj)
{
if (obj == null)
{
return;
}
v.addElement(obj);
}


/**
* @param c TableColumn
* @param v ColumnGroups
*/
public Vector getColumnGroups(TableColumn c, Vector g)
{
g.addElement(this);
if (v.contains(c))
{
return g;
}
Enumeration enum = v.elements();
while (enum.hasMoreElements())
{
Object obj = enum.nextElement();
if (obj instanceof ColumnGroup)
{
Vector groups =
(Vector) ( (ColumnGroup) obj).getColumnGroups(c, (Vector) g.clone());
if (groups != null)
{
return groups;
}
}
}
return null;
}


public TableCellRenderer getHeaderRenderer()
{
return renderer;
}


public void setHeaderRenderer(TableCellRenderer renderer)
{
if (renderer != null)
{
this.renderer = renderer;
}
}


public Object getHeaderValue()
{
return text;
}


public Dimension getSize(JTable table)
{
Component comp = renderer.getTableCellRendererComponent(
table, getHeaderValue(), false, false, -1, -1);
int height = comp.getPreferredSize().height;
int width = 0;
Enumeration enum = v.elements();
while (enum.hasMoreElements())
{
Object obj = enum.nextElement();
if (obj instanceof TableColumn)
{
TableColumn aColumn = (TableColumn) obj;
width += aColumn.getWidth();
width += margin;
}
else
{
width += ( (ColumnGroup) obj).getSize(table).width;
}
}
return new Dimension(width, height);
}


public void setColumnMargin(int margin)
{
this.margin = margin;
Enumeration enum = v.elements();
while (enum.hasMoreElements())
{
Object obj = enum.nextElement();
if (obj instanceof ColumnGroup)
{
( (ColumnGroup) obj).setColumnMargin(margin);
}
}
}
}

package test.util.swing.tableheader.group;


import java.util.Enumeration;
import java.util.Vector;


import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;


public class GroupableTableHeader
extends JTableHeader
{
private static final String uiClassID = "GroupableTableHeaderUI";
protected Vector columnGroups = null;


public GroupableTableHeader()
{
super();
setUI(new GroupableTableHeaderUI());
setReorderingAllowed(false);
}


public GroupableTableHeader(TableColumnModel model)
{
super(model);
setUI(new GroupableTableHeaderUI());
setReorderingAllowed(false);
}


public void setReorderingAllowed(boolean b)
{
reorderingAllowed = false;
}


public void addColumnGroup(ColumnGroup g)
{
if (columnGroups == null)
{
columnGroups = new Vector();
}
columnGroups.addElement(g);
}


public Enumeration getColumnGroups(TableColumn col)
{
if (columnGroups == null)
{
return null;
}
Enumeration enum = columnGroups.elements();
while (enum.hasMoreElements())
{
ColumnGroup cGroup = (ColumnGroup) enum.nextElement();
Vector v_ret = (Vector) cGroup.getColumnGroups(col, new Vector());
if (v_ret != null)
{
return v_ret.elements();
}
}
return null;
}


public void setColumnMargin()
{
if (columnGroups == null)
{
return;
}
//int columnMargin = getColumnModel().getColumnMargin();
int columnMargin = getColumnModel().getColumnMargin() - 1;
Enumeration enum = columnGroups.elements();
while (enum.hasMoreElements())
{
ColumnGroup cGroup = (ColumnGroup) enum.nextElement();
cGroup.setColumnMargin(columnMargin);
}
}
}

package test.util.swing.tableheader.group;


import java.util.Enumeration;
import java.util.Hashtable;


import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.JComponent;
import javax.swing.plaf.basic.BasicTableHeaderUI;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;


public class GroupableTableHeaderUI
extends BasicTableHeaderUI
{


public void paint(Graphics g, JComponent c)
{
Rectangle clipBounds = g.getClipBounds();
if (header.getColumnModel() == null)
{
return;
}
( (GroupableTableHeader) header).setColumnMargin();
int column = 0;
Dimension size = header.getSize();
Rectangle cellRect = new Rectangle(0, 0, size.width, size.height);
Hashtable h = new Hashtable();
//int columnMargin = header.getColumnModel().getColumnMargin();


Enumeration enumeration = header.getColumnModel().getColumns();
while (enumeration.hasMoreElements())
{
cellRect.height = size.height;
cellRect.y = 0;
TableColumn aColumn = (TableColumn) enumeration.nextElement();
Enumeration cGroups = ( (GroupableTableHeader) header).getColumnGroups(aColumn);
if (cGroups != null)
{
int groupHeight = 0;
while (cGroups.hasMoreElements())
{
ColumnGroup cGroup = (ColumnGroup) cGroups.nextElement();
Rectangle groupRect = (Rectangle) h.get(cGroup);
if (groupRect == null)
{
groupRect = new Rectangle(cellRect);
Dimension d = cGroup.getSize(header.getTable());
groupRect.width = d.width;
groupRect.height = d.height;
h.put(cGroup, groupRect);
}
paintCell(g, groupRect, cGroup);
groupHeight += groupRect.height;
cellRect.height = size.height - groupHeight;
cellRect.y = groupHeight;
}
}
//cellRect.width = aColumn.getWidth() + columnMargin;
cellRect.width = aColumn.getWidth();
if (cellRect.intersects(clipBounds))
{
paintCell(g, cellRect, column);
}
cellRect.x += cellRect.width;
column++;
}
}


private void paintCell(Graphics g, Rectangle cellRect, int columnIndex)
{
TableColumn aColumn = header.getColumnModel().getColumn(columnIndex);
//TableCellRenderer renderer = aColumn.getHeaderRenderer();
TableCellRenderer renderer = header.getDefaultRenderer();
Component component = renderer.getTableCellRendererComponent(
header.getTable(), aColumn.getHeaderValue(), false, false, -1, columnIndex);
rendererPane.add(component);
rendererPane.paintComponent(g, component, header, cellRect.x, cellRect.y,
cellRect.width, cellRect.height, true);
}


private void paintCell(Graphics g, Rectangle cellRect, ColumnGroup cGroup)
{
TableCellRenderer renderer = cGroup.getHeaderRenderer();
Component component = renderer.getTableCellRendererComponent(
header.getTable(), cGroup.getHeaderValue(), false, false, -1, -1);
rendererPane.add(component);
rendererPane.paintComponent(g, component, header, cellRect.x, cellRect.y,
cellRect.width, cellRect.height, true);
}


private int getHeaderHeight()
{
int height = 0;
TableColumnModel columnModel = header.getColumnModel();
for (int column = 0; column < columnModel.getColumnCount(); column++)
{
TableColumn aColumn = columnModel.getColumn(column);
//TableCellRenderer renderer = aColumn.getHeaderRenderer();
TableCellRenderer renderer = header.getDefaultRenderer();


Component comp = renderer.getTableCellRendererComponent(
header.getTable(), aColumn.getHeaderValue(), false, false, -1, column);
int cHeight = comp.getPreferredSize().height;
Enumeration enum = ( (GroupableTableHeader) header).getColumnGroups(aColumn);
if (enum != null)
{
while (enum.hasMoreElements())
{
ColumnGroup cGroup = (ColumnGroup) enum.nextElement();
cHeight += cGroup.getSize(header.getTable()).height;
}
}
height = Math.max(height, cHeight);
}
return height;
}


private Dimension createHeaderSize(long width)
{
TableColumnModel columnModel = header.getColumnModel();
width += columnModel.getColumnMargin() * columnModel.getColumnCount();
if (width > Integer.MAX_VALUE)
{
width = Integer.MAX_VALUE;
}
return new Dimension( (int) width, getHeaderHeight());
}


public Dimension getPreferredSize(JComponent c)
{
long width = 0;
Enumeration enumeration = header.getColumnModel().getColumns();
while (enumeration.hasMoreElements())
{
TableColumn aColumn = (TableColumn) enumeration.nextElement();
width = width + aColumn.getPreferredWidth();
}
return createHeaderSize(width);
}
}
3
Akbarr
Messages postés
15
Date d'inscription
mercredi 15 juin 2005
Statut
Membre
Dernière intervention
23 juin 2005
1
16 juin 2005 à 14:08
Je pense que cet article devrait t'aider: http://www.codeguru.com/java/articles/124.shtml
0
kobee12
Messages postés
153
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
31 octobre 2006
1
16 juin 2005 à 15:55
C'est pas mal ce que tu as trouvé mais j'ai testé le programme et il me fait des erreurs.
Je sais pas si tu as testé le prgm mais tu peux peut être m'aider à résoudre l'erreur qu'il me fait :
java.lang.NullPointerException
at GroupableHeader.GroupableTableHeaderUI.getHeaderHeight
(GroupableTableHeaderUI.java:88)
sur :
Component comp = renderer.getTableCellRendererComponent(
header.getTable(), aColumn.getHeaderValue(), false, false,-1, column);
0
kobee12
Messages postés
153
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
31 octobre 2006
1
16 juin 2005 à 17:11
Super!

Je te remercie!

@+ Kobee12
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mvacher
Messages postés
1
Date d'inscription
jeudi 13 décembre 2007
Statut
Membre
Dernière intervention
24 décembre 2007

24 déc. 2007 à 13:30
Bonjour,

Merci pour ces codes, toutefois j'ai l'impression qu'il ne marche pas avec la version 1.6.
Quelqu'un aurait-il un version de ces classes récentes.
Car je bataille depuis plusieurs jours pour faire de grouptableheader, sans succès :(

Merci a vous,
Bonnes fetes a tous !
0