gpt4 book ai didi

java - JFrame 使用不同的 System.in 卡住

转载 作者:行者123 更新时间:2023-12-01 13:42:41 25 4
gpt4 key购买 nike

任何人都可以告诉我为什么TryGraphic在第一个main()中用扫描仪卡住JFrame?如果我删除 Scanner 或直接执行代码,则一切正常。 (原始的“Try”类显然做了很多不同的事情。我编写这些类是为了使其简单。)

import java.util.Scanner;


public class Try {

public Try(){

}

public static void main(String[] args){
System.out.println("FOO");
String s = new Scanner(System.in).nextLine();
System.out.println(s);
}
}

这是图形实现:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingWorker;


public class TryGraphic extends JFrame{

/**
*
*/
private static final long serialVersionUID = 7491282237007954227L;



private JButton execute = new JButton("Esegui");

private PipedInputStream inPipe = new PipedInputStream();
private PipedInputStream outPipe = new PipedInputStream();
private JTextField tfIn = new JTextField();
private JTextArea outputArea = new JTextArea();

private PrintWriter inWriter;


public TryGraphic(){
super("TRY");

System.setIn(inPipe);

try {
System.setOut(new PrintStream(new PipedOutputStream(outPipe), true));
inWriter = new PrintWriter(new PipedOutputStream(inPipe), true);
}catch (IOException ioe){
ioe.printStackTrace();
}

tfIn.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent event){
String text = tfIn.getText();
tfIn.setText("");
inWriter.println(text);
}
});

this.add(execute,BorderLayout.SOUTH);
this.add(new JScrollPane(outputArea),BorderLayout.CENTER);
this.add(tfIn, BorderLayout.NORTH);

execute.addActionListener(new ActionListener(){

@Override
public void actionPerformed(ActionEvent e) {

SwingWorker<Void,String> worker = new SwingWorker<Void, String>() {
protected Void doInBackground() throws Exception {
Scanner s = new Scanner(outPipe);
while (s.hasNextLine()) {
String line = s.nextLine();
publish(line);

}
return null;
}

@Override
protected void process(java.util.List<String> chunks) {
for (String line : chunks){
outputArea.append(line+System.lineSeparator());
outputArea.validate();
}

}
};

worker.execute();

Try.main(new String[]{""});
}

});

this.setSize(300,300);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


}



public static void main(String[] args){
new TryGraphic();
}
}

最佳答案

您正在阻塞 GUI 事件调度线程。您需要生成一个单独的线程来等待输入,以便保持 GUI 的响应能力。

通过创建一个 SwingWorker 来处理 TryGraphic 类中的 I/O,您已经做了正确的事情。您应该执行类似的操作来移动 Try.main(new String[]{""}); 调用关闭事件调度线程,这将使您的 JFrame 免于锁定。

关于java - JFrame 使用不同的 System.in 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20586584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com