在项目上工作我通过类似控制台的小窗口运行java应用程序。感谢这里精彩的社区,我设法solve the problem with outputting the data from a proccess但我的命令行应用程序运行会不断出错,因为没有输入流。
根据该主题中的最后一个有用的回复,我想我将同样接近JTextFieldInputStream extends InputStream
实现,但是查看javadocs以及整个谷歌和互联网上的某些类,我真的没有找到解释如何去做这个。
所以我要求一些链接,示例,教程,示例代码,就像上一个主题一样。 给我一个扩展InputStream的类,当我按Enter键时可以扩展为从JTextField读取,我将完成其余的工作并使其工作!提前谢谢!
答案 0 :(得分:9)
我不明白为什么你需要一个扩展InputStream的JTextField?基本上,你在寻找的是:
ActionListener
上添加JTextField
(即,当使用按 Enter 时,将调用actionPerformed
)text
getText()
String text
InputStream
“转换”为new ByteArrayInputStream(text.getBytes("UTF-8"));
醇>
这是一个小小片段,可以帮助您了解基本知识:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class TestTextField {
private void initUI() {
JFrame frame = new JFrame(TestTextField.class.getSimpleName());
frame.setLayout(new FlowLayout());
final JTextField textfield = new JTextField(20);
textfield.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
String text = textfield.getText();
InputStream is = new ByteArrayInputStream(text.getBytes("UTF-8"));
// Here do something with your input stream (something non-blocking)
System.err.println(text);
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
}
});
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(textfield);
frame.setSize(300, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestTextField().initUI();
}
});
}
}
答案 1 :(得分:2)
这个实现怎么样
import java.io.IOException;
import java.io.InputStream;
import javax.swing.JTextField;
public class JTextFieldInputStream extends InputStream {
byte[] contents;
int pointer = 0;
public JTextFieldInputStream(final JTextField text) {
text.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyChar()=='\n'){
contents = text.getText().getBytes();
pointer = 0;
text.setText("");
}
super.keyReleased(e);
}
});
}
@Override
public int read() throws IOException {
if(pointer >= contents.length) return -1;
return this.contents[pointer++];
}
}
要使用此输入流,请执行以下操作
InputStream in = new JTextFieldInputStream( someTextField );
char c;
while( (c = in.read()) != -1){
//do whatever with c
}
只有当我点击进入时它才能读取吗?
当你致电in.read()
时,如果返回值-1
表示流的结尾
(并且我能够修改以便Enter键清空JTextField吗?)
您需要添加一个动作侦听器,此功能与输入流
的作业无关