【发布时间】:2014-07-12 03:41:16
【问题描述】:
我只需要在 java 的文本字段区域中键入字符。我通过更改为各种类型尝试了以下代码。
char a= evt.getKeyChar();
if(!(a>='0'&&a<='9')){
evt.consume();
}
【问题讨论】:
我只需要在 java 的文本字段区域中键入字符。我通过更改为各种类型尝试了以下代码。
char a= evt.getKeyChar();
if(!(a>='0'&&a<='9')){
evt.consume();
}
【问题讨论】:
尝试使用DocumentFilter,并将其附加到JTextField 的Document。
这是一个相同的小例子,寻求帮助:
package to.uk.gagandeepbali.examples;
import javax.swing.*;
import javax.swing.text.AbstractDocument;
import java.awt.*;
/**
* Created by Gagandeep Bali on 7/12/2014.
*/
public class FilterCharacters {
private void displayGUI() {
JFrame frame = new JFrame("Filtering Text Example");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JPanel contentPane = new JPanel();
JTextField tField = new JTextField(10);
((AbstractDocument)tField.getDocument()).setDocumentFilter(new MyDocumentFilter());
contentPane.add(tField);
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
new FilterCharacters().displayGUI();
}
};
EventQueue.invokeLater(runnable);
}
}
package to.uk.gagandeepbali.examples;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import java.awt.*;
/**
* Created by Gagandeep Bali on 7/12/2014.
*/
public class MyDocumentFilter extends DocumentFilter {
@Override
public void insertString(DocumentFilter.FilterBypass fp, int offset,
String stringToFilter, AttributeSet aset)
throws BadLocationException {
int len = stringToFilter.length();
if (Character.isLetter(stringToFilter.charAt(len - 1)))
super.insertString(fp, offset, stringToFilter, aset);
else
Toolkit.getDefaultToolkit().beep();
}
@Override
public void replace(DocumentFilter.FilterBypass fp, int offset, int length,
String stringToFilter, AttributeSet aset)
throws BadLocationException {
int len = stringToFilter.length();
if (Character.isLetter(stringToFilter.charAt(len - 1)))
super.replace(fp, offset, length, stringToFilter, aset);
else
Toolkit.getDefaultToolkit().beep();
}
}
【讨论】:
看起来您在 JTextField 中使用了 KeyListener,如果是这样,请不要这样做,因为您会弄乱 JTextField 函数。而是使用 JFormattedTextField 或给文本字段的 Document 一个 DocumentListener。
编辑
例如:
import java.text.Format;
import java.text.NumberFormat;
import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.PlainDocument;
public class DigitOnlyFieldTest {
private static void createAndShowGui() {
Format digitFormat = NumberFormat.getIntegerInstance();
JFormattedTextField digitField = new JFormattedTextField(digitFormat);
digitField.setColumns(10);
JTextField textField = new JTextField(10);
((PlainDocument) textField.getDocument()).setDocumentFilter(new DocumentFilter() {
@Override
public void insertString(FilterBypass fb, int offset, String text,
AttributeSet attr) throws BadLocationException {
text = text.replaceAll("\\D", "");
super.insertString(fb, offset, text, attr);
}
@Override
public void replace(FilterBypass fb, int offset, int length,
String text, AttributeSet attrs) throws BadLocationException {
text = text.replaceAll("\\D", "");
super.replace(fb, offset, length, text, attrs);
}
});
JPanel mainPanel = new JPanel();
mainPanel.add(new JLabel("Formatted Text Field: "));
mainPanel.add(digitField);
mainPanel.add(new JLabel("Text Field with Doc Filter: "));
mainPanel.add(textField);
JFrame frame = new JFrame("DigitOnlyFieldTest");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
现在这将适用于用户文本输入、复制和粘贴以及基于软件的文本输入。
【讨论】:
试试这个例子,它可能对你有帮助
import java.awt.FlowLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class SwingDemo extends JFrame {
private JTextField textField;
public SwingDemo() {
super("TextField Filter Example By SuRu");
setBounds(100, 100, 500, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new FlowLayout());
getContentPane().add(new JLabel("Accepts Only Digits: "));
textField = new JTextField(40);
getContentPane().add(textField);
textField.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
if (!Character.isDigit(e.getKeyChar())) {
e.consume();
}
}
});
}
public static void main(String[] args) {
new SwingDemo().setVisible(true);
}
}
【讨论】: