大家好,我正在使用Swing和Apache
Commons开发一个终端应用程序。我能够重定向System.out
和System.err
一个JTextArea
很容易,但我怎么做到这一点的System.in
?我需要重写Inputstream
方法吗?我需要将String
from
转换JTextArea
为byte数组,然后将其传递给InputStream
吗?代码示例会很好。
我最近尝试了同样的事情,这是我的代码:
class TexfFieldStreamer extends InputStream implements ActionListener {
private JTextField tf;
private String str = null;
private int pos = 0;
public TexfFieldStreamer(JTextField jtf) {
tf = jtf;
}
//gets triggered everytime that "Enter" is pressed on the textfield
@Override
public void actionPerformed(ActionEvent e) {
str = tf.getText() + "\n";
pos = 0;
tf.setText("");
synchronized (this) {
//maybe this should only notify() as multiple threads may
//be waiting for input and they would now race for input
this.notifyAll();
}
}
@Override
public int read() {
//test if the available input has reached its end
//and the EOS should be returned
if(str != null && pos == str.length()){
str =null;
//this is supposed to return -1 on "end of stream"
//but I'm having a hard time locating the constant
return java.io.StreamTokenizer.TT_EOF;
}
//no input available, block until more is available because that's
//the behavior specified in the Javadocs
while (str == null || pos >= str.length()) {
try {
//according to the docs read() should block until new input is available
synchronized (this) {
this.wait();
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
//read an additional character, return it and increment the index
return str.charAt(pos++);
}
}
并像这样使用它:
JTextField tf = new JTextField();
TextFieldStreamer ts = new TextFieldStreamer(tf);
//maybe this next line should be done in the TextFieldStreamer ctor
//but that would cause a "leak a this from the ctor" warning
tf.addActionListener(ts);
System.setIn(ts);
自从我编写Java以来已经有一段时间了,所以我可能不了解最新的模式。您可能还应该重载,int available()
但是我的示例仅包含使它与BufferedReader
s readLine()
函数一起工作的最低要求。
编辑: 为了使它起作用,JTextField
您必须使用implements KeyListener
而不是,implements ActionListener
然后addKeyListener(...)
在TextArea上使用。您需要代替的功能actionPerformed(...)
是public void keyPressed(KeyEvent e)
,然后您必须进行测试,if (e.getKeyCode() == e.VK_ENTER)
而不是使用整个文本,而只需使用游标前最后一行的子字符串即可,
//ignores the special case of an empty line
//so a test for \n before the Caret or the Caret still being at 0 is necessary
int endpos = tf.getCaret().getMark();
int startpos = tf.getText().substring(0, endpos-1).lastIndexOf('\n')+1;
输入字符串。因为否则,您每次按Enter时都将读取整个TextArea。
问题内容: 我在cyberciti.biz的评论中看到了这个有趣的问题。 我发现我什至找不到在sh的单行命令中执行此操作的灵活方法。 到目前为止,我对解决方案的想法是: 但是您会看到,这不是同步的,而且致命的是,它是如此丑陋。 欢迎与您分享这个想法。:) 问题答案: 你要 这里的顺序很重要。假设stdin(fd 0),stdout(fd 1)和stderr(fd 2)最初都连接到tty,因此 首先
问题内容: 我有一个扩展了并包含的类(如下所示)。我想重定向和我。我的课似乎没用。当我运行它时,它会重定向系统打印,但不会将它们打印到我的。请帮忙! 注意: 仅在应用程序启动时才重定向呼叫。但是,启动后的任何时间都不会将呼叫重定向到。(即,如果我将a放置在类中,它将被调用,但是如果将其放置在a中以供以后使用,则它不会重定向)。 问题答案: 管道流总是使我感到困惑,这就是为什么我的Message C
我想问一下HTTP到HTTPS的重定向。正如我们所知,重定向是通过从web服务器端重定向来实现的。但是,当涉及到https重定向时,它可以通过两种方式完成,服务器端()和应用程序端()。我想知道: 以下哪种方法有效且性能更好。 考虑到同一服务器上的多个域和域,每种方法的优缺点 非常感谢。 参考: 将Laravel中的WWW重定向到非WWW-堆栈溢出
问题内容: 我想使用PHP将所有www.domain.com请求重定向到domain.com,基本上是: 但是我确实想像SO中那样维护请求的URL,例如: 应该重定向到: 我不想依靠解决方案,并且我不确定要使用哪种变体来实现这一目标。同样,保留HTTPS协议将是一个加号。 我应该怎么做? 问题答案: 将用户重定向到完全相同的页面,www。完整。 因此,要摆脱www。,我们只需替换一行: 那应该起作
我们使用拉维5。要将http连接重定向到https,请使用中间件HttpsProtocol。 在我们的4个测试用例中,只有1个正确工作(最后一个重定向)。其他3种情况的中间件添加了url extra index.php。 http://www.aqualink.az/index.php ---
问题内容: 我正在AIX 6上工作,在KIX Shell上运行Java命令,并且正在尝试调试类加载问题。我放了-verbose:class来打印加载的类,然后>> / home / user / log.log将控制台放到一个文件中。已创建log.log文件,但其大小为零。文件不包含任何信息,所有详细信息都在一闪而过。 问题答案: 也尝试重定向: 您的Java代码可能正在编写您的命令未重定向的信息