我目前正在为我的学校作业开发一个聊天机器人。我已完成整个聊天部分,使用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("");
}
});
}
答案 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();
}
}