GUI添加用户输入到数组

问题描述:

我想实现一个简单的程序,在我的情况下称为进程的某个对象需要用户输入,并且我想将它们存储在一个进程数组中。 我会在开始时从用户处获取数组大小并初始化数组。GUI添加用户输入到数组

问题是我找不到一种方法来接受用户输入,什么是最好的jcomponent将采取进程的数组大小?

我尝试使用的JTextArea和这里我的代码,用于读取输入 对象进程被初始化具有两个编号i问用户在分开线进入每个过程,并用“/”

int size = Integer.parseInt(this.jTextPane1.getText()); 
processes = new process[size]; 
for (int i=0; i<processes.length; i++) { 
    processes[i] = new process(
     (i+1), 
     Integer.parseInt(line[i].substring(0, line[i].indexOf('/'))), 
     Integer.parseInt(line[i].substring(line[i].indexOf('/')+1))); 
} 
分裂两个数

它显示空指针的错误异常,如果有任何事情,我可以改变我的代码?或者你有更好的方法吗?

+1

你调试和检查什么是空?你确定用户只能输入“号码/号码”还是检查他是否做到了? – Thomas

+0

可能的重复[什么是NullPointerException,以及如何解决它?](http://*.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it ) – f1sh

+0

将太复杂的行拆分为几个基本的行,对indexOf的结果使用局部变量并逐步进行调试,或使用System.err.println打印局部变量的值 编写一个专用于解析字符串有很多不同的输入,因为它们可能有误(用户输入) – Aubin

问题是我找不到一种方法来接受用户输入,什么是最好的jcomponent将采取进程的数组大小?

没有任何东西像接收输入的最佳组件。组件的用例因上下文而异。在你的情况下,你只想收到数字值。您可以按照此处所述为此设置文档过滤器。

https://*.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(); 
    } 
}