2017-02-24 2 views
1

Wie wir bereits wissen, müssen wir die Eingabetaste zweimal drücken, um die Auswahl beim Bearbeiten einer Zelle in JTable zu ändern. Um dieses Verhalten zu überschreiben, versuche ich einen benutzerdefinierten Tabellenzelleneditor zu schreiben, bei dem eine einzelne Eingabetaste gedrückt wird, die Bearbeitung in der aktuellen Zelle beendet ist, die Auswahl in die nächste Zeile geändert wird und die Bearbeitung in der neu ausgewählten Zelle beginnt und deren Inhalt automatisch ausgewählt wird.Angepasster Tabellenzellen-Editor in Java mit Spaltendatentyp Float

das ganze Szenario funktioniert gut für ganze Zahlen, aber nicht für FLOAT DATENTYP. für Spalten mit dem Datentyp Float/Double i erhalten Fehler

java.lang.IllegalArgumentException: nicht gegeben Objekt als Nummer

, wenn sie gedrückt Kann Format wird Geben Sie die Auswahl zu ändern.

Jede Hilfe in dieser Hinsicht bitte. Ich benutze folgenden Code, den ich während der Online-Suche gefunden habe.

package javaapplication1; 

import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import javax.swing.AbstractCellEditor; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellEditor; 
import javax.swing.table.TableColumn; 
import javax.swing.text.JTextComponent; 

/** 
* 
* @author alqama 
*/ 
public class test extends JPanel{ 

    private JTable table; 

    test() 
    { 
     table = new JTable(){ 

     @Override 
     public void changeSelection( int row, int column, boolean toggle, boolean extend) 
     { 
      super.changeSelection(row, column, toggle, extend); 

      if (editCellAt(row, column)) 
      { 
       Component editor = getEditorComponent(); 
       editor.requestFocusInWindow(); 
       ((JTextComponent) editor).selectAll(); 

      } 
     }}; 
     DefaultTableModel dtm = new javax.swing.table.DefaultTableModel(
       new Object [][] { 

        }, 
       new String [] { "Integer","Float"} 
      ) { 
       public Class getColumnClass(int col) { 
       if(col==0) return java.lang.Integer.class; 
       return java.lang.Float.class; 
      } 

      public boolean isCellEditable(int rowIndex, int columnIndex) { 
       return true; 
      } 
     }; 
     table.setModel(dtm); 
     CustomTableCellEditor et = new CustomTableCellEditor(table); 
     table.getColumnModel().getColumn(1).setCellEditor(et); 
     table.getColumnModel().getColumn(0).setCellEditor(et); 

     for (int i = 0; i < 5; i++) { 
      dtm.addRow(new Object[]{i,1.5+i}); 
     }  


     table.setPreferredScrollableViewportSize(new Dimension(123, 123)); 
     this.add(new JScrollPane(table)); 

    } 
    private void display() { 
     JFrame f = new JFrame("Test Table"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new test().display(); 
      } 
     }); 
    } 




    protected class CustomTableCellEditor extends AbstractCellEditor implements TableCellEditor { 

     private JTable table; 
     JTextField component = new JTextField(); 

     public CustomTableCellEditor(JTable table) { 
      this.table = table; 
     } 

     public boolean stopCellEditing() { 

      boolean ans = super.stopCellEditing();    
      return ans; 
     } 

     @Override 
     public void cancelCellEditing() { 
      super.cancelCellEditing(); 
     } 

     @Override 
     public Object getCellEditorValue() { 
      return component.getText();   
     } 

     @Override 
     public Component getTableCellEditorComponent(JTable arg0, Object value, 
       boolean arg2, int arg3, int arg4) { 
      component.setText(value.toString()); 
      return component; 
     } 
    } 
} 
+0

Bitte geben Sie Ihre Implementierung von 'getColumnClass()', wenn Sie Ihre Frage bearbeiten, um eine [mc enthalten ve] das zeigt das Problem, das Sie beschreiben. – trashgod

+0

Ich habe den obigen Code mit komplettem Beispiel aktualisiert. –

+0

Ich habe den obigen Code mit komplettem Beispiel aktualisiert. Mit der EINGABE-Taste in der Integer-Spalte drücken, die Bearbeitung in der aktuellen Zelle ist abgeschlossen und die nächste Zelle wird direkt in den Editiermodus gewählt und selektiertAlle. Für das Gleitkommazahlformat wird der Fehler ausgelöst. –

Antwort

1

-Implementierung Sie Modell getColumnClass() für Spalte 1 kehrt Float.class, so dass Ihre Implementierung von getCellEditorValue() Wert des gleichen Typs zurückgeben sollte:

@Override 
public Object getCellEditorValue() { 
    return Float.valueOf(component.getText());   

Als Alternative können Sie den Editor nach Klasse angeben :

CustomTableCellEditor et = new CustomTableCellEditor(table); 
table.setDefaultEditor(Float.class, et); 
+1

Vielen Dank. Mit obigem habe ich den Integer-Typ für die Spalte 1 und den Float-Typ für die Spalte 2 zurückgegeben und es funktioniert großartig. –