Hi all,
Ik ben weer lekker aan het stoeien met een JTable. Het datamodel voor elke row ziet er als volgt uit:
Er zitten natuurlijk nog een hele rits get en setters in. voornamelijk delegates van CommentDTO (die dus de data bevat, dit is een wrapper of zo iets)
De childComments bevat een lijst met gerelateerde comments. Dit is een 0..* relatie.
een deel van de tablemodel
De eerste kolom van de row, moet dus de comment laten zien:
De tweede kolom van de table moet dus de comments in de list laten zien. hier dacht ik dus slim te zijn, door geneste tables te gebruiken: De cell renderer wordt dus op een List gezet
Ok..ik hoop dat het een beetje duidelijk is. (misschien moet ik gewoon een JList gebruiken ipv een JTable, maar dat terzijde)
Het probleem is de hoogte van de geneste JTable rows. Deze zijn standaard 16 pixels. getPreferredSize werkt helaas niet in de CommentCollectionRenderer. Heeft iemadn hier nog een oplossign voor?
Om het effe duidelijker te maken...dit wil ik:
Ik ben weer lekker aan het stoeien met een JTable. Het datamodel voor elke row ziet er als volgt uit:
Java:
1
2
3
4
5
6
7
8
| public class CommentDataModel { private CommentDTO comment; private List childComments; private CommentManagementDelegate management; private boolean initialized = false; ..... } |
Er zitten natuurlijk nog een hele rits get en setters in. voornamelijk delegates van CommentDTO (die dus de data bevat, dit is een wrapper of zo iets)
De childComments bevat een lijst met gerelateerde comments. Dit is een 0..* relatie.
een deel van de tablemodel
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| public Object getValueAt(int row, int col) { CommentDataModel data = (CommentDataModel) list.get(row); switch (col) { case 0: return data; case 1: if (data.hasChildren()) return data.getChildComments(); else return null; default: return null; } } |
De eerste kolom van de row, moet dus de comment laten zien:
Java:
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
| public class CommentRenderer extends JPanel implements TableCellRenderer { private JLabel lblTitle; private JTextPane tpText; public CommentRenderer() { setLayout(new BorderLayout()); lblTitle = new JLabel(); tpText = new JTextPane(); add(lblTitle, BorderLayout.NORTH); add(tpText, BorderLayout.CENTER); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { CommentDataModel cdm = (CommentDataModel) value; lblTitle.setText(cdm.getCreationUser().getFullName()); tpText.setText(cdm.getText()); int height_wanted = (int) getPreferredSize().getHeight(); if (height_wanted != table.getRowHeight(row)) table.setRowHeight(row, height_wanted); return this; } } |
De tweede kolom van de table moet dus de comments in de list laten zien. hier dacht ik dus slim te zijn, door geneste tables te gebruiken: De cell renderer wordt dus op een List gezet
Java:
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
| public class CommentCollectionRenderer extends JTable implements TableCellRenderer { private PurposeAndConclusionModel model; private PurposeAndConclusionCellRenderer renderer = new PurposeAndConclusionCellRenderer(); public CommentCollectionRenderer() { model = new PurposeAndConclusionModel() { public int getColumnCount() { return 1; } }; setDefaultRenderer(CommentDataModel.class, new CommentRenderer()); setModel(model); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (value == null) return new JLabel(""); List comments = (List) value; if (comments.size() == 0) return new JLabel(""); model.clear(); for (Iterator i = comments.iterator(); i.hasNext();) { CommentDataModel commentDataModel = (CommentDataModel) i.next(); model.add(commentDataModel); } return this; } } |
Ok..ik hoop dat het een beetje duidelijk is. (misschien moet ik gewoon een JList gebruiken ipv een JTable, maar dat terzijde)
Het probleem is de hoogte van de geneste JTable rows. Deze zijn standaard 16 pixels. getPreferredSize werkt helaas niet in de CommentCollectionRenderer. Heeft iemadn hier nog een oplossign voor?
Om het effe duidelijker te maken...dit wil ik:
[ Voor 3% gewijzigd door PhoneTech op 18-05-2005 12:13 ]