2010-01-15 3 views
8

Est-il possible d'ajouter des boutons à l'intérieur de la cellule JTable avec des données? Ce que j'essaie de faire est de créer une table avec des colonnes qui affichent des données (nombre) de la base de données, et deux boutons pour augmenter/diminuer le nombre dans la même cellule.Ajouter des boutons à l'intérieur de la cellule de JTable avec des données?

| ID | Quantité |
| 06 | 2 [+] [-] |

ce serait quelque chose comme ci-dessus avec [+] [-] boutons étant. Donc, quand j'appuie sur [+], le nombre changera à 3 et 1 si j'appuie sur [-].

Répondre

15

Oui, il est possible, bien qu'il ne sera pas facile.

Vous devez écrire votre propre cell renderer personnalisé et le vôtre cell editor.

Ceci est un exemple que j'ai fait en 5 minutes:

sample

Il est loin d'être parfait, mais montre le concept.

Voici le code source:

import java.awt.Component; 
import java.awt.Font; 
import javax.swing.*; 
import javax.swing.table.*; 
import java.awt.Dimension; 

public class CustomCell { 
    public static void main(String [] args) { 
     Object [] columnNames = new Object[]{ "Id", "Quantity" }; 
     Object [][] data  = new Object[][]{ {"06", 1}, {"08", 2} }; 

     JTable table = new JTable(data, columnNames) { 
      public TableCellRenderer getCellRenderer(int row, int column) { 
       return new PlusMinusCellRenderer(); 
      } 
     }; 

     table.setRowHeight(32); 
     showFrame(table); 
    } 

    private static void showFrame(JTable table) { 
     JFrame f = new JFrame("Custom Cell Renderer sample"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new JScrollPane(table)); 
     f.pack(); 
     f.setVisible(true); 
    } 
} 

class PlusMinusCellRenderer extends JPanel implements TableCellRenderer { 
     public Component getTableCellRendererComponent(
          final JTable table, Object value, 
          boolean isSelected, boolean hasFocus, 
          int row, int column) { 
       this.add(new JTextField(value.toString() )); 
       this.add(new JButton("+")); 
       this.add(new JButton("-")); 
       return this; 
     } 
} 

est ici un fil qui peut être interesting et here.

+1

Est-il possible d'ajouter des actionListeners à ces boutons? – cp101020304

+0

Les boutons ne sont pas réellement cliquables; devrais-je ajouter mon propre MouseListener ou quelque chose comme ça pour que cela fonctionne? – ricky3350

1

Je pense que vous devez créer une CellRenderer personnalisée si vous voulez montrer quoi que ce soit d'autre que du texte (ou chiffres) dans la cellule. Le travail de rendu de cellule est de peindre tout ce que vous devez montrer dans la cellule.

Voir Table Renderer documentation.

Donc, dans ce cas, vous pouvez créer un petit JPane qui contient le champ texte et le minuscule boutons + et - - ou juste un composant JSpinner, si ce que vous avez besoin ne. Un peu difficile, bien sûr, mais devrait être possible.

1

Comme indiqué dans le tutorial, vous aurez besoin d'un moteur de rendu pour afficher votre valeur et d'un éditeur pour détecter les événements de la cellule en cours d'édition. Dans ce example, le Component est un JCheckBox. Notez que cela nécessite un DataModel personnalisé qui étend AbstractTableModel pour fournir le Class correct pour une colonne donnée. La suggestion de Joonas d'utiliser JSpinner est un bon qui fonctionne bien.

Questions connexes