我一直在学习与Java GUI有关的知识。但是,我遇到了一个问题,我不确定如何修复它。
我有我的程序的一部分(显示如下,但不相关的代码已被删除),除了JFormattedTextField变量(sliderField)之外的所有内容都有效。我想要做的是,如果在sliderField中输入一个大于5000的值,并且面板刷新(已在其他地方完成),则该字段将更改为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)?
答案 0 :(得分:3)
要删除逗号,只需使用不允许它们的格式化程序。如,
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保存的文本不合适,则可以避免讨厌的NumberFormatExceptions,不符合格式化程序。
顺便说一句,您的问题中发布的代码包含与您的问题无关的相当多的代码,并且不会为我们编译或运行。将来,请考虑仅发布显示问题所需的代码并允许代码运行,就像我上面发布的那样。
修改强>
你在评论中提问,
我怎样才能这样做,所以我不需要点击'Enter'来执行actionEvent?
你不能像ActionListeners那样为JTextFields和从JTextFields派生的类工作。我想你可以在JFormattedTextField的文档中添加一个DocumentFilter,如果你想在它自身显示之前弄乱字段的内容,但是当我将它们与JTextFields一起使用时,我从未使用它们与JFormattedTextFields一起使用的文档,并且不能说我从经验中知道这将起作用。