📄 talk.java
字号:
package javanet;
import java.awt.*;
import javax.swing.*;
import javax.swing.DefaultComboBoxModel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.*;
import java.io.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
public class Talk
extends JFrame implements Runnable{
JOptionPane prompt=new JOptionPane();
DatagramSocket socket;
DatagramPacket packet;
DatagramSocket sendsocket;
byte buf[]=new byte[512];
InetAddress addr=null;
String words;
DefaultComboBoxModel model=new DefaultComboBoxModel();
JScrollPane jScrollPane1 = new JScrollPane();
JTextArea jTextArea1 = new JTextArea();
JScrollPane jScrollPane2 = new JScrollPane();
JTextArea jTextArea2 = new JTextArea();
JLabel jLabel1 = new JLabel();
ImageIcon icon=new ImageIcon(Talk.class.getResource("1.jpg"));
JButton jButton1 = new JButton();
JButton jButton2 = new JButton();
JComboBox jComboBox1 = new JComboBox();
Object tempaddr;
int i=0;
JLabel jLabel2 = new JLabel();
boolean flag=true;
public Talk() {
try {
jbInit();
}
catch(BindException er){prompt.showMessageDialog(this,"端口被占用,不用开启服务","错误",0);jButton1.setEnabled(false);}
catch (Exception exception) {
exception.printStackTrace();
}
}
private void jbInit() throws Exception {
setSize(new Dimension(410,370));
this.addWindowListener(new Talk_this_windowAdapter(this));
getContentPane().setLayout(null);
jScrollPane1.setBounds(new Rectangle(20, 10, 360, 140));
jTextArea1.setEditable(false);
jScrollPane2.setBounds(new Rectangle(20, 180, 360, 100));
jTextArea2.setText("");
jTextArea2.addKeyListener(new Talk_jTextArea2_keyAdapter(this));
jLabel1.setIcon(icon);
jLabel1.setBounds(new Rectangle(0, 150, 410, 30));
jButton1.setBounds(new Rectangle(223, 291, 67, 29));
jButton1.setFont(new java.awt.Font("Dialog", Font.BOLD, 14));
jButton1.setText("发送");
jButton1.addActionListener(new Talk_jButton1_actionAdapter(this));
jButton2.setBounds(new Rectangle(303, 291, 67, 29));
jButton2.setFont(new java.awt.Font("Dialog", Font.BOLD, 14));
jButton2.setText("关闭");
jButton2.addActionListener(new Talk_jButton2_actionAdapter(this));
jComboBox1.setEditable(true);
jComboBox1.setBounds(new Rectangle(86, 291, 91, 29));
jComboBox1.setModel(model);
jLabel2.setFont(new java.awt.Font("Dialog", Font.PLAIN, 13));
jLabel2.setText("发送地址:");
jLabel2.setBounds(new Rectangle(24, 291, 60, 29));
this.getContentPane().add(jScrollPane1);
this.getContentPane().add(jScrollPane2);
this.getContentPane().add(jLabel1);
this.getContentPane().add(jButton2);
this.getContentPane().add(jButton1);
this.getContentPane().add(jLabel2);
this.getContentPane().add(jComboBox1);
jScrollPane2.getViewport().add(jTextArea2);
jScrollPane1.getViewport().add(jTextArea1);
jScrollPane1.setWheelScrollingEnabled(true);
jScrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED );
socket=new DatagramSocket(8181);
new Thread(this).start();
this.setResizable(false);
setTitle("Press the KeyBoard,let the world listen to your voice!");
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = this.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
this.setLocation( (screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
}
public void run()
{
while(flag)
{
try
{
jTextArea2.grabFocus();
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
tempaddr=packet.getAddress().toString();
jTextArea1.setText(jTextArea1.getText()+"\n"+new getTime().time+" "+tempaddr+"对你说:\n"+new String(packet.getData()));
if(model.getIndexOf(tempaddr)==-1)
{
model.addElement(tempaddr.toString().replaceAll("/",""));
setTitle("新用户"+tempaddr+"向你发来消息");
}
}
catch (IOException ex) {}
}
}
public void send()
{
try {
addr=InetAddress.getByName(jComboBox1.getSelectedItem().toString());
words=jTextArea2.getText();
if(words.length()==0){return;}
sendsocket = new DatagramSocket();
packet=new DatagramPacket(words.getBytes(),words.getBytes().length,addr,8181);
sendsocket.send(packet);
jTextArea2.setText("");
jTextArea1.setText(jTextArea1.getText()+"\n"+new getTime().time+" "+"你对 "+addr+"说:\n"+words);
}
catch (Exception ex) {prompt.showMessageDialog(this,"未能发送消息到指定主机","发送失败",0);}
}
public void jButton1_actionPerformed(ActionEvent e) {
send();
}
public void jButton2_actionPerformed(ActionEvent e) {
flag=false;
this.dispose();
try{socket.close();}catch(Exception er){}
}
public void jTextArea2_keyPressed(KeyEvent e) {
if (e.isShiftDown() && e.getKeyCode() == KeyEvent.VK_ENTER) {
send();
}
}
public void this_windowClosing(WindowEvent e) {
jButton2_actionPerformed((ActionEvent)jButton2.getAction());
}
}
class Talk_this_windowAdapter
extends WindowAdapter {
private Talk adaptee;
Talk_this_windowAdapter(Talk adaptee) {
this.adaptee = adaptee;
}
public void windowClosing(WindowEvent e) {
adaptee.this_windowClosing(e);
}
}
class Talk_jTextArea2_keyAdapter
extends KeyAdapter {
private Talk adaptee;
Talk_jTextArea2_keyAdapter(Talk adaptee) {
this.adaptee = adaptee;
}
public void keyPressed(KeyEvent e) {
adaptee.jTextArea2_keyPressed(e);
}
}
class Talk_jButton2_actionAdapter
implements ActionListener {
private Talk adaptee;
Talk_jButton2_actionAdapter(Talk adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton2_actionPerformed(e);
}
}
class Talk_jButton1_actionAdapter
implements ActionListener {
private Talk adaptee;
Talk_jButton1_actionAdapter(Talk adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton1_actionPerformed(e);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -