?? chatclient.java
字號:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;
import java.net.*;
import java.io.*;
/**
* ListSelectionListener 是實現JList類事件的接口 ItemListener 是實現JCheckBox類事件的接口
* ActionListener 是實現JButton類,JComboBox類事件的接口
*/
// chatClient類為聊天室的登陸界面類,是個applet
public class chatClient extends JApplet implements ListSelectionListener, ActionListener,
ItemListener {
JPanel panel,mpanel;
JLabel label1, label2, label3, label4;
JButton login,register;
GridBagLayout gbObject;
GridBagConstraints gbc;
JTextField custName;
JPasswordField custPassword;
Socket socket;
PrintStream toServer;
JPanel panelObject;
JTextArea jtextarea;
JScrollPane jscrollpane;// 設置滾動條
GridBagLayout cgbObject;
GridBagConstraints cgbc;
JList listCust;
DefaultListModel model;// 顯示在線用戶列表的類,放在JList當中
JScrollPane jscrollpane1;
JCheckBox check1, check2;
JTextField textCust, textMessage;
JComboBox box1, box2, box3;
JButton buttonSend;
String str;
static int flag = 1;
static String ccustName = null;
Socket soc;
PrintStream ps;
Listen listen = null;
public chatClient() {
try {
socket = new Socket("127.0.0.1", 1001);
toServer = new PrintStream(socket.getOutputStream());
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "不在聊天時段!請注意開放時間09:00——22:00", "警告",
JOptionPane.ERROR_MESSAGE);
System.out.println("Error1:" + e);
}
mpanel = new JPanel();
panel = new JPanel();
gbObject = new GridBagLayout();
gbc = new GridBagConstraints();
panel.setLayout(gbObject);
panel.setBackground(Color.white);
label1 = new JLabel("歡迎光臨java聊天室");
Font font = new Font("宋體", Font.BOLD, 15);
Font font1 = new Font("宋體", Font.BOLD, 13);
label1.setFont(font);
label2 = new JLabel("名字");
label3 = new JLabel("密碼");
label4 = new JLabel("游客登陸不需密碼");
label4.setFont(font1);
login = new JButton("登陸");
register= new JButton("注冊");
custName = new JTextField(10);
custPassword = new JPasswordField(10);
login.addActionListener(this);
register.addActionListener(this);
gbc.gridx = 3;
gbc.gridy = 0;
gbObject.setConstraints(label1, gbc);
panel.add(label1);
gbc.anchor = GridBagConstraints.WEST;
gbc.gridx = 1;
gbc.gridy = 10;
gbObject.setConstraints(label2, gbc);
panel.add(label2);
gbc.anchor = GridBagConstraints.WEST;
gbc.gridx = 3;
gbc.gridy = 10;
gbObject.setConstraints(custName, gbc);
panel.add(custName);
gbc.anchor = GridBagConstraints.WEST;
gbc.gridx = 1;
gbc.gridy = 50;
gbObject.setConstraints(label3, gbc);
panel.add(label3);
gbc.anchor = GridBagConstraints.WEST;
gbc.gridx = 3;
gbc.gridy = 50;
gbObject.setConstraints(custPassword, gbc);
panel.add(custPassword);
gbc.anchor = GridBagConstraints.WEST;
gbc.gridx = 5;
gbc.gridy = 50;
gbObject.setConstraints(label4, gbc);
panel.add(label4);
gbc.anchor = GridBagConstraints.WEST;
gbc.gridx = 3;
gbc.gridy = 100;
gbObject.setConstraints(login, gbc);
panel.add(login);
panel.add(register);
//聊天panel
Font cfont = new Font("宋體", Font.PLAIN, 12);
Font textFont = new Font("宋體", Font.PLAIN, 14);
panelObject = new JPanel();
panelObject.setBackground(Color.pink);
// panelObject.setForeground(Color.blue);
cgbObject = new GridBagLayout();
cgbc = new GridBagConstraints();
//getContentPane().add(panelObject);
panelObject.setLayout(cgbObject);
jtextarea = new JTextArea("歡迎進入本聊天室\n", 30, 120);
jtextarea.setBackground(Color.lightGray);
jtextarea.setForeground(Color.blue);// 設置前景顏色
jtextarea.setBorder(BorderFactory.createEtchedBorder(Color.white,
Color.black));
// 設置文本區域的邊框
jtextarea.setWrapStyleWord(true);// 設置自動換行
jtextarea.setEditable(false);// 設置文本區域不可編輯
jtextarea.setFont(textFont);
model = new DefaultListModel();// model類為顯示在線用戶列表的類,它放在JList類的構造符當中
listCust = new JList(model);// 將model放在JList當中
listCust.setBackground(Color.white);
listCust.setForeground(Color.red);
listCust.setBorder(BorderFactory.createEtchedBorder(Color.white,
Color.black));
listCust.addListSelectionListener(this);// 添加監聽器,其接口是ListSelectionListener
jscrollpane = new JScrollPane(jtextarea,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
/*jscrollpane.getVerticalScrollBar().setValue(
jscrollpane.getVerticalScrollBar().getMaximum());*/
jscrollpane.setSize(715,540);
//jscrollpane.setPreferredSize(new Dimension(715,540)); //設置大小
// 設置當文本區域需要換行時滾動條自動下拉(自動滾屏)
jscrollpane1 = new JScrollPane(listCust,
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
// 設置文本區域框的橫向滾動條為沒有,縱向滾動條始終出現
check1 = new JCheckBox("私聊");
check1.setBackground(Color.pink);
check1.setFont(cfont);
textCust = new JTextField("所有人", 8);
textCust.setEditable(false);
check2 = new JCheckBox("分屏");
check2.setFont(cfont);
check2.setBackground(Color.pink);
check2.addItemListener(this);
check1.addItemListener(this);
textMessage = new JTextField(50);
box1 = new JComboBox();
box1.addItem("語態>>");
box1.addItem("溫柔地");
box1.addItem("羞嗒嗒地");
box1.addItem("懇求地");
box1.addItem("微笑地");
box1.addItem("冤枉地");
box1.addItem("生氣地");
box1.addItem("興高采烈地");
box1.setBackground(Color.white);
box1.setFont(cfont);
box2 = new JComboBox();
box2.addItem("字色>>");
box2.addItem("黃色");
box2.addItem("大紅");
box2.addItem("綠色");
box2.addItem("藍色");
box2.setBackground(Color.white);
box2.setFont(cfont);
box2.addActionListener(this);
box3 = new JComboBox();
box3.addItem("插圖>>");
box3.setBackground(Color.white);
box3.setFont(cfont);
box1.addItemListener(this);
box2.addItemListener(this);
box3.addItemListener(this);
buttonSend = new JButton("發言");
buttonSend.addActionListener(this);
buttonSend.setBackground(Color.pink);
buttonSend.setFont(cfont);
// gbc.fill=GridBagConstraints.BOTH;
cgbc.anchor = GridBagConstraints.EAST;
cgbc.gridwidth = 5;
cgbc.gridheight = 1;
cgbObject.setConstraints(jscrollpane, cgbc);
panelObject.add(jscrollpane);
cgbc.anchor = GridBagConstraints.EAST;
cgbc.fill = GridBagConstraints.BOTH;
cgbc.gridwidth = GridBagConstraints.REMAINDER;
// gbc.weighty=1.0;
cgbc.gridheight = 2;
cgbObject.setConstraints(jscrollpane1, cgbc);
panelObject.add(jscrollpane1);
/*
* gbc.anchor=GridBagConstraints.WEST;
* gbc.gridwidth=GridBagConstraints.REMAINDER;
* gbc.fill=GridBagConstraints.NONE; gbc.weightx=0.0; gbc.weighty=0.0;
* gbc.gridheight=1; //gbc.gridwidth=1;
* gbObject.setConstraints(label1,gbc); panelObject.add(label1);
*/
cgbc.anchor = GridBagConstraints.WEST;
cgbc.gridheight = 1;
cgbc.gridwidth = 1;
cgbObject.setConstraints(textMessage, cgbc);
panelObject.add(textCust);
cgbc.anchor = GridBagConstraints.WEST;
cgbc.gridheight = 1;
cgbc.gridwidth = 1;
cgbObject.setConstraints(check1, cgbc);
panelObject.add(check1);
cgbc.anchor = GridBagConstraints.WEST;
cgbc.fill = GridBagConstraints.NONE;
cgbc.gridheight = 1;
cgbc.gridwidth = 1;
cgbc.weighty = 0.0;
cgbObject.setConstraints(box1, cgbc);
panelObject.add(box1);
cgbc.anchor = GridBagConstraints.WEST;
cgbc.gridheight = 1;
cgbc.gridwidth = 1;
cgbc.weighty = 0.0;
cgbObject.setConstraints(box2, cgbc);
panelObject.add(box2);
cgbc.anchor = GridBagConstraints.WEST;
cgbc.gridheight = 1;
cgbc.gridwidth = 1;
cgbc.weighty = 0.0;
cgbObject.setConstraints(box3, cgbc);
panelObject.add(box3);
cgbc.gridwidth = GridBagConstraints.REMAINDER;
cgbc.anchor = GridBagConstraints.WEST;
// gbc.gridwidth=1;
cgbc.gridheight = 1;
cgbObject.setConstraints(check2, cgbc);
panelObject.add(check2);
cgbc.anchor = GridBagConstraints.EAST;
// gbc.fill=GridBagConstraints.BOTH;
// gbc.weightx=1.0;
cgbc.weighty = 0.0;
cgbc.gridheight = 1;
cgbc.gridwidth = 1;
cgbObject.setConstraints(textMessage, cgbc);
panelObject.add(textMessage);
cgbc.anchor = GridBagConstraints.WEST;
cgbc.fill = GridBagConstraints.NONE;
cgbc.gridwidth = GridBagConstraints.REMAINDER;
cgbc.gridheight = 1;
cgbObject.setConstraints(buttonSend, cgbc);
panelObject.add(buttonSend);
getContentPane().add(mpanel);
mpanel.add(panel);
//panel.setSize(100, 200);
panel.setLocation(200, 100);
mpanel.add(panelObject);
//panelObject.setSize(800, 600);
panel.setLocation(200, 100);
panelObject.setVisible(false);
// this.setSize(500, 300);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == box2)// 當用戶選擇JComboBox的下拉列表選擇顏色時
{
String color = (String) box2.getSelectedItem();// 定義字符串以獲得用戶所選擇的顏色
if (color.equals("字色>>")) {
box2.setBackground(Color.blue);
jtextarea.setForeground(Color.blue);
}
if (color.equals("黃色")) {
box2.setBackground(Color.yellow);
jtextarea.setForeground(Color.yellow);
}
if (color.equals("大紅")) {
box2.setBackground(Color.red);
jtextarea.setForeground(Color.red);
}
if (color.equals("綠色")) {
box2.setBackground(Color.green);
jtextarea.setForeground(Color.green);
} else if (color.equals("藍色")) {
box2.setBackground(Color.blue);
jtextarea.setForeground(Color.blue);
}
}
if (e.getSource() == buttonSend)// 當用戶點擊發送按鈕時
{
if (textMessage.getText().equals(""))// 如果發送的內容為空
{
JOptionPane.showMessageDialog(null, "發送消息不能為空", "警告",
JOptionPane.ERROR_MESSAGE);
}
else if (textMessage.getText() != null) {
if (flag % 2 == 1)// 如果是公聊
{
StringBuffer msg = new StringBuffer("MSG:"); // 定義并實例化一個字符緩沖存儲發送的聊天信息
String action = (String) box1.getSelectedItem();
if (action.equals("語態>>")) {
action = "";
}
String message = action + "對" + textCust.getText() + "說:";
message = message + textMessage.getText();
// 其中MSG為關鍵詞
ps.println(msg.append(message)); // 用打印流發送聊天信息
ps.flush();
textMessage.setText(null);
// jscrollpane.getVerticalScrollBar().setValue(500);
// jscrollpane.getVerticalScrollBar().setValue(jscrollpane.getVerticalScrollBar().getMaximum());
}
if (flag % 2 == 0)// 如果是私聊
{
StringBuffer privateMsg = new StringBuffer("PRIVATE:");
String tm = (String) textCust.getText();
String pm = str + ":" + tm + ":" + textMessage.getText();
ps.println(privateMsg.append(pm));
ps.flush();
}
}
}
if (e.getSource() == login)// 當用戶點擊登陸按鈕時
{
if (custName.getText().equals(""))// 判斷用戶名和密碼是否為空,如果為空就提出警告
{
JOptionPane.showMessageDialog(null, "用戶名不能為空", "警告",
JOptionPane.ERROR_MESSAGE);
}
else {
//app app1 = new app(this);// 如果不為空就進入聊天室主界面
try {
soc = this.socket;
ps = new PrintStream(soc.getOutputStream());
str = (String) this.custName.getText();
listen = new Listen(this, str, soc);
panel.setVisible(false);
panelObject.setVisible(true);
//Listen(this, str, soc);
// Listen類為線程類,在后面實現
} catch (Exception e1) {
e1.printStackTrace();
}
StringBuffer info = new StringBuffer("INFO: ");
String userinfo = custName.getText().trim();// trim()方法為去掉字符串的空格
toServer.println(info.append(userinfo));// 一旦登陸就把用戶名發送到服務器端以顯示在線用戶列表
toServer.flush();
}
}
if (e.getSource() == register)
{
}
}
public void itemStateChanged(ItemEvent e1)// 此方法是ItmeListener接口的方法
{
if (e1.getItemSelectable() == check1)// 當用戶選擇私聊復選框時
{
flag++;
}
}
public void valueChanged(ListSelectionEvent e2)// 此方法是ListSelectionListener接口的方法
{
JList list = (JList) e2.getSource();
ccustName = (String) list.getSelectedValue();// 獲得用戶點擊的用戶
if (ccustName != null) {
textCust.setText(ccustName);// 把它顯示在說話對象的文本框內
}
}
}
//下面是從數據庫用戶登錄
//public void denglu() {
// try {
// Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// Connection con = DriverManager.getConnection("jdbc:odbc:myDSN",
// "sa", "niit");
// Statement st=con.createStatement();
// String sql="select username,ps from biao";
// ResultSet rs=st.executeQuery(sql);
// boolean flag=false;
// while(rs.next())
// {
// String id=rs.getString("username");
// String mima=rs.getString("ps");
// if(id.equals(custName.getText())&&mima.equals(custPassword.getText()))
// {
// flag=true;
// }
// }
// if(flag==true)
// {
// JOptionPane.showMessageDialog(null, "登陸成功");
// }
// else
// JOptionPane.showMessageDialog(null, "登陸失敗");
// } catch (ClassNotFoundException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -