2009-12-10 2 views
4

Je gère des données numériques qui sont souvent éditées vers le haut ou vers le bas de 0.01 * Value_of_variable, donc un spinner ressemble à un bon choix par rapport à une cellule de texte habituelle.Y at-il un moyen pratique d'utiliser un spinner en tant qu'éditeur dans un JTable Swing?

J'ai regardé DefaultCellEditor mais il ne prendra que des champs de texte, des listes déroulantes ou des cases à cocher.

Existe-t-il un moyen pratique d'utiliser un essoreur?

+0

Merci les gens. J'ai pensé que je pourrais créer un composant personnalisé, j'ai juste (à tort) supposé qu'il pourrait y avoir une manière différente. – Uri

Répondre

1

... et remplacer la méthode getCellEditorValue():

class SpinnerEditor extends DefaultCellEditor 
{ 
    private JSpinner spinner; 

    public SpinnerEditor() 
    { 
     super(new JTextField()); 
     spinner = new JSpinner(new SpinnerNumberModel(0, 0, 100, 5)); 
     spinner.setBorder(null); 
    } 

    public Component getTableCellEditorComponent(
     JTable table, Object value, boolean isSelected, int row, int column) 
    { 
     spinner.setValue(value); 
     return spinner; 
    } 

    public Object getCellEditorValue() 
    { 
     return spinner.getValue(); 
    } 
} 
+0

Cette solution présente certains comportements qui peuvent ne pas être corrects. souhaitable pour de nombreux utilisateurs. Lorsqu'un utilisateur tape un nombre avant que l'éditeur commence à éditer, le JTable mettra au point le JSpinner, pas l'éditeur dans le JSpinner. Cela signifie que le texte que l'utilisateur vient de taper ne va nulle part. Comparez cela à la façon dont le DefaultCellEditor se comporte: la nouvelle clé tapée est insérée dans la cellule après la valeur actuelle. – Jason

+0

-1 implémentation de cellEditor non valide, car elle n'est pas conforme à son contrat de notification – kleopatra

2

Il suffit d'étendre DefaultCellEditor et d'écraser la méthode getTableCellEditorComponent() pour renvoyer un JSpinner.

+0

+1 @Uri - Voir aussi "Utilisation d'autres éditeurs" http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#editrender – ssakl

4

Voici un exemple qui traite de la question que je commentais sur la réponse de camickr. Ceci est un exemple complet et compilable. Prenez ce dont vous avez besoin et abandonnez ce que vous n'avez pas.

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class JSpinnerInTables { 
    static String[] columnNames = { 
     "Name","Value" 
    }; 
    static Object[][] data = { 
     {"one",1.0}, 
     {"two",2.0} 
    }; 
    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     JTable table = new JTable(data,columnNames); 
     //table.setSurrendersFocusOnKeystroke(true); 
     TableColumnModel tcm = table.getColumnModel(); 
     TableColumn tc = tcm.getColumn(1); 
     tc.setCellEditor(new SpinnerEditor()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(table); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    public static class SpinnerEditor extends DefaultCellEditor 
    { 
     JSpinner spinner; 
     JSpinner.DefaultEditor editor; 
     JTextField textField; 
     boolean valueSet; 

     // Initializes the spinner. 
     public SpinnerEditor() { 
      super(new JTextField()); 
      spinner = new JSpinner(); 
      editor = ((JSpinner.DefaultEditor)spinner.getEditor()); 
      textField = editor.getTextField(); 
      textField.addFocusListener(new FocusListener() { 
       public void focusGained(FocusEvent fe) { 
        System.err.println("Got focus"); 
        //textField.setSelectionStart(0); 
        //textField.setSelectionEnd(1); 
        SwingUtilities.invokeLater(new Runnable() { 
         public void run() { 
          if (valueSet) { 
           textField.setCaretPosition(1); 
          } 
         } 
        }); 
       } 
       public void focusLost(FocusEvent fe) { 
       } 
      }); 
      textField.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent ae) { 
        stopCellEditing(); 
       } 
      }); 
     } 

     // Prepares the spinner component and returns it. 
     public Component getTableCellEditorComponent(
      JTable table, Object value, boolean isSelected, int row, int column 
     ) { 
      if (!valueSet) { 
       spinner.setValue(value); 
      } 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        textField.requestFocus(); 
       } 
      }); 
      return spinner; 
     } 

     public boolean isCellEditable(EventObject eo) { 
      System.err.println("isCellEditable"); 
      if (eo instanceof KeyEvent) { 
       KeyEvent ke = (KeyEvent)eo; 
       System.err.println("key event: "+ke.getKeyChar()); 
       textField.setText(String.valueOf(ke.getKeyChar())); 
       //textField.select(1,1); 
       //textField.setCaretPosition(1); 
       //textField.moveCaretPosition(1); 
       valueSet = true; 
      } else { 
       valueSet = false; 
      } 
      return true; 
     } 

     // Returns the spinners current value. 
     public Object getCellEditorValue() { 
      return spinner.getValue(); 
     } 

     public boolean stopCellEditing() { 
      System.err.println("Stopping edit"); 
      try { 
       editor.commitEdit(); 
       spinner.commitEdit(); 
      } catch (java.text.ParseException e) { 
       JOptionPane.showMessageDialog(null, 
        "Invalid value, discarding."); 
      } 
      return super.stopCellEditing(); 
     } 
    } 
} 
1

