The following class implements a chatGUI. When it runs okay the screen looks like this:
The problem is very often when i enter text of large length ie. 50 - 100 chars the gui goes crazy. the chat history box shrinks as shown in this
.
Any ideas regarding what is causing this?
Thank you.
PS: the attached class below is complete code. you can copy it and compile on your computer to see exactly what i mean.
NOTE: once the GUI goes crazy then if i hit the "Clear" button the history window clears and the GUI goes back to being correctly displayed again.
package Sartre.Connect4;
import javax.swing.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.text.StyledDocument;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.BadLocationException;
import java.io.BufferedOutputStream;
import javax.swing.text.html.HTMLEditorKit;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.JFileChooser;
/**
* Chat form class
* @author iAmjad
*/
public class ChatGUI extends JDialog implements ActionListener {
/**
* Used to hold chat history data
*/
private JTextPane textPaneHistory = new JTextPane();
/**
* provides scrolling to chat history pane
*/
private JScrollPane scrollPaneHistory = new JScrollPane(textPaneHistory);
/**
* used to input local message to chat history
*/
private JTextPane textPaneHome = new JTextPane();
/**
* Provides scrolling to local chat pane
*/
private JScrollPane scrollPaneHomeText = new JScrollPane(textPaneHome);
/**
* JLabel acting as a statusbar
*/
private JLabel statusBar = new JLabel("Ready");
/**
* Button to clear chat history pane
*/
private JButton JBClear = new JButton("Clear");
/**
* Button to save chat history pane
*/
private JButton JBSave = new JButton("Save");
/**
* Holds contentPane
*/
private Container containerPane;
/**
* Layout GridBagLayout manager
*/
private GridBagLayout gridBagLayout = new GridBagLayout();
/**
* GridBagConstraints
*/
private GridBagConstraints constraints = new GridBagConstraints();
/**
* Constructor for ChatGUI
*/
public ChatGUI(){
setTitle("Chat");
// set up dialog icon
URL url = getClass().getResource("Resources/SartreIcon.jpg");
ImageIcon imageIcon = new ImageIcon(url);
Image image = imageIcon.getImage();
this.setIconImage(image);
this.setAlwaysOnTop(true);
setLocationRelativeTo(this.getParent());
//////////////// End icon and placement /////////////////////////
// Get pane and set layout manager
containerPane = getContentPane();
containerPane.setLayout(gridBagLayout);
/////////////////////////////////////////////////////////////
//////////////// Begin Chat History //////////////////////////////
textPaneHistory.setToolTipText("Chat History Window");
textPaneHistory.setEditable(false);
textPaneHistory.setPreferredSize(new Dimension(350,250));
scrollPaneHistory.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPaneHistory.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
// fill Chat History GridBagConstraints
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 10;
constraints.gridheight = 10;
constraints.weightx = 100;
constraints.weighty = 100;
constraints.fill = GridBagConstraints.BOTH;
constraints.anchor = GridBagConstraints.CENTER;
constraints.insets = new Insets(10,10,10,10);
constraints.ipadx = 0;
constraints.ipady = 0;
gridBagLayout.setConstraints(scrollPaneHistory, constraints);
// add to the pane
containerPane.add(scrollPaneHistory);
/////////////////////////////// End Chat History ///////////////////////
///////////////////////// Begin Home Chat //////////////////////////////
textPaneHome.setToolTipText("Home Chat Message Window");
textPaneHome.setPreferredSize(new Dimension(200,50));
textPaneHome.addKeyListener(new MyKeyAdapter());
scrollPaneHomeText.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPaneHomeText.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
// fill Chat History GridBagConstraints
constraints.gridx = 0;
constraints.gridy = 10;
constraints.gridwidth = 6;
constraints.gridheight = 1;
constraints.weightx = 100;
constraints.weighty = 100;
constraints.fill = GridBagConstraints.BOTH;
constraints.anchor = GridBagConstraints.CENTER;
constraints.insets = new Insets(10,10,10,10);
constraints.ipadx = 0;
constraints.ipady = 0;
gridBagLayout.setConstraints(scrollPaneHomeText, constraints);
// add to the pane
containerPane.add(scrollPaneHomeText);
////////////////////////// End Home Chat /////////////////////////
///////////////////////Begin Clear Chat History ////////////////////////
JBClear.setToolTipText("Clear Chat History");
// fill Chat History GridBagConstraints
constraints.gridx = 6;
constraints.gridy = 10;
constraints.gridwidth = 2;
constraints.gridheight = 1;
constraints.weightx = 100;
constraints.weighty = 100;
constraints.fill = GridBagConstraints.BOTH;
constraints.anchor = GridBagConstraints.CENTER;
constraints.insets = new Insets(10,10,10,10);
constraints.ipadx = 0;
constraints.ipady = 0;
gridBagLayout.setConstraints(JBClear, constraints);
JBClear.addActionListener(this);
// add to the pane
containerPane.add(JBClear);
///////////////// End Clear Chat History ////////////////////////
/////////////// Begin Save Chat History //////////////////////////
JBSave.setToolTipText("Save Chat History");
constraints.gridx = 8;
constraints.gridy = 10;
constraints.gridwidth = 2;
constraints.gridheight = 1;
constraints.weightx = 100;
constraints.weighty = 100;
constraints.fill = GridBagConstraints.BOTH;
constraints.anchor = GridBagConstraints.CENTER;
constraints.insets = new Insets(10,10,10,10);
constraints.ipadx = 0;
constraints.ipady = 0;
gridBagLayout.setConstraints(JBSave, constraints);
JBSave.addActionListener(this);
// add to the pane
containerPane.add(JBSave);
///////////////////// End Save Chat History /////////////////////
/////////////////// Begin Status Bar /////////////////////////////
constraints.gridx = 0;
constraints.gridy = 11;
constraints.gridwidth = 10;
constraints.gridheight = 1;
constraints.weightx = 100;
constraints.weighty = 50;
constraints.fill = GridBagConstraints.BOTH;
constraints.anchor = GridBagConstraints.CENTER;
constraints.insets = new Insets(0,10,5,0);
constraints.ipadx = 0;
constraints.ipady = 0;
gridBagLayout.setConstraints(statusBar, constraints);
// add to the pane
containerPane.add(statusBar);
////////////// End Status Bar ////////////////////////////
// set resizable to false
this.setResizable(false);
// pack the GUI
pack();
}
/**
* Deals with necessary menu click events
* @param event
*/
public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
// Process Clear button event
if (source == JBClear){
textPaneHistory.setText(null);
statusBar.setText("Chat History Cleared");
}
// Process Save button event
if (source == JBSave){
// process only if there is data in history pane
if (textPaneHistory.getText().length() > 0){
// process location where to save the chat history file
JFileChooser chooser = new JFileChooser();
chooser.setMultiSelectionEnabled(false);
chooser.setAcceptAllFileFilterUsed(false);
FileNameExtensionFilter filter = new FileNameExtensionFilter("HTML Documents", "htm", "html");
chooser.setFileFilter(filter);
int option = chooser.showSaveDialog(ChatGUI.this);
if (option == JFileChooser.APPROVE_OPTION) {
// Set up document to be parsed as HTML
StyledDocument doc = (StyledDocument)textPaneHistory.getDocument();
HTMLEditorKit kit = new HTMLEditorKit();
BufferedOutputStream out;
try {
// add final file name and extension
String filePath = chooser.getSelectedFile().getAbsoluteFile() + ".html";
out = new BufferedOutputStream(new FileOutputStream(filePath));
// write out the HTML document
kit.write(out, doc, doc.getStartPosition().getOffset(), doc.getLength());
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(ChatGUI.this,
"Application will now close. \n A restart may cure the error!\n\n"
+ e.getMessage(),
"Fatal Error",
JOptionPane.WARNING_MESSAGE, null);
System.exit(2);
} catch (IOException e){
JOptionPane.showMessageDialog(ChatGUI.this,
"Application will now close. \n A restart may cure the error!\n\n"
+ e.getMessage(),
"Fatal Error",
JOptionPane.WARNING_MESSAGE, null);
System.exit(3);
} catch (BadLocationException e){
JOptionPane.showMessageDialog(ChatGUI.this,
"Application will now close. \n A restart may cure the error!\n\n"
+ e.getMessage(),
"Fatal Error",
JOptionPane.WARNING_MESSAGE, null);
System.exit(4);
}
statusBar.setText("Chat History Saved");
}
}
}
}
/**
* Process return key for sending the message
*/
private class MyKeyAdapter extends KeyAdapter {
@Override
@SuppressWarnings("static-access")
public void keyPressed(KeyEvent ke) {
//DateTime dateTime = new DateTime();
//String nowdateTime = dateTime.getDateTime();
int kc = ke.getKeyCode();
if (kc == ke.VK_ENTER) {
try {
// Process only if there is data
if (textPaneHome.getText().length() > 0){
// Add message origin formatting
StyledDocument doc = (StyledDocument)textPaneHistory.getDocument();
Style style = doc.addStyle("HomeStyle", null);
StyleConstants.setBold(style, true);
String home = "Home [" + nowdateTime + "]: ";
doc.insertString(doc.getLength(), home, style);
StyleConstants.setBold(style, false);
doc.insertString(doc.getLength(), textPaneHome.getText() + "\n", style);
// update caret location
textPaneHistory.setCaretPosition(doc.getLength());
textPaneHome.setText(null);
statusBar.setText("Message Sent");
}
} catch (BadLocationException e) {
JOptionPane.showMessageDialog(ChatGUI.this,
"Application will now close. \n A restart may cure the error!\n\n"
+ e.getMessage(),
"Fatal Error",
JOptionPane.WARNING_MESSAGE, null);
System.exit(1);
}
ke.consume();
}
}
}
}