2017-07-01 3 views
0

Comment puis-je empêcher les chaînes dans un JTable et autoriser et afficher uniquement les numéros? Comme par exemple j'appuie sur "a" sur mon clavier Je ne vais même pas que "a" sera affiché dans la cellule JTable. littéralement rien ne devrait arriver à moins qu'un utilisateur tape un nombre. alors comment puis-je empêcher même de ne pas montrer "a"?JTable empêche les chaînes

Répondre

0

J'ai eu un problème similaire il y a un certain temps et résolu en validant avec un KeyListener. C'est une façon sale de le faire, mais ça fonctionne. La seule faiblesse est si vous essayez d'éditer beaucoup de cellules rapidement si vous êtes un écrivain rapide. De toute façon, voici le code qui a fonctionné pour moi. J'ai ajouté quelques commentaires, mais en un mot; nous remplaçons la validation normale et vérifions avec un TextField KeyListener si la clé donnée est celle que nous autorisons dans le TextField. Si nous autorisons la clé, nous activons l'édition TextField, sinon, nous la désactivons pour empêcher l'impression du caractère dans TextField. J'espère que ceci vous aide. Ajouter un celleditor sur le champ TestField pour empêcher l'insertion prématurée des données.

MISE À JOUR 1:

public class TableValidation extends JFrame 
{ 
public static void main(String args[]) 
{ 
    TableValidation x = new TableValidation(); 
    x.setVisible(true); 
} 

JPanel topPanel; 
JTable table = new JTable(); 
JScrollPane scrollPane; 
String[] columnNames; 
String[][] dataValues; 

public TableValidation() 
{ 
    this.setTitle("JTable Cell Validation"); 
    this.setDefaultCloseOperation (EXIT_ON_CLOSE); 
    this.setSize(300,112); 

    // make our panel to tin the table to 
    topPanel = new JPanel(); 
    topPanel.setLayout(new BorderLayout()); 
    this.getContentPane().add(topPanel); 

    // set some initial data for the table 
    columnNames = new String[] {"Anything" ,"Numbers only"}; 
    dataValues = new String[][] { {"h4x0r","1337"} }; 


    table.setRowHeight(50); 
    table.setModel(new CustomTableModel(dataValues, columnNames)); 

    TableColumn tableColumn = table.getColumnModel().getColumn(1); // apply our validation to the 2nd column 
    JTextField textfield = new JTextField(); // the textbox to which we test our validation 

    // setup our validation system. were passing the textfield as out celleditor source 
    tableColumn.setCellEditor(new MyCellEditor(textfield)); 
    table.setCellSelectionEnabled(true); 
    scrollPane = new JScrollPane(table); 
    topPanel.add(scrollPane,BorderLayout.CENTER); 
    textfield.addKeyListener(new KeyAdapter() 
    { 
     public void keyTyped(KeyEvent e) 
     { 
      // check what keys can pass our test 
      if (textfield.isFocusOwner()) 
      if (e.getKeyChar() != KeyEvent.VK_BACK_SPACE) // we allow backspace, obviously 
      if (!Character.isDigit(e.getKeyChar())) // if key is not a digit.. cancel editing 
      { 
       // when it detects an invalid input, set editable to false. this prevents the input to register 
       textfield.setEditable(false); 
       textfield.setBackground(Color.WHITE); 
       return; 
      } 
      textfield.setEditable(true); 
     } 
    }); 
} 
} 
class MyCellEditor extends AbstractCellEditor implements TableCellEditor 
{ 
private static final long serialVersionUID = 1L; 
private JTextField textField; 

public MyCellEditor(JTextField textField) 
{ 
    this.textField=textField; 
} 

@Override 
public boolean isCellEditable(EventObject e) 
{ 
    if (super.isCellEditable(e)) { 
     if (e instanceof MouseEvent) { 
      MouseEvent me = (MouseEvent) e; 
      return me.getClickCount() >= 2; 
     } 
     if (e instanceof KeyEvent) { 
      KeyEvent ke = (KeyEvent) e; 
      return ke.getKeyCode() == KeyEvent.VK_F2; 
     } 
    } 
    return false; 
} 

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

@Override 
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) 
{ 
    this.textField.setFont(table.getFont()); 
    this.textField.setText(value.toString()); 
    return this.textField; 
} 
} 
class CustomTableModel extends DefaultTableModel 
{ 
CustomTableModel(String[][] data,String[] names) 
{ 
    super(data, names); 
} 

// we always pass true in our tablemodel so we can validate somewhere else 
public boolean isCellEditable(int row,int cols) 
{ 
    return true; 
} 
} 
+0

Merci qui fonctionne mais malheureusement il faut prendre en charge la saisie rapide, avez-vous un autre exemple avec un éditeur de cellule personnalisé? – SmartCodeNoBugs

+0

Je sais ce qu'est le bug, et je pense qu'il a été réparé. Le champ de texte permettait d'éditer si la cellule était focalisée, même si le TextField n'était pas directement cliqué. TextField a maintenant une vérification pour voir si le champ a été double-cliqué. Si oui, nous pouvons l'éditer. Cela devrait empêcher les typeurs rapides d'insérer des données dans des cellules où elles n'appartiennent pas. – Miekpeeps

+0

merci pour votre effort mais j'ai résolu mon problème avec un filtre de document et un éditeur de cellule personnalisé :) éditera ma question bientôt pour d'autres personnes – SmartCodeNoBugs