用Java重定向输入和输出

时间:2017-07-26 13:12:55

标签: java swing

我目前正在为我的学校作业开发一个聊天机器人。我已完成整个聊天部分,使用Scanner进行用户输入,使用System.out.println()显示对话。 现在我想为chatbot实现一个GUI。我得到了一个非常简单的GUI,其中JTextField和JTextArea分别是输入框和显示框。

但现在我完全不知道如何将它们联系在一起。 就像Scanner一样,而不是System.in,将从JTextField读取输入,而不是在控制台中显示输出,将它们显示在JTextArea中。

任何人都可以帮我这个吗?就像我应该学习如何实现将聊天机器人和GUI链接在一起?

如果您想查看我的GUI代码,请参阅以下内容:

public class GUI_V2 extends JFrame {

private JTextField txtEnter = new JTextField();
//Chat area;
private JTextArea txtChat = new JTextArea();

//Scroll
private final JScrollPane scroll = new JScrollPane(txtChat);


public GUI_V2(){
    //Frame Attributes
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setSize(2000,2000);
    this.setVisible(true);
    this.setResizable(false);
    this.setLayout(null);
    this.setTitle("Menu ChatBot");

    //textEnter Attributes
   txtEnter.setLocation(20,1825);
   txtEnter.setSize(1950,100);
   txtEnter.setFont(new Font("Arial",Font.PLAIN,45));

    //txtChat Attributes
   txtChat.setLocation(22,5);
   txtChat.setSize(1950,1800);
   txtChat.setFont(new Font("Arial",Font.BOLD,45));
   txtChat.setBackground(java.awt.Color.getHSBColor(0.4957f,0.0902f,1.0f));
   txtChat.setLineWrap(true);
   txtChat.setWrapStyleWord(true);
   txtChat.setEditable(false);

   //scroll Attributes
   scroll.setLocation(22,5);
   scroll.setSize(1950,1800);

   //Add Items To Frame
   this.add(txtEnter);
   this.add(scroll);



   //txtEnter Action Event:
   txtEnter.addActionListener(new ActionListener(){
       public void actionPerformed(ActionEvent arg0){
           //add userInput into the txtChat
           String uText = txtEnter.getText();
           txtChat.append("You" + ": " + uText + "\n");
           //auto scroll down
           txtChat.setCaretPosition(txtChat.getDocument().getLength());
           //set the txtEnter field to be empty
           txtEnter.setText("");
       }
   });
}

1 个答案:

答案 0 :(得分:0)

不要将布局设置为null并且不要使用setLocation()来安排组件,而是使用适当的布局。请参阅A Visual Guide to Layout Managers.

作为您的方案的示例,您可以使用BoxLayout(这不会正确排列您的组件,因为BoxLayout将组件拉伸到可用空间):

变化:

this.setLayout(null);

要:

this.setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));

您还需要添加main()

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

由于您已设置为较大尺寸,因此如果不滚动到顶部,则无法在JTextArea中看到文字。

最后一点,这里没有实际需要扩展JFrame。如果我必须覆盖JFrame中的方法,我自己会延长JFrame。如果您不打算覆盖方法,则只需从JFrame创建对象。

我就是这样做的:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class GUI_V2{

    public JFrame frame;
    private JPanel panel;
    private JTextField txtEnter;
    //Chat area;
    private JTextArea txtChat;

    //Scroll
    private JScrollPane scroll;


    public GUI_V2(){
        initComp();
    }

    public void initComp(){
        frame = new JFrame("Menu ChatBot");
        frame.setLayout(new CardLayout());

        panel = new JPanel();
        panel.setSize(1000, 1000);
        panel.setLayout(new BorderLayout());

        txtEnter = new JTextField();
        //textEnter Attributes
        txtEnter.setSize(1000,100);
        txtEnter.setFont(new Font("Arial",Font.PLAIN,45));
        panel.add(txtEnter, BorderLayout.PAGE_START);

        txtChat = new JTextArea();
        //txtChat Attributes
        txtChat.setSize(1000,900);
        txtChat.setFont(new Font("Arial",Font.BOLD,45));
        txtChat.setBackground(java.awt.Color.getHSBColor(0.4957f,0.0902f,1.0f));
        txtChat.setLineWrap(true);
        txtChat.setWrapStyleWord(true);
        txtChat.setEditable(false);

        scroll = new JScrollPane(txtChat);
        //scroll Attributes
        scroll.setSize(1000,900);
        panel.add(scroll, BorderLayout.CENTER);

        frame.add(panel);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //frame.setResizable(false);
        frame.setVisible(true);

        doAction();
    }

    public void doAction(){
        //txtEnter Action Event:
        txtEnter.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0){
                //add userInput into the txtChat
                String uText = txtEnter.getText();
                txtChat.append("You" + ": " + uText + "\n");
                //auto scroll down
                txtChat.setCaretPosition(txtChat.getDocument().getLength());
                //set the txtEnter field to be empty
                txtEnter.setText("");
            }
        });
    }

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