📄 clientframe.java
字号:
package group.client;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
import javax.swing.border.*;
import group.MesPanel;
/**
客户端聊天的主界面类
@author wls
*/
public class ClientFrame extends JFrame
{
private String[] mesStr; //用于容纳消息的数组
private JTextField mesIn; //用户输入消息的文本框
private JButton send; //发送消息的按钮
private JButton latent; //发送悄悄话的按钮
private MesPanel mesPane; //显示消息的面板
private FrendListPanel frendList; //显示好友列表的面板
private JPanel sendMesPane; //用于输入消息和发送消息的面板
private Client client; //客户端主类对象的一个引用
/**
构造函数,主要初始化一些属性
@param c 客户端主类的对象的一个引用
*/
public ClientFrame(Client c)
{
super("欢迎来到聊天室"); //设置窗口标题
setSize(700, 550); //设置窗口大小
Toolkit kit = Toolkit.getDefaultToolkit(); //下面这一小段用来计算窗口应放置的信置
Dimension screenSize = kit.getScreenSize();
int screenWidth = screenSize.width;
int screenHeight = screenSize.height;
int localX = (screenWidth - getSize().width) / 2;
int localY = (screenHeight - getSize().height) / 2;
setLocation(localX, localY);
setResizable(false); //把窗口设为不可编辑,主要是为了界面
mesStr = new String[80]; //初始化容纳消息的数组并赋初值
try
{
BufferedReader buf = new BufferedReader(new FileReader("readme.txt"));
String tmp;
int n = 0;
while((tmp = buf.readLine()) != null)
{
mesStr[n] = tmp;
n++;
}
int length = mesStr.length;
mesStr[length - 1] = "";
for(int i = length - 1; --i >= 15;)
{
if(--n >= 0)
{
mesStr[i] = mesStr[n];
}
else
{
mesStr[i] = "";
}
}
mesStr[14] = "";
mesStr[13] = "此处是消息显示窗口,请把滚动条往下拉!";
for(int i = 13; --i >= 0;)
{
mesStr[i] = "";
}
buf.close();
}catch(Exception e)
{
System.out.println("初始化消息数组初错,数组全部初始化为空");
System.out.println(e.toString());
for(int i = mesStr.length; --i >=0;)
{
mesStr[i] = "";
}
}
Action sendAction = new SendAction("发 送");
LatentAction latentAction = new LatentAction("悄悄话");
mesIn = new JTextField("在此输入您的消息!", 45);//把消息输入框的长度设为45个字符并设置字体
mesIn.setFont(new Font("SansSerif", Font.PLAIN, 14));
mesIn.addFocusListener(new FocusAdapter()
{
public void focusGained(FocusEvent e)
{
mesIn.setText("");
}
});
Font f = new Font("Serif", Font.BOLD, 14);
send = new JButton(sendAction);
send.setFont(f);
latent = new JButton(latentAction);
latent.setFont(f);
mesPane = new MesPanel("聊天消息", 22, 45); //初始化消息面板和好友列表面板
mesPane.setTextFont(new Font("Serif", Font.PLAIN, 14));
frendList = new FrendListPanel("在线好友", 22, 150);
sendMesPane = createPane();
InputMap imap = sendMesPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
imap.put(KeyStroke.getKeyStroke("ENTER"), "send");
imap.put(KeyStroke.getKeyStroke("ctrl ENTER"), "latent");
ActionMap amap = sendMesPane.getActionMap();
amap.put("send", sendAction);
amap.put("latent", latentAction);
Border border = BorderFactory.createEtchedBorder(EtchedBorder.RAISED,
Color.black, Color.white); //创建一个用于面板的3D直线边界
sendMesPane.setBorder(border);
Container pane = getContentPane(); //把三个面板添加到窗口中
pane.add(mesPane, BorderLayout.CENTER);
pane.add(frendList, BorderLayout.EAST);
pane.add(sendMesPane, BorderLayout.SOUTH);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
client = c; //设置在处理事件时要用到的Client类的对象
}
/*
创建用于输入消息的面板,此面板采用GridBagLayout布局
*/
private JPanel createPane()
{
JPanel pane = new JPanel();
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
pane.setLayout(gbl);
JPanel tmpPane = new JPanel();
tmpPane.setSize(680,15);
help(gbc, 0, 0, 3, 1, 0, 100);
gbl.setConstraints(tmpPane,gbc);
pane.add(tmpPane);
gbc.fill = GridBagConstraints.VERTICAL;
help(gbc, 0, 1, 1, 1, 30, 100);
gbl.setConstraints(mesIn, gbc);
pane.add(mesIn);
gbc.fill = GridBagConstraints.NONE;
help(gbc, 1, 1, 1, 1, 35, 100);
gbl.setConstraints(send, gbc);
pane.add(send);
help(gbc, 2, 1, 1, 1, 35, 100);
gbl.setConstraints(latent, gbc);
pane.add(latent, gbc);
return pane;
}
/*
辅助设置组件约束的方法
*/
private void help(GridBagConstraints gbc, int gridx, int gridy, int gridwidth, int gridheight,
int weightx, int weighty)
{
gbc.gridx = gridx;
gbc.gridy = gridy;
gbc.gridwidth = gridwidth;
gbc.gridheight = gridheight;
gbc.weightx = weightx;
gbc.weighty = weighty;
}
/**
用于更新消息面板里面的消息的方法
*/
public void updateMes(String mes)
{
int i = 0;
for( ; i < 79; i++)
{
mesStr[i] = mesStr[i + 1];
}
mesStr[i] = mes;
mesPane.updateMes(mesStr);
}
/**
用于更新好友列表的方法
*/
public void updateFrend(String frendID)
{
frendList.updateFrend(frendID);
}
/*
处理发送消息按钮的事件的动作,用内部类实现,可以通过 Enter 来发送消息给所有人
*/
private class SendAction extends AbstractAction
{
public SendAction(String name)
{
putValue(Action.NAME, name);
putValue(Action.SHORT_DESCRIPTION, "发送消息");
}
public void actionPerformed(ActionEvent e)
{
String tmpMes = mesIn.getText();
if((tmpMes.length() > 100) || tmpMes.equals(""))
{
JOptionPane.showMessageDialog(ClientFrame.this,
"您输入的消息太长或没输入消息,请输入100字以内的消息!",
"错误", JOptionPane.WARNING_MESSAGE);
}
else
{
client.sendMes(tmpMes);
mesIn.setText("");
}
}
}
/*
处理发送悄悄话的按钮的事件的类,可以通过按Ctrl + Enter来发送悄悄话
*/
private class LatentAction extends AbstractAction
{
public LatentAction(String name)
{
putValue(Action.NAME, name);
putValue(Action.SHORT_DESCRIPTION, "发送悄悄话");
}
public void actionPerformed(ActionEvent e)
{
String toFrendID = frendList.getID();
String tmpMes = mesIn.getText();
if((tmpMes.length() > 100) || tmpMes.equals(""))
{
JOptionPane.showMessageDialog(ClientFrame.this,
"您输入的消息太长或没输入消息,请输入100字以内的消息!",
"错误", JOptionPane.WARNING_MESSAGE);
}
else if(toFrendID.equals(""))
{
JOptionPane.showMessageDialog(null, "您发送的是悄悄话,但是您没有选择要发送给谁!!!",
"请选择好友", JOptionPane.ERROR_MESSAGE);
}
else
{
client.sendLatent(toFrendID, mesIn.getText());
mesIn.setText("");
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -