我曾经JFormattedTextField用NumberFormat这种方式:
-Creat一个JFormattedTextFieldrefernce
JFormattedTextField integerField;
Run Code Online (Sandbox Code Playgroud)
-创建NumberFormatrefernce
NumberFormat integerFieldFormatter;
Run Code Online (Sandbox Code Playgroud)
- 在构造函数中:
integerFieldFormatter = NumberFormat.getIntegerInstance();
integerFieldFormatter.setMaximumFractionDigits(0);
integerField = new JFormattedTextField(integerFieldFormatter );
integerField.setColumns(5);
Run Code Online (Sandbox Code Playgroud)
..........
我打算只使用整数,但是当我键入1500之类的数字时,它会在失去焦点后转换为1,500,抛出异常这是它的第一行:
线程"AWT-EventQueue-0"中的异常java.lang.NumberFormatException:对于输入字符串:"1,500"
当我使用JTextField而不是JFormattedTextField正常接受的所有整数时,但我想要使用的原因JFormattedTextField是受益于其输入限制优势.
我正在做这个任务,制作一个解决数独的程序.我有一个带有SudokuTextBox网格的面板,扩展了JFormattedTextField.我有一个MaskFormatter,因此每个文本框只接受一个整数.然后在我的面板中,当密钥被释放时,我有这个代码.
public void keyReleased(KeyEvent e) {
SudokuTextBox tb = (SudokuTextBox) e.getSource();
int row = tb.getRow();
int col = tb.getCol();
int value = toInteger(tb.getText());
//System.out.println(value);
if(sudoku.isValid(row, col, value)) {
sudoku.set(row, col, value);
}
else {
sudoku.set(row, col, 0);
tb.setText(null);
}
tb.setCaretPosition(0);
sudoku.print();
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果我在文本框中放一个有效的值,然后我回去(由数独的规则),输入无效值的文本框被清除.但是当我向前选项卡时,前一个有效值显示在文本框中.我sudokumatrix包含所有已inputed不明确的价值像它应该这样,只有在相应的文本框中的数字.
当我将"SudokuTextBox扩展JFormattedTextField"更改为"SudokuTextBox extends JTextField"时,它更加令人困惑,它就像一个魅力.但我不能设置JTextField的大小,以便它是正方形,我不能强制每个文本框只有一个整数.
我错过了一些非常明显的东西吗
我有一个特定任务所需的估计时间,以分钟为单位.我怎么能把它放在一个JFormattedTextField的格式HH:mm:ss?
我想使用JFormattedTextField将浮点数格式化为百分比值,允许输入从0到100%(转换为0.0f-1.0f),始终显示百分号并禁止任何无效字符.
现在我用NumberFormat.getPercentInstance()和NumberFormatter属性进行了一些实验,但没有成功.
有没有办法创建一个遵循标准类遵守这些规则的JFormattedTextField?或者我必须实现自己的NumberFormatter?
这就是我到目前为止(无法输入100%,输入0完全打破它):
public class MaskFormatterTest {
public static void main(String[] args) throws Exception {
JFrame frame = new JFrame("Test");
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
NumberFormat format = NumberFormat.getPercentInstance();
NumberFormatter formatter = new NumberFormatter(format);
formatter.setMaximum(1.0f);
formatter.setMinimum(0.0f);
formatter.setAllowsInvalid(false);
formatter.setOverwriteMode(true);
JFormattedTextField tf = new JFormattedTextField(formatter);
tf.setColumns(20);
tf.setValue(0.56f);
frame.add(tf);
frame.pack();
frame.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud) 我有这个代码,无法得到MaskFormatter正确的
maskformatter
MaskFormatter formatter = null;
try {
formatter = new MaskFormatter("HHHHHHH");
} catch (ParseException e) {
e.printStackTrace();
}
txtTroll = new JFormattedTextField(formatter);
Run Code Online (Sandbox Code Playgroud)
我需要任何十六进制字符(0-9,az或AZ)和"H"应该
只给我(0-9,az或AZ),但我错了.
当我输入文字时,只输入大写字母并且它很慢
,当我点击txtTroll所有字母时,它会消失
在我的应用程序中,我想将数字(金额)输入到特定限制,因此使用了JFormattedTextField.限制为"12345678.99",即"."之前的8位数.和"."之后的2.等等.这是我的实现代码,但它没有按预期结果.
startBalTxt.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("########.##"))));
startBalTxt.setText(resourceMap.getString("startBalTxt.text")); // NOI18N
startBalTxt.setFont(Utility.getTextFont());
startBalTxt.setName("startBalTxt"); // NOI18N
Run Code Online (Sandbox Code Playgroud)
INPUT RESULT
"12345678905.99" => "12345678906" ==> Should give "12345678.99" or "12345679.99"
"12345678.555" => "12345678.56" ==> CORRECT
"1234567890123456" => "1234567890123456" ==> Absolutely wrong in all aspects
Run Code Online (Sandbox Code Playgroud)
我哪里错了?以及如何使这个工作,因为我期待它.
StanislavL建议的更新:
numberFormat = (DecimalFormat) DecimalFormat.getNumberInstance();
numberFormat.setMaximumFractionDigits(2);
numberFormat.setMaximumIntegerDigits(8);
numberFormat.setMinimumFractionDigits(0);
numberFormat.setMinimumIntegerDigits(2);
nfr = new NumberFormatter(numberFormat);
initComponents();
myParent = parent;
this.startBalTxt.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(nfr));
Results -> 4562147896.45 == > 62,147,896.45
Run Code Online (Sandbox Code Playgroud)
它遵守了真正的限制,但它消除了以前的数字而不是以后的数字.我的意思是在4562147896.45而不是"45""96"不应该被淘汰.
我使用了以下链接中的信息来显示特定区域设置的货币格式:
如何在运行时更改JFormattedTextField的格式?
但是在更改区域设置时格式不会改变.
这是代码.
package testapp;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Locale;
import javax.swing.DefaultComboBoxModel;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.NumberFormatter;
/**
*
* @author Sanjeev
*/
public class JFormattedTextFieldAndCurrency extends javax.swing.JFrame {
private class LocaleInfo implements Comparable<LocaleInfo> {
private Locale locale;
public Locale getLocale() {
return locale;
}
public void setLocale(Locale locale) {
this.locale = locale; …Run Code Online (Sandbox Code Playgroud) 我有一个JFormattedTextField应该能够接受超过3位十进制数字的双数字.它接受条目0.1,0.01,0.001但拒绝0.0001和数字与十进制数字.
这就是我的代码现在的工作方式:
DecimalFormat decimalFormat = new DecimalFormat("0.0E0");
JFormattedTextField txtfield = new JFormattedTextField(decimalFormat.getNumberInstance(Locale.getDefault()));
Run Code Online (Sandbox Code Playgroud)
如何让我的文本字段接受超过3位十进制数字的数字?
我正在使用 JFormattedTextField,当我尝试删除字段中的值时,它会自动恢复以前的值。这种行为的原因是什么?我怎样才能阻止它恢复价值?
这是 JFormattedtextField 的代码。
jFormattedTextField2 = new javax.swing.JFormattedTextField(new DecimalFormat("###,###.##"));
Run Code Online (Sandbox Code Playgroud) 将 MaskFormatter 应用到 JFormattedTextField 上,然后将该文本字段设置为 JTable 中的一列后,无论我单击什么位置,插入符号都开始出现。但是,我希望插入符号出现在单元格的最左侧位置,无论用户单击单元格中的哪个位置。我尝试了 setCaretPositionMethod,但它什么也没做。我的猜测是,有某种表侦听器,它强制插入符移动到用户单击的位置,如果我知道这个侦听器是什么,我可以覆盖该功能。
SSCCE:
public class TableExample extends JFrame {
public TableExample() {
add(makeTable());
}
private JTable makeTable() {
Object[][] tableData = {{"","a","b",""}, {"","c","d",""}};
String[] columns = {"column1", "column2", "column3", "dobColumn"};
JTable table = new JTable(tableData, columns);
////DOB column formats to dd/mm/yy
TableColumn dobColumn = table.getColumnModel().getColumn(3);
DateFormat df = new SimpleDateFormat("dd/mm/yy");
JFormattedTextField tf = new JFormattedTextField(df);
tf.setColumns(8);
try {
MaskFormatter dobMask = new MaskFormatter("##/##/##");
dobMask.setPlaceholderCharacter('0');
dobMask.install(tf);
} catch (ParseException ex) {
Logger.getLogger(TableExample.class.getName()).log(Level.SEVERE, null, ex);
} …Run Code Online (Sandbox Code Playgroud) java ×10
swing ×9
jtextfield ×2
caret ×1
formatting ×1
integer ×1
jtable ×1
keyevent ×1
locale ×1
sudoku ×1
time ×1
validation ×1