2010-01-15 6 views
8

Ist es möglich, Schaltflächen in der JTable-Zelle zusammen mit Daten hinzuzufügen? Was ich versuche, ist eine Tabelle mit Spalten, die Daten (Nummer) aus der Datenbank anzeigen, und zwei Schaltflächen zum Erhöhen/Verringern der Zahl innerhalb der gleichen Zelle zu erstellen.Hinzufügen von Schaltflächen in der Zelle von JTable zusammen mit Daten?

| ID | Menge |
| 06 | 2 [+] [-] |

Es wäre etwas wie oben mit [+] [-] Tasten sein. Wenn ich also [+] drücke, wird die Nummer zu 3 und 1 geändert, wenn [-] gedrückt wird.

Antwort

15

Ja, es ist möglich, obwohl es nicht einfach sein wird.

Sie müssen Ihre eigenen cell renderer und Ihre eigenen cell editor schreiben.

Dies ist ein Beispiel ich in 5 Minuten gemacht:

sample

Es bei weitem nicht perfekt ist, aber zeigt das Konzept.

Hier ist der Quellcode:

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; 
     } 
} 

Hier ist ein Thread, der interesting und here sein kann.

+1

Ist es möglich, actionListeners zu diesen Schaltflächen hinzuzufügen? – cp101020304

+0

Die Schaltflächen sind nicht anklickbar. müsste ich meinen eigenen MouseListener oder ähnliches hinzufügen, damit dies funktioniert? – ricky3350

1

Ich denke, Sie müssen einen benutzerdefinierten CellRenderer erstellen, wenn Sie etwas anderes als Text (oder Zahlen) in der Zelle anzeigen möchten. Die Aufgabe des CellRenderers besteht darin, alles zu zeichnen, was in der Zelle angezeigt werden soll.

Siehe Table Renderer documentation.

Also in diesem Fall könnten Sie eine kleine JPane erstellen, die das Textfeld und die kleinen + und - Tasten enthält - oder nur eine JSpinner-Komponente, wenn Sie das tun, was Sie brauchen. Ein bisschen knifflig, aber sollte möglich sein.

1

Wie in der tutorial diskutiert, benötigen Sie sowohl einen Renderer, um Ihren Wert anzuzeigen und einen Editor, um Ereignisse aus der Zelle zu erkennen, die bearbeitet wird. In dieser example ist die Component eine JCheckBox. Beachten Sie, dass hierfür eine benutzerdefinierte DataModel erforderlich ist, die AbstractTableModel erweitert, um die richtige Class für eine bestimmte Spalte zu liefern. Joonas Vorschlag, JSpinner zu verwenden, ist ein guter, der gut funktioniert.

Verwandte Themen