2009-08-26 6 views
0

Ich bin neu in der Arbeit mit JTables und habe Schwierigkeiten, meinen benutzerdefinierten JTable-Editor richtig zu verwenden.Seltsames Blinken der Zelle bei Auswahl mit benutzerdefiniertem Zellen-Editor

Ich habe eine Reihe von benutzerdefinierten Panels mit Listen und Schaltflächen. Um sie in einer Zelle rendern zu können, verwende ich einen benutzerdefinierten PanelCellRenderer, der verschiedene Konstruktoren für jeden Typ des Panels enthält.

Um die Schaltflächen anklickbar zu machen, habe ich diesen einfachen PanelCellEditor erstellt, der den DefaultCellEditor erweitert. Um auf die Daten zuzugreifen, die zum Zeitpunkt der Bearbeitung in den Zellen gespeichert sind, übergebe ich die Referenz an den PanelCellRenderer.

Das Problem, das ich habe, ist, dass, wenn ich die Zelle (indem ich darauf klicke), von der Anzeige der Liste mit der Schaltfläche, die ausgewählte Zelle wird vollständig leer. Wenn die Zelle abgewählt wird, erscheint die Liste mit den Daten und die Schaltfläche erneut. Jeder Rat hierzu wird hilfreich sein. Vielen Dank.

public class PanelCellEditor extends DefaultCellEditor { 

    private PanelCellRenderer pcr; 
    private Object value; 

    public PanelCellEditor(final PanelCellRenderer pcr) { 
     super(new JCheckBox()); 
     this.pcr = pcr; 
     this.pcr.setOpaque(true); 

     if (pcr.firstPanel != null) { 

      pcr.firstPanel.Button.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        //do something 
        fireEditingStopped(); 
       } 
      }); 

      pcr.firstPanel.List.addMouseListener(new MouseAdapter() { 
       public void mouseClicked(MouseEvent e) { 
        String value = (String) ((javax.swing.JList) e.getSource()).getSelectedValue(); 
        //do something 
        fireEditingStopped(); 
       } 
      }); 
     } 
     else if (pcr.secondPanel != null) { 

      pcr.secondPanel.Button.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        //do something 
        fireEditingStopped(); 
       } 
      }); 

      pcr.secondPanel.List.addMouseListener(new MouseAdapter() { 
       public void mouseClicked(MouseEvent e) { 
        String value = (String) ((javax.swing.JList) e.getSource()).getSelectedValue(); 
        //do something 
        fireEditingStopped(); 
       } 
      }); 
     } 
    } 

    public Component getTableCellEditorComponent(JTable table, Object value, 
     boolean isSelected, int row, int column) { 

     //// if I comment this whole bit //// 
     if (isSelected) { 
      pcr.setForeground(table.getSelectionForeground()); 
      pcr.setBackground(table.getSelectionBackground()); 
     } else { 
      pcr.setForeground(table.getForeground()); 
      pcr.setBackground(table.getBackground()); 
     } 

     if (pcr.firstPanel != null) 
      pcr.firstPanel.list.setListData((String[])value); 
     else if (pcr.secondPanel != null) { 
      pcr.secondPanel.list.setListData((String[])value); 
     } 
     //////// nothing changes ///////// 

     this.value = value; 
     return pcr; 
    } 

    public Object getCellEditorValue() { 
     return value; 
    } 

    public boolean stopCellEditing() { 
     return super.stopCellEditing(); 
    } 

    protected void fireEditingStopped() { 
     super.fireEditingStopped(); 
    } 
} 

Antwort

0

können Sie den JTable.getTableCellEditor in Ihre Objekte verfolgen. Haben Sie Ihren Editor tatsächlich mit dem Wert registriert, den er mit der Jtable bearbeiten soll?

Verwandte Themen