[Java] JTable en JComboBox probleem.

Pagina: 1
Acties:

  • Standeman
  • Registratie: November 2000
  • Laatst online: 01:03

Standeman

Prutser 1e klasse

Topicstarter
Zoals sommige misschien al door hebben, ben ik druk bezig Swing te snappen :9. Ik kom er regelmatig niet direct uit, maar dan lukt het wel aan de hand van de tutorial en andere examples.
Deze keer heb Ik mezelf suf gestaard op examples en de Swing tutorials, maar ik kan maar niet vinden waar het aan ligt.

Mijn probleem in het kort:

Ik heb een klasse gemaakt welke JComboBox overerft en TableCellRenderer implementeerd. In deze klasse zet ik een aantal waarden. Tevens heb ik de methode getTableCellRendererComponent overridden en deze set de combobox op de juiste index aan de hand van de value.

Nu komt het probleem. Wanneer ik de renderer (JComboBox dus) toevoeg aan de TableColumn van mijn (welke natuurlijk vanuit mijn JTable komt) Zie ik wel de gelesecteerde waarde, maar werkt de dropdown functie van de JComboBox niet meer (als ik er op klik, gebeurt er niets. De juiste waarde zit er wel in, dit heb ik gezien in mijn Debugger (NetBeans))...

Dus mijn vraag is.. wat doe ik fout

owja.. even wat code, aangezien ik niet altijd de duidelijkste ben..

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class WorkDataRenderer extends JComboBox implements TableCellRenderer {
    
    /** Creates a new instance of WorkDataRenderer */
    public WorkDataRenderer() {
        super();
    }
    
    public Component getTableCellRendererComponent(JTable table, 
                      Object value, 
                      boolean isSelected, 
                      boolean hasFocus, 
                      int row, 
                      int column) {
        if (isSelected) {
            setForeground(table.getSelectionForeground());
            super.setBackground(table.getSelectionBackground());
        } else {
            setForeground(table.getForeground());
            setBackground(table.getBackground());
        }
        setSelectedItem(value);
        return this;
    }
}


en de code welke ik gebruik om mijn data in de JTable te zetten:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        TableColumnModel tcm = workDataTable.getColumnModel();
        TableColumn tc = tcm.getColumn(WorkDataTableModel.LOCATION);
        WorkDataRenderer workDataRenderer = new WorkDataRenderer();
        try {
            ILocationController controller = LocationFactory.getLocationController();
            List locations = controller.retreiveLocations();
            Iterator iLoc = locations.iterator();
            while (iLoc.hasNext()) {
                Location location = (Location) iLoc.next();
                workDataRenderer.addItem(location.getName());
            }
        } catch (ModelException mx) {
            //show dialog
            mx.printStackTrace();
        }        
        tc.setCellRenderer(workDataRenderer);


p.s. Er worden geen exceptions gethrowed ofzo... Alles werkt perfect (data is er, juiste item wordt geselecteerd), maar er komt geen lijstje naar beneden als ik op het pijltje klik.

The ships hung in the sky in much the same way that bricks don’t.


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Je haalt waarschijnlijk de editor en de renderer van een cell door elkaar. Kijk eens hier en vooral dit stuk. Uiteindelijk wil je denk ik dit (allemaal in dezelfde pagina van de Java Tutorial).

  • Standeman
  • Registratie: November 2000
  • Laatst online: 01:03

Standeman

Prutser 1e klasse

Topicstarter
Je haalt waarschijnlijk de editor en de renderer van een cell door elkaar. Kijk eens hier en vooral dit stuk. Uiteindelijk wil je denk ik dit (allemaal in dezelfde pagina van de Java Tutorial).
Die ken ik al bijna uit mijn hoofd :)

Echt door elkaar halen is eigenlijk geen sprake van... Het niet snappen wel :)

Ik heb een tabel waarin al reeds wat data in staat. Deze data is niet meer relevant en moet ververst worden door andere data. Tevens moet kolom twee verandert worden in een combobox met een aantal vaste waarden.

Wat ik nu heb is alsvolgt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class WorkDataTableModel extends AbstractTableModel {
    
    /** Creates a new instance of WorkDataTableModel */
    public WorkDataTableModel() {
    }
    
    private final static String[] columnNames = {
        "Datum", "Locatie"
    };
    
    private Object[][] data = {
        {"01-12-2005", "Waarde x"},
        {"02-12-2005", "Waarde y"},
        {"03-12-2005", "Waarde z"},
    };
    
    public int getColumnCount() {
        return columnNames.length;
    }
.... etc
.... etc


In mijn event waar "the magic should happen" doe ik het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        workDataTable.setModel(new WorkDataTableModel());
        
        JComboBox comboBox = new JComboBox();
         // alle mogelijke waarden van comboBox uit DB halen
        try {
            ILocationController controller = LocationFactory.getLocationController();
            List locations = controller.retreiveLocations();
            Iterator iLoc = locations.iterator();
            while (iLoc.hasNext()) {
                Location location = (Location) iLoc.next();
                comboBox.addItem(location.getName());
            }
        } catch (ModelException mx) {
            //show dialog
            mx.printStackTrace();
        }
        TableColumn tc = workDataTable.getColumnModel().getColumn(1);
        tc.setCellEditor(new DefaultCellEditor(comboBox));
        
        DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
        tc.setCellRenderer(renderer);


Bovenstaande is zo'n beetje letterlijk uit de TableRenderDemo genomen.

Het resultaat is dat mijn tabel mooi gevuld wordt met data, maar dat ik niets aan wijzigen / aanpassen. :? (dus zie ook de comboBox nergens)

[ Voor 4% gewijzigd door Standeman op 19-12-2004 23:04 ]

The ships hung in the sky in much the same way that bricks don’t.


  • Standeman
  • Registratie: November 2000
  • Laatst online: 01:03

Standeman

Prutser 1e klasse

Topicstarter
Ok de fout is gevonden :)

In mijn TableModel miste ik het volgende:

code:
1
2
3
4
5
6
7
8
9
10
    public boolean isCellEditable(int row, int col) {
        //Note that the data/cell address is constant,
        //no matter where the cell appears onscreen.
        return true;
//        if (col < 2) {
//            return false;
//        } else {
//            return true;
//        }
    }


Deze is belangrijk, omdat je anders geen cell's van je JTable kan editen.

Ben nog een eind weg, maar ooit ga ik het allemaal wel snappen :)

The ships hung in the sky in much the same way that bricks don’t.