我在创建自定义控制台时遇到问题,代码如下:
public class UserConsole {
protected static BlockingQueue<String> inputData;
private final static JTextArea textArea = new JTextArea();
private static JTextField textField = new JTextField("");
private void createGUI() {
final KeyListener returnAction = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyChar() == 'n') {
returnInput();
}
}};
}
private void returnInput() {
//Here is the problem, the BlockingQueue throws a NullPointerException, which is strange, because the...
//...right after "System.out.println(textField.getText());" works perfectly fine.
inputData.offer(textField.getText());
System.setOut(userStream);
System.out.println(textField.getText());
textField.setText("");
System.setOut(nebulaStream);
}
}
我试着在网上搜索,但没有找到任何东西,也试着添加.toString()
,但效果不好。
据我所知,BlockingQueue无法初始化。。。所以我的最后一个问题是。为什么BlockingQueue没有读取JTextField的字符串,以及如何解决它
我希望这不是我错过的明显的事情,感谢每一次帮助!
据我所知,BlockingQueue无法初始化。。。所以我的最后一个问题是,为什么BlockingQueue没有读取JTextField的字符串,以及如何解决它?
我们没有看到代码的一些重要部分,但这里有一些可能的问题。
-
我看不出阻塞队列实际实例化在哪里。也许初始化行应该是这样的:
protected static final BlockingQueue<String> inputData = new LinkedBlockingQueue<>();
-
我们看不到从阻塞队列中删除字符串的位置。如果要检查结果是否已计算,则应使用
poll()
,它将返回null
,直到向阻塞队列提供重置为止。// this will not wait for the result but will return null initially String jtextResult = inputData.poll();
如果需要等待结果,请使用
take()
,但永远不应该在GUI线程上执行此操作,因为UI将暂停,直到计算出结果,而不需要后台线程。