La réponse de Jason est parfaite. Pour aider les autres qui pourraient être à la recherche d'une version date et heure, j'ai édité le code de Jason en conséquence. J'espère que ça aide quelqu'un comme Jason m'a aidé.

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class SpinnerInJTable { 
static String[] columnNames = { 
    "Name","Time & Date" 
}; 
static Object[][] data = { 
    {"Date One",new Date(Long.decode("1397091313404"))}, 
    {"Date Two", new Date(Long.decode("1397001313404"))} 
}; 
public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    JTable table = new JTable(data,columnNames); 
    //table.setSurrendersFocusOnKeystroke(true); 
    TableColumnModel tcm = table.getColumnModel(); 
    TableColumn tc = tcm.getColumn(1); 
    tc.setCellEditor(new SpinnerEditor()); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.add(table); 
    frame.pack(); 
    frame.setVisible(true); 
} 
public static class SpinnerEditor extends DefaultCellEditor 
{ 
    JSpinner spinner; 
    JSpinner.DefaultEditor editor; 
    JTextField textField; 
    boolean valueSet; 

    // Initializes the spinner. 
    public SpinnerEditor() { 
     super(new JTextField()); 
     spinner = new JSpinner(new SpinnerDateModel()); 
     editor = ((JSpinner.DateEditor)spinner.getEditor()); 
     textField = editor.getTextField(); 
     textField.addFocusListener(new FocusListener() { 
      public void focusGained(FocusEvent fe) { 
       System.err.println("Got focus"); 
       //textField.setSelectionStart(0); 
       //textField.setSelectionEnd(1); 
       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         if (valueSet) { 
          textField.setCaretPosition(1); 
         } 
        } 
       }); 
      } 
      public void focusLost(FocusEvent fe) { 
      } 
     }); 
     textField.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent ae) { 
       stopCellEditing(); 
      } 
     }); 
    } 

    // Prepares the spinner component and returns it. 
    public Component getTableCellEditorComponent(
     JTable table, Object value, boolean isSelected, int row, int column 
    ) { 
     if (!valueSet) { 
      spinner.setValue(value); 
     } 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       textField.requestFocus(); 
      } 
     }); 
     return spinner; 
    } 

    public boolean isCellEditable(EventObject eo) { 
     System.err.println("isCellEditable"); 
     if (eo instanceof KeyEvent) { 
      KeyEvent ke = (KeyEvent)eo; 
      System.err.println("key event: "+ke.getKeyChar()); 
      textField.setText(String.valueOf(ke.getKeyChar())); 
      //textField.select(1,1); 
      //textField.setCaretPosition(1); 
      //textField.moveCaretPosition(1); 
      valueSet = true; 
     } else { 
      valueSet = false; 
     } 
     return true; 
    } 

    // Returns the spinners current value. 
    public Object getCellEditorValue() { 
     return spinner.getValue(); 
    } 

    public boolean stopCellEditing() { 
     System.err.println("Stopping edit"); 
     try { 
      editor.commitEdit(); 
      spinner.commitEdit(); 
     } catch (java.text.ParseException e) { 
      JOptionPane.showMessageDialog(null, 
       "Invalid value, discarding."); 
     } 
     return super.stopCellEditing(); 
    } 
} 

}

Questions connexes