我试图实现一个简单的程序,在我的案例中称为进程的某个对象的用户输入,我想将它们存储在一个进程数组中。 我将从一开始就从用户那里获取数组大小并初始化数组。
问题是我无法找到一种获取用户输入的方法,将进程扩展到数组大小的最佳jcomponent是什么?
我尝试使用jTextArea和我的代码来读取输入 对象进程初始化为两个数字我要求用户在一个单独的行中输入每个进程,然后将这两个数字拆分为' /'
I
如果我的代码中有任何可以更改的内容,它会显示空指针异常的错误?或者你有更好的方法吗?
答案 0 :(得分:0)
问题是我无法想出一种获取用户输入的方法,将进程增加到数组大小的最佳jcomponent是什么?
没有最好的组件可以接收输入。组件的用例因上下文而异。在您的情况下,您只想接收数字值。您可以为此目的设置文档过滤器,如此处所述。
https://stackoverflow.com/questions/7632387/jtextarea-only-with-numbers-but-allowing-negative-values
然后,您可以创建按钮并在其上配置单击侦听器,然后检索jTextarea值,然后根据您的要求进一步处理它。
我已将整个过程汇总到这个简单的代码段中。您可以根据需要进行修改。
DocumentFilter阻止用户输入文字和负整数
import javax.swing.text.*;
import java.util.regex.*;
public class PositiveNumberOnlyFilter extends DocumentFilter
{
@Override
public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException
{
StringBuilder sb = new StringBuilder();
sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
sb.insert(offset, text);
if(!containsOnlyNumbers(sb.toString())) return;
fb.insertString(offset, text, attr);
}
@Override
public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attr) throws BadLocationException
{
StringBuilder sb = new StringBuilder();
sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
sb.replace(offset, offset + length, text);
if(!containsOnlyNumbers(sb.toString())) return;
fb.replace(offset, length, text, attr);
}
public boolean containsOnlyNumbers(String text)
{
Pattern pattern = Pattern.compile("^[1-9]\\d*$");
Matcher matcher = pattern.matcher(text);
boolean isMatch = matcher.matches();
return isMatch;
}
}
演示主类
import javax.swing.*;
import java.awt.event.*;
import javax.swing.text.AbstractDocument;
import javax.swing.text.DocumentFilter;
public class SimpleNumberOnlyTextAreDemo implements ActionListener {
JLabel labelOne;
JTextArea textArea;
JButton button;
SimpleNumberOnlyTextAreDemo() {
JFrame f = new JFrame();
labelOne = new JLabel();
labelOne.setBounds(50, 25, 200, 30);
textArea = new JTextArea();
textArea.setBounds(50, 75, 200, 25);
button = new JButton("Click To Create Array");
button.setBounds(50, 150, 200, 30);
button.addActionListener(this);
f.add(labelOne);
f.add(textArea);
f.add(button);
f.setSize(350, 350);
f.setLayout(null);
f.setVisible(true);
DocumentFilter onlyNumberFilter = new AxisJTextFilter();
((AbstractDocument) this.textArea.getDocument()).setDocumentFilter(onlyNumberFilter);
}
@Override
public void actionPerformed(ActionEvent e) {
String text = textArea.getText();
labelOne.setText("Input is := " + text);
}
public static void main(String[] args) {
SimpleNumberOnlyTextAreDemo simpleNumberOnlyTextAreDemo = new SimpleNumberOnlyTextAreDemo();
}
}