Una soluzione potrebbe essere l'uso di un JFormattedTextField, a cui aggiungi un DocumentFilter fatto apposta per le tue esigenze.
Ti posto il codice un po' modificato di un esempio che mi ero fatto qualche tempo fa, in questo momento il filtro blocca tutti i caratteri ad eccezione dei numeri e dei caratteri '-' e '.' , che ti consentono di scrivere numeri negativi e decimali.
codice:
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JFormattedTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultFormatter;
import javax.swing.text.Document;
import javax.swing.text.DocumentFilter;
public class FilteredTextField
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable(){
public void run(){
new TestFilterFrame().setVisible(true);
}
});
}
}
class TestFilterFrame extends JFrame
{
public TestFilterFrame()
{
super("Test Filter");
setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER,50,50));
JFormattedTextField field=new JFormattedTextField(new Formatter());
field.setPreferredSize(new Dimension(100,field.getPreferredSize().height));
panel.add(field);
setContentPane(panel);
pack();
setLocationRelativeTo(null);
}
private class Formatter extends DefaultFormatter
{
private DocumentFilter filter = new Filter();
protected DocumentFilter getDocumentFilter()
{
return filter;
}
private class Filter extends DocumentFilter
{
public boolean isValidCharacter(char c)
{
return c=='0'||c=='1'||c=='2'||c=='3'||c=='4'||c=='5'||c=='6'||c=='7'||c=='8'||c=='9'||c=='-'||c=='.';
}
public boolean isTextValid(String text)
{
for(int i=0;i<text.length();i++)if(!isValidCharacter(text.charAt(i)))return false;
return true;
}
@Override
public void replace(FilterBypass fb,int offset,int length,String text,AttributeSet attrs)throws BadLocationException
{
if(isTextValid(text))super.replace(fb,offset,length,text,attrs);
else Toolkit.getDefaultToolkit().beep();
}
}
}
}