import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JComponent;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
/**
* simple AWT gui for the chat client
*/
public class Gui extends JFrame implements ChatLineListener {
private static final long serialVersionUID = 1L;
protected JFrame window;
protected JScrollPane scrollPane;
protected JTextPane outputTextbox;
protected JTextField inputField;
protected Client chatClient;
/**
* creates layout
*
* @param title
* title of the window
* @param chatClient
* chatClient that is used for sending and receiving messages
*/
public Gui(String title, final Client chatClient) {
super(title);
window = this;
System.out.println("starting gui...");
setLayout(new GridBagLayout());
outputTextbox = new JTextPane();
outputTextbox.setEditable(false);
scrollPane = new JScrollPane();
scrollPane.setViewportView(outputTextbox);
addScrollPane(this, scrollPane);
inputField = new JTextField();
addTextField(this, inputField);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setSize(400, 300);
setVisible(true);
inputField.requestFocus();
this.chatClient = chatClient;
this.addWindowListener(new WindowListener() {
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
public void windowClosing(WindowEvent e) {
chatClient.stop();
setVisible(false);
System.exit(0);
}
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
});
// register listener so that we are informed whenever a new chat message
// is received (observer pattern)
chatClient.addLineListener(this);
chatClient.start();
}
protected void addScrollPane(JFrame frame, JScrollPane scrollPane) {
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0;
c.weighty = 1.0;
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 1;
frame.add(scrollPane, c);
}
protected void addTextField(JFrame frame, final JTextField inputField) {
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
c.weightx = 0.8;
c.weighty = 0;
c.gridx = 0;
c.gridy = 1;
frame.add(inputField, c);
inputField.addKeyListener(new KeyListener() {
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
public void keyPressed(KeyEvent arg0) {
if (arg0.getKeyCode() == KeyEvent.VK_ENTER
&& inputField.getText().length() > 0) {
chatClient.send(inputField.getText());
inputField.setText("");
}
}
});
}
/**
* this method gets called every time a new message is received (observer
* pattern)
*/
public void newChatLine(String line) {
StyleContext sc = StyleContext.getDefaultStyleContext();
AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY,
StyleConstants.Foreground, Color.BLACK);
try {
outputTextbox.getDocument().insertString(outputTextbox.getDocument().getLength(),
line, aset);
} catch (BadLocationException e) {
e.printStackTrace();
}
}
}