2017-09-22 9 views
1

EDIT MAINTENANT AVEC MCVE:Définition JComboBox comme colonne de table ne fonctionne pas

Je veux voir une cellule JTable comme JComboBox. Je l'ai essayé avec Oracle Tutorial et ça ne marche pas. Le tutoriel ne dit rien sur la façon dont vous devez changer votre modèle de table pour le faire fonctionner. Alors, voici le code:

TableModel:

import javax.swing.*; 
import javax.swing.table.AbstractTableModel; 

public class TableModel extends AbstractTableModel { 

@Override 
public int getColumnCount() { 
    // TODO Auto-generated method stub 
    return 2; 
} 

@Override 
public int getRowCount() { 
    // TODO Auto-generated method stub 
    return 2; 
} 

@Override 
public Object getValueAt(int row, int col) { 
    if (row == 0) { 
     return 2; 
    } else if (col == 1) { 
     return 1; 
    } else { 
     return null; 
    } 
} 

} 

Et la vue de montrer les composants:

import java.awt.BorderLayout; 

import javax.swing.*; 
import javax.swing.table.TableColumn; 

public class View extends JFrame { 
public View() { 
    super(); 
    TableModel tableModel = new TableModel(); 
    JTable testTable = new JTable(tableModel); 

    JScrollPane scrollpane = new JScrollPane(testTable); 
    // scrollpane.setOpaque(false); 
    // scrollpane.getViewport().setOpaque(false); 
    JPanel testTablePanel = new JPanel(); 
    testTablePanel.setBorder(
      BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Testkonfiguration")); 
    testTablePanel.setLayout(new BorderLayout()); 
    testTablePanel.add(scrollpane); 

    TableColumn sportColumn = testTable.getColumnModel().getColumn(1); 

    JComboBox comboBox = new JComboBox(); 
    comboBox.addItem("Snowboarding"); 
    comboBox.addItem("Rowing"); 
    comboBox.addItem("Chasing toddlers"); 
    comboBox.addItem("Speed reading"); 
    comboBox.addItem("Teaching high school"); 
    comboBox.addItem("None"); 
    sportColumn.setCellEditor(new DefaultCellEditor(comboBox)); 

    add(scrollpane); 

    pack(); 
    setVisible(true); 
} 
public static void main(String[] args) { 
    new View(); 
} 

} 

Que dois-je changer dans le TableModel pour le faire fonctionner?

+0

Ce qui aiderait plus si vous pouvez créer et publier un valide [mcve] - un petit *** *** compilable et le programme runnable, assez petit pour poster ici complètement, qui démontre le problème pour nous. S'il vous plaît envisager de le faire. –

+0

@HovercraftFullOfEels J'en ai écrit un maintenant, merci – Phreneticus

+0

@Phreneticus vous avez simplement besoin de mettre en œuvre votre modèle correct. Tout d'abord pour la colonne 1, il devrait retourner une des valeurs, que vous avez ajouté à la liste déroulante. Deuxièmement: vous devez implémenter la méthode 'setValueAt (objet aValue, int rowIndex, int columnIndex)' pour stocker les valeurs que vous sélectionnez dans la zone de liste déroulante. Et aussi vous devez implémenter 'isCellEditable (int rowIndex, int columnIndex)' qui retourne vrai pour la colonne avec l'index 1. –

Répondre

1

Dans votre exemple, vous ne modifiez pas la colonne 1. Vous devez d'abord faire cela, comme dans votre modèle:

@Override 
public boolean isCellEditable(int rowIndex, int columnIndex) { 
    return columnIndex == 1; 
} 

Aussi votre modèle ne, n'a pas bien gérer les données aucun moyen d'obtenir les données en fait et en fait est fixé, de sorte que l'éditeur peut n'ont aucun effet possible. Vous devez remplacer setValueAt et le mettre à jour le noyau du modèle.

Par exemple en utilisant votre exemple trivial:

import java.awt.BorderLayout; 
import javax.swing.*; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.TableColumn; 

public class View extends JFrame { 
    public View() { 
     super(); 
     TableModel tableModel = new TableModel(); 
     JTable testTable = new JTable(tableModel); 

     JScrollPane scrollpane = new JScrollPane(testTable); 
     // scrollpane.setOpaque(false); 
     // scrollpane.getViewport().setOpaque(false); 
     JPanel testTablePanel = new JPanel(); 
     testTablePanel.setBorder(BorderFactory 
       .createTitledBorder(BorderFactory.createEtchedBorder(), "Testkonfiguration")); 
     testTablePanel.setLayout(new BorderLayout()); 
     testTablePanel.add(scrollpane); 

     TableColumn sportColumn = testTable.getColumnModel().getColumn(1); 

     JComboBox<String> comboBox = new JComboBox<>(); 
     comboBox.addItem("Snowboarding"); 
     comboBox.addItem("Rowing"); 
     comboBox.addItem("Chasing toddlers"); 
     comboBox.addItem("Speed reading"); 
     comboBox.addItem("Teaching high school"); 
     comboBox.addItem("None"); 
     sportColumn.setCellEditor(new DefaultCellEditor(comboBox)); 

     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     add(scrollpane); 

     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new View(); 
    } 

} 

class TableModel extends AbstractTableModel { 
    Object[][] innerModel = new Object[][]{{2, 1}, {2, null}}; 

    public TableModel() { 

    } 

    @Override 
    public int getColumnCount() { 
     return 2; 
    } 

    @Override 
    public int getRowCount() { 
     return innerModel.length; 
    } 

    @Override 
    public Object getValueAt(int row, int col) { 
     return innerModel[row][col]; 
    } 

    @Override 
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 
     innerModel[rowIndex][columnIndex] = aValue; 
     fireTableCellUpdated(rowIndex, columnIndex); 
    } 

    @Override 
    public boolean isCellEditable(int rowIndex, int columnIndex) { 
     return columnIndex == 1; 
    } 

} 
+0

C'est tout, j'ai simplement oublié d'appeler setValueAt() * facepalm * Merci! – Phreneticus

+0

Mon code fonctionne maintenant, cependant, je peux seulement voir que la colonne de la table se compose de ComboBoxes, dès que je clique sur une cellule de tableau dans cette colonne. Dès que je choisis une autre option de la Combobox, je ne vois plus la flèche appartenant à la ComboBox. Y a-t-il un moyen de montrer TOUJOURS cette flèche sur CHAQUE cellule? – Phreneticus