我一直在学习更多与Java相关的知识。然而,我遇到了一个问题,我不知道如何解决它。
我有我的程序的一部分(显示在下面,但不相关的代码已经被删除),除了JFormattedTextField变量(sliderField)之外,一切都可以工作。我想要做的是,如果一个值被输入到大于5000的sliderField中,并且面板刷新(已经在其他地方完成了),则字段将更改为5000。但是,由于某些原因,actionPerformed似乎没有在我的JFormattedTextField中注册任何类型的更改,也阻止了变量的更改。
这是我的代码:
public class testMenu extends JPanel implements ActionListener, ChangeListener {
public testMenu(GUI p) {
parent = p;
setLayout(new FlowLayout(FlowLayout.LEFT, 10, 0));
createPanel();
setVisible(true);
}
public void createPanel() {
createOptions();
}
private void createOptions() {
options[0] = new JPanel();
add(options[0]);
options[1] = new JPanel();
add(options[1]);
options[2] = new JPanel();
add(options[2]);
options[3] = new JPanel();
add(options[3]);
options[4] = new JPanel();
add(options[4]);
slider = new JSlider(0, 5000, 0);
slider.setPaintTicks(true);
slider.setValue(parent.variable);
slider.addChangeListener(this);
sliderField = new JFormattedTextField(NumberFormat.getInstance());
sliderField.setText(Integer.toString(parent.variable));
sliderField.setColumns(4);
sliderField.addActionListener(this);
options[5] = new JPanel();
options[5].add(new JLabel("Slider Value:"));
options[5].add(slider);
options[5].add(sliderField);
options[5].setVisible(false);
add(options[5]);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == sliderField) {
int size = Integer.parseInt(sliderField.getText());
System.out.println(size);
if (size > 5000) {
sliderField.setText("5000");
size = 5000;
}
parent.setVariable("" + size);
}
}
private GUI parent;
private JSlider slider;
private JFormattedTextField sliderField;
private JPanel[] options = new JPanel[5];
}我的问题很简单:为什么actionPerformed不注册在JFormattedTextField上执行的任何操作,以及如何修复它?
另外,我如何设置我的JFormattedTextField,以便如果值大于999,则不添加逗号(防止1000显示为1,000)?
发布于 2013-12-24 22:56:36
要去掉逗号,只需使用不允许它们的格式化程序即可。例如,
NumberFormat format = NumberFormat.getInstance();
format.setGroupingUsed(true); // *** set it so it doesn't use a grouping ***
final JFormattedTextField formattedField = new JFormattedTextField(format);
formattedField.setColumns(10);至于你的另一个问题,如果你得到和设置的值而不是文本呢?
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class TestJFormattedText {
public static void main(String[] args) {
NumberFormat format = NumberFormat.getNumberInstance();
format.setGroupingUsed(false);
final JFormattedTextField formattedField = new JFormattedTextField(format);
formattedField.setColumns(10);
formattedField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
long value = ((Long)formattedField.getValue()).longValue();
if (value > 5000) {
formattedField.setValue(5000);
}
}
});
JPanel panel = new JPanel();
panel.add(formattedField);
JFrame frame = new JFrame("Foo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}使用值的一个优点是,如果JFormattedTextField持有的文本不合适,则避免使用烦人的JFormattedTextField,而不符合格式化程序。
顺便说一句,您在问题中发布的代码包含了大量与您的问题无关的代码,没有为我们编译或运行。将来,考虑只发布显示问题和允许代码运行所需的代码,就像我在上面发布的一样。
编辑
你要评论一下,
如何才能使actionEvent执行时不需要按“Enter”键?
您不能这样做,因为这就是ActionListeners对JTextFields和从JTextFields派生的类的工作方式。如果您想在JFormattedTextField文档本身显示之前修改该字段的内容,我想您可以在JFormattedTextField文档中添加一个DocumentFilter,但是虽然我在JTextFields中使用了这些内容,但我从未将它们用于与JFormattedTextFields一起使用的文档,并且不能说我从经验中知道这是可行的。
https://stackoverflow.com/questions/20767518
复制相似问题