2009-05-20 4 views
2

Hallo habe ich eine Klasse ColorChooser (im net.java.dev.colorchooser.ColorChooser Paket)Pass Ereignisse in benutzerdefinierten JTable

Dies ist eine benutzerdefinierte Komponente verwendeten Farben genannt auszuwählen. Ich möchte eine JTable mit ColorChoosers in der zweiten Spalte anzeigen. Also habe ich meine eigene Table und es funktioniert:

@SuppressWarnings("serial") 
class ColorChooserTableRenderer extends DefaultTableCellRenderer { 

    public static List<ColorChooser> colors; 

    public ColorChooserTableRenderer(int rows) { 
     colors = new ArrayList<ColorChooser>(rows); 
     for (int i = 0; i<rows ; i ++) { 
      colors.add(new ColorChooser()); 
     } 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, 
      boolean isSelected, boolean hasFocus, int row, int column) { 
     return colors.get(row); 
    } 

} 

melde ich mich in meinem Tisch:

JTable t = new JTable(5,3); 
t.getColumn(t.getColumnName(1)).setCellRenderer(new ColorChooserTableRenderer(5)); 

Das Display ist gut. Es zeigt sogar die Quick-Info der ColorChoosers an, wenn ich mit der Maus über eine davon fahre. Das Problem ist, dass die ColorChooser keine MouseEvents erhalten.

Normalerweise, wenn Sie die Maus auf einem ColorChooser drücken und halten, erhalten Sie ein Popup-Fenster, mit dem Sie eine Farbe auswählen können. Wenn in der JTable die ColorChooser-Komponente das Mausereignis nicht empfängt.

Irgendwelche Lösungen?

Edit: Die Frage zu diesem leicht geändert werden kann:

Können Sie mir bitte JButtons in der zweiten Spalte, die wirklich funktionieren, die ein kleines Beispiel einer Tabelle geben? Wissen Sie, Tasten, die gedrückt werden können?

+0

Sie wirklich nicht wollen, Farben statisch (oder öffentlichen oder nicht-fiinal) machen. –

Antwort

2

Ein Renderer malt nur die Komponente auf dem Bildschirm und lässt keine Interaktion zu. Was Sie brauchen, ist auch eine TableCellEditor zu implementieren. Es wird empfohlen, dass Sie die AbstractCellEditor erben, und Sie werden etwas Arbeit sparen. Überprüfen Sie die Java tutorial für Tabellen.

Beispiel:

public class MyTableCellRenderer implements TableCellRenderer 
{ 
    private JButton button = new JButton("Press Me"); 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     return button; 
    } 
} 

public class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor 
{ 
    private JButton button; 

    public MyTableCellEditor() 
    { 
     button = new JButton("Press Me"); 
     button.addActionListener(new ActionListener(){ 

      public void actionPerformed(ActionEvent e) { 
       System.out.println("buttonPressed"); 
      } 
     }); 
    } 
    public Object getCellEditorValue() { 
     return null; 
    } 
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
     return button; 
    } 
} 
+0

Warum macht Sun unser Leben schwer? Können Sie mir bitte ein kleines Beispiel einer Tabelle mit JButtons in der zweiten Spalte geben, die tatsächlich funktionieren? Wissen Sie, Tasten, die gedrückt werden können? –

+0

sicher gib mir ein paar Minuten :) – willcodejavaforfood

+0

Dort ein ziemlich sinnloses Beispiel hinzugefügt, aber das ist das Minimum, das Sie brauchen – willcodejavaforfood

3

Das klingt vage vertraut, da ich Table Cell Renderer für andere Zwecke verwendet habe.

Mein Verständnis ist, dass TableCellRenderer nur verwendet wird, render die Komponente; Eine Komponente existiert tatsächlich nicht in jeder der Zellen.

Sie müssten also wahrscheinlich Mausereignisse von der JTable selbst zum ColorChooser weiterleiten.

edit: ps.s, siehe my question - auch für das benutzerdefinierte Rendering von Tabellenzellen benötigen Sie nur 1 Instanz der Komponente selbst für die gesamte Spalte, wenn die Spalte mit derselben Logik gerendert wird. Speichern Sie den persistenten Status nicht im TableCellRenderer, sondern speichern Sie ihn stattdessen in TableModel. Verwenden Sie diesen Zustand unmittelbar vor dem Rendern, wenn Sie den Aufruf an getTableCellRendererComponent() bearbeiten.