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
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;
}
}
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
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
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