首先,我知道我之前曾问过类似的问题,但这个问题有所不同.我正在尝试制作一个计算器,使得在文本字段中输入的所有数字的算术平均值都是可编辑的.我有大约25个文本字段,但一次只能编辑14-16个.用户有3个jspinner来添加或删除程序中已有的一些可编辑文本字段.我的问题是,如何从这些文本字段中检查哪些文本字段可以编辑并操纵数据?
出于审核目的,这个问题与另一个问题不同.在另一个问题中,我根本不具体,而且情况有所不同,所以请保持开放,我需要帮助.
我正在尝试创建一个只接受数字的JSpinner,但我也想让它读取/响应退格.
public class test {
JFrame frame;
JPanel panel;
JSpinner spinner;
public test()
{
frame = new JFrame("test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(200,200));
panel = new JPanel();
SpinnerNumberModel numSpin = new SpinnerNumberModel(10, 0,1000,1);
spinner = new JSpinner(numSpin);
JFormattedTextField txt = ((JSpinner.NumberEditor) spinner.getEditor()).getTextField();
((NumberFormatter) txt.getFormatter()).setAllowsInvalid(false);
panel.add(spinner);
frame.setContentPane(panel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args)
{
test test = new test();
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码只能编号,但这不允许我退格.我在这个网站上找到了一些例子,但是他们是为C写的.
我正在尝试使用JFrameSwing 构建一个Java应用程序,我有5个JTextField实例.其中一个是Sum.
我需要JTextField在文本字段中输入一些数字后立即自动更改.
怎么可能?
我写的是这里.
private void displaytotalActionPerformed(java.awt.event.ActionEvent evt) {
// display total:
Float num1,num2,num3,num4,num5,num6,result;
num1 = display1b.getText().equals("") ? 0 : Float.parseFloat(display1b.getText());
num2 = display2b.getText().equals("") ? 0 : Float.parseFloat(display2b.getText());
num3 = display3b.getText().equals("") ? 0 : Float.parseFloat(display3b.getText());
num4 = display4b.getText().equals("") ? 0 : Float.parseFloat(display4b.getText());
num5 = display5b.getText().equals("") ? 0 : Float.parseFloat(display5b.getText());
num6 = display6b.getText().equals("") ? 0 : Float.parseFloat(display6b.getText());
result = num1+num2+num3+num4+num5+num6;
System.out.println(result);
}
Run Code Online (Sandbox Code Playgroud)
我试图获得总和并使用按钮在此文本字段中显示它并且它工作.但我希望它能自动完成.但上面的代码在textfield上没有显示任何内容.
我对此很陌生,如果你能引导,我感激不尽.
是否有某种方法可以检测是否取消选择了JTextField,即选择了WAS字段,但现在您已经选择了其他内容.我想这样做的原因是因为我想在用户表单中检查任何非法字符,然后才会尝试提交数据.如果有一些更容易的方法,而不是我试图解决它的方式,我会很乐意接受启蒙.
我想创建支持非整数值的JSpinner,例如2.01和-3.456,因此getValue()返回一个Double.
不仅如此,我希望步长应该是动态的,使用类似下面的公式(10%的大小):
stepSize = 0.1 * pow(10, round( log(currentValue) ));
Run Code Online (Sandbox Code Playgroud)
可能吗?或者我应该问,麻烦值得吗?
通过改编Vishal的答案,我制作了以下课程来制作漂亮的双旋转器.到目前为止,他们已经证明在我的程序中工作得很好,尽管我会将自适应步长抽象到另一个父类中,以便我可以在以后制作AdaptiveDoubleSpinners和AdaptiveIntegerSpinners.
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class DoubleSpinner extends JSpinner {
private static final long serialVersionUID = 1L;
private static final double STEP_RATIO = 0.1;
private SpinnerNumberModel model;
public DoubleSpinner() {
super();
// Model setup
model = new SpinnerNumberModel(0.0, -1000.0, 1000.0, 0.1);
this.setModel(model);
// Step recalculation
this.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
Double value = getDouble();
// Steps are sensitive to …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我想将数字(金额)输入到特定限制,因此使用了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"不应该被淘汰.