I am trying to adjust a chatbox area in Java Swing. It appears to be at the top while I need it at the bottom of my frame.
My code:
package com.javavalley;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JScrollPane;
import java.awt.Color;
import java.awt.event.*;
import javax.swing.border.Border;
import javax.swing.BorderFactory;
import java.lang.Override;
import java.lang.Thread;
import java.lang.Math;
public class ChatBot extends JFrame{
private JFrame frame;
private JTextArea chatArea;
private JTextField chatBox;
private JScrollPane scroll;
private Border border;
public static void main(String[] args){
new ChatBot();
}
public ChatBot(){
frame = new JFrame("Product Bot");
chatArea = new JTextArea(20,50);
chatBox = new JTextField();
scroll = new JScrollPane(chatArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
border = BorderFactory.createLineBorder(Color.BLUE, 1);
chatArea.setSize(540, 400);
chatArea.setLocation(30,5);
chatBox.setSize(540, 30);
chatBox.setLocation(18, 18);
chatBox.setBorder(border);
frame.setResizable(false);
frame.setSize(600, 600);
frame.add(chatBox);
frame.add(scroll);
frame.setVisible(true);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
bot("Hello! I am a \"Product Bot\"! that answers product related queries! Ask me by typing below. Type \"QUIT\" to end the program. \n\n");
chatArea.append("Chats: \n");
chatBox.setText("");
chatBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
String gtext = chatBox.getText();
chatArea.append("You: " gtext "\n");
chatBox.setText("");
if(gtext.equals("QUIT")) {
sleep(500);
System.exit(0);
}
String category = "";
try {
category = com.javavalley.ProBot.findCategory(gtext);
System.out.println(category);
}
catch (Exception e) {
System.out.println("Exception thrown.");
}
String response = respond(category);
bot(response);
}
});
}
private void bot(String string)
{
chatArea.append("Bot: " string "\n");
}
private void sleep(int x) {
try {
Thread.sleep(x);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private String respond(String category)
{
String[] greetings = {"Hello, how can I help you?"};
String[] conversationContinue = {"How can I help you with?", "What else can I help you with?"};
String[] colorsinquiry = {"Black, Blue, Green, Red, Sierra Blue"};
String[] priceinquiry = {"Price is EUR 279"};
String[] productinquiry = {"Product is an Android 11 smart phone with latest features like Super AMOLED Display, 6.5 inches, Li-Ion 5000 mAh, non-removable battery, Octa-core (4x1.6 GHz Cortex-A55 & 4x1.2 GHz Cortex-A55))"};
String[] conversationComplete = {"Goodbye", "Bye", "Nice chatting with you. Bye!"};
if (category.equals("greeting")) return greetings[(int) (Math.random()*greetings.length)];
else if (category.equals("colors-inquiry")) return colorsinquiry[(int) (Math.random()*colorsinquiry.length)];
else if (category.equals("price-inquiry")) return priceinquiry[(int) (Math.random()*priceinquiry.length)];
else if (category.equals("product-inquiry")) return productinquiry[(int) (Math.random()*productinquiry.length)];
else if (category.equals("conversation-continue")) return conversationContinue[(int) (Math.random()*conversationContinue.length)];
else if (category.equals("conversation-complete")) return conversationComplete[(int) (Math.random()*conversationComplete.length)];
else return "Sorry";
}
}
P.S: Added the prototype code. The thing I am trying to produce is a complete GUI with some chat history. Also I wanted to have it in a rectangular window and some UI improvements.
CodePudding user response:
Yes I would like to have it the way you showed.
This is what you might see if the bottom text field is swapped for a JLabel (which seems more logical here) but the layout is identical.
This is the code that produced the screenshot seen above. (It is also an MRE as I hope you will post in future. I could have sorted the problem in half the time, had it not been for 'filling in the blanks' of the original code).
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
class ChatBot {
JFrame frame;
JTextArea chatArea;
JTextField chatBox;
Border border;
JScrollPane scroll;
public ChatBot() {
JPanel gui = new JPanel(new BorderLayout(5,5));
frame = new JFrame("Product Bot");
frame.setContentPane(gui);
chatArea = new JTextArea(10, 50);
chatBox = new JTextField();
scroll = new JScrollPane(chatArea,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
border = BorderFactory.createLineBorder(Color.BLUE, 1);
chatBox.setBorder(border);
JLabel bot = new JLabel(
"Hello! I am a \"Product Bot\"! that answers product related queries! "
"Ask me by typing below. Type \"QUIT\" to end the program.");
chatArea.append("Chats: \n");
chatBox.setText("Chat Box");
gui.add(chatBox, BorderLayout.PAGE_START);
gui.add(scroll);
gui.add(bot, BorderLayout.PAGE_END);
gui.setBorder(new EmptyBorder(5,5,5,5));
frame.setResizable(false);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new ChatBot();
}
}
I forgot to carefully document the changes made (in code comments). If, after carefully examining the code and relevant Java Docs there is any change you do not understand, ask me in a comment & I'll explain further.
CodePudding user response:
You are looking for a Layout. Here I suggest https://docs.oracle.com/javase/tutorial/uiswing/layout/border.html
Which is the default layout anyway, so you can do :
public ChatBot(){
...
frame.add(chatBox, BorderLayout.PAGE_START);
frame.add(scroll, BorderLayout.PAGE_END);
...
}
You can mix Layout and you should create panels that groups simple elements.


