[java] JTable TableCellRenderer/Editor repaint problemen

Pagina: 1
Acties:

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 11-04 12:19
Ik heb een TableCellRenderer/Editor (zelfde klasse, implementeerd beide interfaces) die behoorlijk raar reageerd op wijzigingen

Omdat elke rij andere acties kan hebben, wil ik graag deze acties per rij aangeven in 1 kolom.
Elke rij kan dus meerdere acties hebben. Ik heb geen enkele voorbeelden kunnen vinden waar ze meerdere jbuttons in een kolom kwijt kunnen dus ik ben zelf iets gaan prutsen. ipv van Jbuttons als values door te geven geef ik een array AbstractActions door aan de cell renderer.
De cell renderer gooit vervolgens de jpanel leeg en itereerd over de action array toe en voegt de buttons toe. Als ik de status van de rij verander, dan zou er andere knoppen moeten verschijnen. Dit gebeurt alleen als ik de kolom resize. ok..repaint probleems dus...maar nee hoor...

Invalidate, Validate, Repaint, Revalidate lijken allemaal geen effect te hebben. Ook blijven sommige knoppen staan waar ze allang vervangen moeten worden door andere.
Dit soort rare effecten krijg ik dan:
Afbeeldingslocatie: http://www.phonetech.nl/got/table.png

De code voor de renderer/Editor
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
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
/*
 * Created on 7-mrt-2006
 * Copyright: (c) 2004-2005
 * Company: Cavendish Kinetics B.V.
 * 
 * @author bart.veenstra
 * @version $Revision: 1.1 $
 */
package eu.promenade.client.tracking.ui.components.table.editor;

import java.awt.Component;
import java.util.EventObject;

import javax.swing.Action;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.event.CellEditorListener;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;

public class PMultipleButtonEditor extends JPanel implements TableCellEditor, TableCellRenderer
{
    public PMultipleButtonEditor()
    {
        super();
        setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));

    }

    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
            int row, int column)
    {
        assembleComponent(value,table);
        return this;
    }

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
            boolean hasFocus, int row, int column)
    {
        assembleComponent(value,table);
        return this;
    }

    private void assembleComponent(Object value, JTable table)
    {
        invalidate();
        removeAll();
        Action[] actions = (Action[]) value;
        for (int i = 0; i < actions.length; i++)
            add(createButton(actions[i]));
        repaint();
        table.invalidate();
        table.repaint();
    }

    public Object getCellEditorValue()
    {
        return null;
    }

    public boolean isCellEditable(EventObject anEvent)
    {
        return true;
    }

    public boolean shouldSelectCell(EventObject anEvent)
    {
        return false;
    }

    public boolean stopCellEditing()
    {
        return true;
    }

    public void cancelCellEditing()
    {}

    public void addCellEditorListener(CellEditorListener l)
    {}

    public void removeCellEditorListener(CellEditorListener l)
    {}

    private JButton createButton(Action action)
    {
        JButton btn = new JButton(action);
        return btn;
    }

}


Kan ik eigenlijk wel acties pasen naar een cell renderer? (mij lijkt van wel)
Zijn er alternatieven voor het plaatsen van meerdere buttons in een kolom?
Of is het beter om elke button in een aparte kolom te stoppen (misschein wel makkelijker)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
M'n Swing gepruts is ondertussen erg lang geleden, maar ik doe een poging ... Ik zoek het probleem even in een andere hoek: het zou ook kunnen dat de GUI niet op de hoogte is van de wijzigingen in de tabel data.

Heb je een eigen TableModel gemaakt? Gebruik je AbstractTableModel? Misschien kan je dan eens proberen om fireTableCellUpdated(int row, int column) aan te roepen voor de cell van de buttons, of brute-force fireTableDataChanged().

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 11-04 12:19
Ik heb het idd merkbaar gemaakt door middel van fireTableCellUpdated, TableRowUpdated en de gehele cel met TableDataChanged...Allemaal hebben ze niet het gewenste effect..

Mijn table model extends de AbstractTableModel.

[ Voor 14% gewijzigd door PhoneTech op 10-03-2006 11:04 ]


  • LAN
  • Registratie: Oktober 2000
  • Niet online

LAN

Probeer eens bij de initialisatie van je JPanel het opaque attribuut op true te zetten.

Dus ergens in je PMultipleButtonEditor constructor: this.setOpaque(true);

Daardoor zal je hele panel met buttons getekend worden, anders kan het zijn dat hij stukken doorzichtig laat.
En aan je screenshot te zien doet hij nu dat ook.

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 11-04 12:19
LAN schreef op vrijdag 10 maart 2006 @ 13:50:
Probeer eens bij de initialisatie van je JPanel het opaque attribuut op true te zetten.

Dus ergens in je PMultipleButtonEditor constructor: this.setOpaque(true);

Daardoor zal je hele panel met buttons getekend worden, anders kan het zijn dat hij stukken doorzichtig laat.
En aan je screenshot te zien doet hij nu dat ook.
Ik denk dat dat de oplossing voor het probleem is, maar helaas heb ik de knoppen maar naast de table gezet. Dit past eigenlijk ook beter in de look and feel van de applicatie aangezien de rest van de panels ook knoppen aan de zijkant hebben. Heb gebruik gemaakt van mijn TableDecorator die een ButtonStackBuilder gebruikt van JGoodies om de rij op te bouwn en hij voegt er ook meteen een mooie context menu aan toe. Bedankt voor de oplossing!