📄 chatgui.java
字号:
package smoker.client;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import smoker.tools.*;
public class ChatGUI extends JFrame implements ActionListener, ItemListener {
public static final long serialVersionUID = 0;
private JTextArea displayMsgeArea;
private JTextArea inputArea;
private JPanel logPanel;
private JTextArea chatLogArea;
private JCheckBox chkDisplayMsgContent;
private JButton btnSend;
private JButton btnExportMsg;
private Container container;
private TitledBorder titleBorder;
private IClientCenter iClientCenter;
private JScrollPane logAreaSp;
private JScrollBar logBar;
private User currentUser;
private User chatUser;
public ChatGUI(IClientCenter iClientCenter, User currentUser, User chatUser) {
this.iClientCenter = iClientCenter;
this.currentUser = currentUser;
this.chatUser = chatUser;
this.setTitle("与 " + chatUser.getNickName() + " 聊天中...");
this.setSize(500, 490);
this.setResizable(false);
GUIManager.CenterWindow(this);
this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
init();
setJComponent();
}
protected void processWindowEvent(WindowEvent evt) {
if (evt.getID() == WindowEvent.WINDOW_CLOSING) {
displayMsgeArea.setText("");
inputArea.setText("");
this.setVisible(false);
}
}
private void init() {
container = this.getContentPane();
container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));
displayMsgeArea = new JTextArea(10, 5);
displayMsgeArea.setEditable(false);
displayMsgeArea.setLineWrap(true);
inputArea = new JTextArea(5, 5);
inputArea.setLineWrap(true);
chatLogArea = new JTextArea(5, 5);
chatLogArea.setEditable(false);
chatLogArea.setLineWrap(true);
logAreaSp = new JScrollPane(displayMsgeArea);
logBar = logAreaSp.getVerticalScrollBar();
chkDisplayMsgContent = new JCheckBox("显示聊天记录");
chkDisplayMsgContent.addItemListener(this);
btnSend = GUIManager.createJButton("发送", null, this, "btnSend");
btnSend.setActionCommand("btnSend");
btnSend.setMnemonic('S');
this.getRootPane().setDefaultButton(btnSend);
btnExportMsg = GUIManager.createJButton("导出聊天记录", null, this, "btnExportMsg");
inputArea.addKeyListener(new KeyAdapter() { // 添加事件按键事件监听,按 Ctrl + Enter 键发送消息
public void keyPressed(KeyEvent ek) {
if (ek.getKeyChar() != KeyEvent.VK_COMPOSE) {
return;
}
if (ek.getKeyChar() == KeyEvent.VK_ENTER) {
if (inputArea.getText().length() == 0) {
displayMsgeArea.append("系统提示: 请不要发送空消息!" + "\n\n");
return;
}
String dateTime = MyCalendar.getInstance().myDateTime('(', ')');
displayMsgeArea.append(currentUser.getNickName() + dateTime + " :\n" + inputArea.getText()+ "\n\n");
chatLogArea.append(currentUser.getNickName() + dateTime + " :\n" + inputArea.getText() + "\n\n");
iClientCenter.sendMessage(chatUser.getUserID(), inputArea.getText(), dateTime);
inputArea.setText("");
}
}
});
}
private void setJComponent() {
titleBorder = BorderFactory.createTitledBorder("聊天内容");
JPanel displayMsgPanel = new JPanel();
displayMsgPanel.setLayout(new BorderLayout());
displayMsgPanel.setBorder(titleBorder);
displayMsgPanel.add(logAreaSp, BorderLayout.CENTER);
titleBorder = BorderFactory.createTitledBorder("输入消息");
JPanel inputPanel = new JPanel();
inputPanel.setLayout(new BorderLayout());
inputPanel.setBorder(titleBorder);
inputPanel.add(new JScrollPane(inputArea), BorderLayout.CENTER);
JPanel btnPanel = new JPanel();
btnPanel.setBackground(btnSend.getBackground());
btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.X_AXIS));
btnPanel.add(Box.createHorizontalStrut(100));
btnPanel.add(chkDisplayMsgContent);
btnPanel.add(Box.createHorizontalStrut(20));
btnPanel.add(btnExportMsg);
btnPanel.add(Box.createHorizontalStrut(20));
btnPanel.add(btnSend);
titleBorder = BorderFactory.createTitledBorder("聊天记录");
logPanel = new JPanel();
logPanel.setBorder(titleBorder);
logPanel.setLayout(new BorderLayout());
logPanel.add(new JScrollPane(chatLogArea));
container.add(displayMsgPanel);
container.add(inputPanel);
container.add(btnPanel);
}
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if (command.equals("btnSend")) {
if (inputArea.getText().length() == 0) {
displayMsgeArea.append("系统提示: 请不要发送空消息!" + "\n\n");
return;
}
String dateTime = MyCalendar.getInstance().myDateTime('(', ')');
displayMsgeArea.append(currentUser.getNickName() + dateTime+ " :\n" + inputArea.getText() + "\n\n");
chatLogArea.append(currentUser.getNickName() + dateTime + " :\n"+ inputArea.getText() + "\n\n");
logBar.setValue(logBar.getMaximum());
iClientCenter.sendMessage(chatUser.getUserID(),inputArea.getText(), dateTime);
inputArea.setText("");
} else if (command == "btnExportMsg") {
if (chatLogArea.getText().equals("")) {
JOptionPane.showMessageDialog(null, "记录为空,不能保存", "失败!",JOptionPane.ERROR_MESSAGE);
} else {
JFileChooser jFileChooser = new JFileChooser();
int option = jFileChooser.showSaveDialog(this);
if (option == JFileChooser.CANCEL_OPTION) {
return;
}
File file = jFileChooser.getSelectedFile();
try {
BufferedWriter buf = new BufferedWriter(new FileWriter(file));
buf.write(chatLogArea.getText());
buf.close();
} catch (IOException exception) {
JOptionPane.showMessageDialog(null, exception.toString(), "记录保存失败!", JOptionPane.ERROR_MESSAGE);
}
}
}
}
/**
* 将收到的消息显示到 消息内容 中。
*
* @param chatInfo
*/
public void onChatReceived(ChatInfo chatInfo) {
StringBuffer sb = new StringBuffer();
sb.append(chatUser.getNickName() + chatInfo.getDateTime() + " :\n");
sb.append(chatInfo.getMessage() + "\n\n");
chatLogArea.append(sb.toString());
displayMsgeArea.append(sb.toString());
logBar.setValue(logBar.getMaximum());
}
public void itemStateChanged(ItemEvent e) {
if (chkDisplayMsgContent.isSelected() == true) {
this.setSize(500, 658);
container.add(logPanel);
this.validate();
} else {
this.setSize(500, 490);
container.remove(logPanel);
this.validate();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -