Java 如何获取终端结果并设置JTextArea来读取终端?
我最近完成了一个GUI,用户可以在其中输入标准,并获得符合上述条件的结果。该程序的工作结果是明智的,但我在GUI中获取文本字段以读取终端窗口结果时遇到问题。我的GUI代码如下所示:Java 如何获取终端结果并设置JTextArea来读取终端?,java,swing,user-interface,jtextarea,Java,Swing,User Interface,Jtextarea,我最近完成了一个GUI,用户可以在其中输入标准,并获得符合上述条件的结果。该程序的工作结果是明智的,但我在GUI中获取文本字段以读取终端窗口结果时遇到问题。我的GUI代码如下所示: package project205; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class HouseListGUI extends JFrame { //GUI Components HouseList
package project205;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class HouseListGUI extends JFrame
{
//GUI Components
HouseList availableHouses = new HouseList("src/houses.txt");
JLabel cLab = new JLabel("Criteria");
JLabel minLab = new JLabel("Min");
JLabel maxLab = new JLabel("Max");
JLabel pLab = new JLabel("Price");
JLabel aLab = new JLabel("Area");
JLabel bLab = new JLabel("Bedrooms");
JTextField pMin = new JTextField(10);
JTextField pMax = new JTextField(10);
JTextField aMin = new JTextField(10);
JTextField aMax = new JTextField(10);
JTextField bMin = new JTextField(10);
JTextField bMax = new JTextField(10);
JTextArea results = new JTextArea(20, 40);
JButton sButton = new JButton("Search");
JButton qButton = new JButton("Quit");
public HouseListGUI()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400,300);
setVisible(true);
Container c = getContentPane();
c.setLayout(new GridLayout(5,3,10,10));
c.add(cLab);
c.add(minLab);
c.add(maxLab);
c.add(pLab);
c.add(pMin);
c.add(pMax);
c.add(aLab);
c.add(aMin);
c.add(aMax);
c.add(bLab);
c.add(bMin);
c.add(bMax);
c.add(sButton);
c.add(results);
c.add(qButton);
sButton.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String pmn = pMin.getText();
String pmx = pMax.getText();
String amn = aMin.getText();
String amx = aMax.getText();
String bmn = bMin.getText();
String bmx = bMax.getText();
int pmn1 = Integer.parseInt(pmn);
int pmx1 = Integer.parseInt(pmx);
int amn1 = Integer.parseInt(amn);
int amx1 = Integer.parseInt(amx);
int bmn1 = Integer.parseInt(bmn);
int bmx1 = Integer.parseInt(bmx);
Criteria theCriteria = new Criteria(pmn1, pmx1, amn1, amx1, bmn1, bmx1);
availableHouses.printHouses(theCriteria);
results.setText("");
}
});
qButton.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
}
);
}
public static void main(String[] args)
{
//HouseList availableHouses = new HouseList("src/houses.txt");
HouseListGUI g1 = new HouseListGUI();
g1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
g1.setSize(1000,500);
g1.show();
}
}
我想要代码行的结果
可用房屋。印刷厂(标准);
返回类型void
要在文本区域中打印
结果
我尝试使用类型转换将空白转换为字符串,并将其转换为结果,即:
results.setText((String)availableHouses.printHouses(theCriteria);
但是Java没有这样的功能
TL;医生:
如何将void类型的方法调用产生的终端作为类型字符串打印到GUI上下文中的textArea中
进一步澄清:
我的终端窗口如下所示:
我的GUI如下所示:
<>我希望我的终端在最后一行的中间框。< /P>
谢谢你的建议/提示
我尝试使用类型转换将空白转换为字符串,并将其转换为结果,即:
results.setText((String)availableHouses.printHouses(theCriteria);
不,那是行不通的,你是在倒退。最好让HouseList的printhouse(…)
方法返回一个字符串,这样就可以轻松地在JTextArea中显示该字符串,而无需修改,当然也不会出现错误的强制转换
否则,如果您必须从另一个控制台程序获得标准输出,并且不能以任何方式进行更改,则必须使用ProcessBuilder在单独的进程(如果是Java程序,则在作为进程运行的单独JVM中)中调用它,然后从该进程捕获InputStream,并将其输出到JTextArea中。这是可以做到的,但需要使用后台线程和异常捕获,我不建议初学者深入研究
我尝试使用类型转换将空白转换为字符串,并将其转换为结果,即:
results.setText((String)availableHouses.printHouses(theCriteria);
不,那是行不通的,你是在倒退。最好让HouseList的printhouse(…)
方法返回一个字符串,这样就可以轻松地在JTextArea中显示该字符串,而无需修改,当然也不会出现错误的强制转换
否则,如果您必须从另一个控制台程序获得标准输出,并且不能以任何方式进行更改,则必须使用ProcessBuilder在单独的进程(如果是Java程序,则在作为进程运行的单独JVM中)中调用它,然后从该进程捕获InputStream,并将其输出到JTextArea中。它是可以做到的,但需要使用后台线程和异常捕获,我不建议初学者深入研究。您可以通过提供自己的
输出流来捕获并重定向发送到System.out
。这是一个万无一失的解决方案,因为打印到标准输出的任何内容都将被捕获,但您可以根据需要打开或关闭
我曾在没有日志文件调试语句的应用程序中使用此窗口作为调试窗口,并过滤和停止生成任何输出的System.out
在这个例子中,我使用
PrintStream ps = System.out;
System.setOut(new PrintStream(new StreamCapturer(capturePane, ps)));
doSomeProcessing();
System.setOut(ps);
要启动和停止捕获System.out
,您可以在StreamCapturer
中放置一个标志,打开和关闭回声功能,这可能是解决问题的更好方法
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class RediretStdOutTest {
public static void main(String[] args) {
new RediretStdOutTest();
}
public RediretStdOutTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
final CapturePane capturePane = new CapturePane();
JButton processButton = new JButton("Process");
processButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Look at me, I'm not in your UI");
PrintStream ps = System.out;
System.setOut(new PrintStream(new StreamCapturer(capturePane, ps)));
doSomeProcessing();
System.setOut(ps);
System.out.println("Neither am I");
}
});
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(capturePane);
frame.add(processButton, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
protected void doSomeProcessing() {
for (int index = 0; index < 10; index++) {
System.out.println("--> " + index);
}
}
public class CapturePane extends JPanel implements Consumer {
private JTextArea output;
public CapturePane() {
setLayout(new BorderLayout());
output = new JTextArea(10, 20);
add(new JScrollPane(output));
}
@Override
public void appendText(final String text) {
if (EventQueue.isDispatchThread()) {
output.append(text);
output.setCaretPosition(output.getText().length());
} else {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
appendText(text);
}
});
}
}
}
public interface Consumer {
public void appendText(String text);
}
public class StreamCapturer extends OutputStream {
private StringBuilder buffer;
private Consumer consumer;
private PrintStream old;
public StreamCapturer(Consumer consumer, PrintStream old) {
buffer = new StringBuilder(128);
this.old = old;
this.consumer = consumer;
}
@Override
public void write(int b) throws IOException {
char c = (char) b;
consumer.appendText(Character.toString(c));
old.print(c);
}
}
}
导入java.awt.BorderLayout;
导入java.awt.EventQueue;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.io.IOException;
导入java.io.OutputStream;
导入java.io.PrintStream;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextArea;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类重读测试{
公共静态void main(字符串[]args){
新的RediretStdOutTest();
}
公共RediretStdOutTest(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
最终CapturePane CapturePane=新CapturePane();
JButton processButton=新JButton(“进程”);
processButton.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
System.out.println(“看着我,我不在你的UI中”);
PrintStream ps=系统输出;
系统放样(新打印流(新流捕获器(capturePane,ps));
doSomeProcessing();
系统放样(ps);
System.out.println(“我也不是”);
}
});
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(capturePane);
frame.add(processButton,BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
受保护的void doSomeProcessing(){
对于(int-index=0;index<10;index++){
System.out.println(“-->”+索引);
}
}
公共类CapturePane扩展JPanel实现消费者{
私有区域输出;
公共捕获窗格(){
setLayout(新博尔德)