[JTable] Collecties per row weergeven

Pagina: 1
Acties:

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 02-05 20:58
Hi all,

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:
Afbeeldingslocatie: http://www.phonetech.nl/comments.gif

[ Voor 3% gewijzigd door PhoneTech op 18-05-2005 12:13 ]


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 02-05 20:58
heb het inmiddels al opgelost door simpel weg dynamische panels te gebruiken...was potverdomme met 20 regels klaar....

Onbegrijpelijk dat JTable zo moeilijk doet om rij hoogten goed te krijgen....

JTable is like a box of chocolates....you never now what you're gonna get...