#java #swing #awt
#java #swing #awt
Вопрос:
Я новичок в Java, и я работаю над этим приложением для чата, у меня есть эта клиентская программа, и я закодировал графический интерфейс с использованием java swing.. Теперь я не понимаю, как подключить 2 с помощью java awt .. Может кто-нибудь помочь мне с этим??
Это клиентская программа
package client;
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ChatClient {
private String host = "localhost";
private int port=8000;
private String uname;
protected String username ="";
private int initalport;
private String clientmessage;
protected Socket sock;
public void execute() {
try {
Socket socket = new Socket(host, port);
System.out.println("Connected to the chat server");
new ReadThread(socket, this).start();
new WriteThread(socket, this).start();
} catch (IOException ex) {
System.out.println("Error getting input stream");
}
}
public static void main(String[] args) {
ChatClient client = new ChatClient();
client.execute();
}
}
class ReadThread extends Thread { //Reads from the server
private BufferedReader reader;
private Socket socket;
private ChatClient client;
private String response;
public ReadThread(Socket socket, ChatClient client) {
this.socket = socket;
this.client = client;
try {
InputStream input = socket.getInputStream();
reader = new BufferedReader(new InputStreamReader(input));
} catch (IOException ex) {
System.out.println("Error getting input stream");
}
}
public void run() {
while (true) {
try {
response = reader.readLine();
System.out.print("n");
System.out.println(response);
if (client.username != null) {
System.out.print("[" client.username "]: ");
}else{
System.out.println("Please enter a valid username");
}
} catch (IOException ex) {
System.out.println("Error reading from server");
break;
}
}
}
}
class WriteThread extends Thread { //writes to the server
private PrintWriter writer;
private Socket socket;
private ChatClient client;
private String userName="";
private String text="";
public WriteThread(Socket socket, ChatClient client) {
this.socket = socket;
this.client = client;
try {
OutputStream output = socket.getOutputStream();
writer = new PrintWriter(output, true);
} catch (IOException ex) {
System.out.println("Error getting output stream");
}
}
public void run() {
Console console = System.console();
userName = console.readLine("nEnter your name: ");
client.username=userName;
writer.println(userName);
while(true) {
text = console.readLine("[" userName "]: ");
if(text.equals("bye")){
break;
}
else{
writer.println(text);
}
}
try{
socket.close();
}catch(IOException ex){
System.out.println("Error in closing the socket");
}
}
}
И это графический интерфейс, который я создал с помощью java swing
import javax.swing.*;
import java.awt.*;
public class ui {
public static void main(String[] args) {
JFrame f=new JFrame();//creating instance of JFrame
JTextArea area=new JTextArea(); //messages are displayed here
area.setBounds(10,10, 780,400);
area.setEditable(false);
f.add(area);
JTextArea textArea=new JTextArea(); //messages are typed here
textArea.setBounds(10,450,780,110);
f.add(textArea);
JButton b=new JButton("Send");// send button to send the messages
b.setBounds(840,450,95,110);
f.add(b);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
JScrollPane scrolltxt1=new JScrollPane(textArea);
scrolltxt1.setBounds(10,450,780,110);
f.add(scrolltxt1);
JScrollPane scrolltxt2=new JScrollPane(area);
scrolltxt2.setBounds(10,10, 780,400);
f.add(scrolltxt2);
f.setIconImage(icon);
f.setTitle("chat");
f.setResizable(false);
f.setSize(1030,700);
f.setLayout(null);//using no layout managers
f.setVisible(true);//making the frame visible
}
}
Комментарии:
1. Давайте покончим с формальностями 1) не используйте
null
/AbsoluteLayout
, не вызывайтеsetBounds
илиsetSize
для любого компонента, вместо этого используйте правильный LayoutManager и вызывайтеpack
свойJFrame
экземпляр, прежде чем сделать его видимым. 2) Все компоненты swing должны создаваться в EDT черезSwingUtilities.invokeLater
3) Я не уверен, как вы хотели бы использовать код в графическом интерфейсе, использующем консоль. В этом смысл пользовательского интерфейса, чтобы не использовать консоль2. Возможно, вы захотите изучить возможность использования SwingWorker , который позволит вам запускать код в фоновом режиме и публиковать его в вашем пользовательском интерфейсе, например, при получении сообщения от другого пользователя, т.Е.
ReadThread
. 4) вместо использования цикла while для чтения текста из console (WriteThread
) вы можете захотеть иметь в своем чат-клиенте методsendMessage(String message)
, который вы вызываете при нажатии кнопки отправки и который просто записывает данные в открытое соединение