есть. Я пишу чат-клиент GUI, который отправляет сообщение на сервер и получает эхо-сигналы от сервера.
Верхняя половина JFrame клиента содержит JTextArea, обернутую в JScrollPane, расположенную под меню. Этот JScrollPane отвечает за получение ответов от сервера, который получает сообщения от клиента и передает их всем клиентам. Таким образом, клиент выделяет отдельный поток для получения сообщений.
Нижняя половина содержит JPanel, которая сама содержит JTextArea и JButton. Этот JPanel отвечает за получение входных данных пользователя в виде сообщения и его отправку на сервер.
Теперь проблема в том, что при запуске клиентского JFrame верхняя половина, то есть JScrollPane с его JTextArea, не ' т обнаружиться в верхней части JFrame. Другой вопрос заключается в том, что я не могу ничего печатать в JTextArea в нижней половине, хотя я установил редактируемую JTextArea.
Пожалуйста, помогите мне взломать эти два мифа. Большое спасибо!
Код для клиента следующий:
package chatroom;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
import java.util.*;
public class MultithreadEchoChatroomClientGUI {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable () {
public void run () {
ClientFrame client = new ClientFrame();
client.setTitle("Chat");
client.setSize(400, 500);
client.setVisible(true);
}
});
}
}
class ClientFrame extends JFrame {
private Socket socket;
private Scanner input;
private PrintWriter output;
private JTextArea serverResponseArea;
private JTextArea messageArea;
private JButton sendButton;
private static final int PORT = 1234;
public ClientFrame () {
initNetwork();
initFrame();
}
private void initNetwork () {
String address;
InetAddress host = null;
address = JOptionPane.showInputDialog("Enter the host name or IP address:");
try {
host = InetAddress.getByName(address);
}
catch (UnknownHostException uhEx) {
JOptionPane.showMessageDialog(null, "Unknown Host!", "Error", JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
try {
socket = new Socket(host, PORT);
input = new Scanner(socket.getInputStream());
}
catch (IOException ioEx) {
JOptionPane.showMessageDialog(null, ioEx.toString(), "Error", JOptionPane.ERROR_MESSAGE);
}
try {
input = new Scanner(socket.getInputStream());
output = new PrintWriter(socket.getOutputStream(), true);
}
catch (IOException ioEx) {
JOptionPane.showMessageDialog(this, "Cannot create input or output stream!", "Error", JOptionPane.ERROR_MESSAGE);
closeSocket();
System.exit(1);
}
}
private final void closeSocket () {
try {
socket.close();
}
catch (IOException ioEx) {
JOptionPane.showMessageDialog(this, "Cannot disconnect from chatroom!", "Error", JOptionPane.ERROR_MESSAGE);
}
}
private void initFrame () {
JMenuBar menuBar = createMenuBar();
setJMenuBar(menuBar);
JScrollPane responsePanel = createResponsePanel();
add(responsePanel, BorderLayout.NORTH);
JPanel messagePanel = createMessagePanel();
add(messagePanel, BorderLayout.CENTER);
addWindowListener(new WindowAdapter () {
@Override
public void windowClosing (WindowEvent we) {
closeSocket();
System.exit(0);
}
});
new Thread(new Runnable () {
public void run () {
String clientName = null;
String serverResponse = null;
Scanner in = null;
PrintWriter out = null;
try {
in = new Scanner(socket.getInputStream());
out = new PrintWriter(socket.getOutputStream());
}
catch (IOException ioEx) {
JOptionPane.showMessageDialog(ClientFrame.this, "Cannot create input or output stream!",
"Error", JOptionPane.ERROR_MESSAGE);
closeSocket();
System.exit(1);
}
do {
clientName = JOptionPane.showInputDialog("What nickname would you like to use in the chatroom?");
} while (clientName == null);
out.println("#" + clientName);
serverResponse = in.nextLine();
serverResponseArea.append(serverResponse);
}
}).start();
}
private JMenuBar createMenuBar () {
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("Operations");
JMenuItem quit = new JMenuItem("Quit");
quit.addActionListener(new ActionListener() {
@Override
public void actionPerformed (ActionEvent event) {
closeSocket();
System.exit(0);
}
});
menu.add(quit);
menuBar.add(menu);
return menuBar;
}
private JScrollPane createResponsePanel () {
JScrollPane scrlPane = new JScrollPane();
scrlPane.setBorder(BorderFactory.createEmptyBorder(20, 10, 10, 20));
serverResponseArea = new JTextArea(30, 50);
serverResponseArea.setEditable(false);
serverResponseArea.setLineWrap(true);
serverResponseArea.setWrapStyleWord(true);
scrlPane.add(serverResponseArea);
return scrlPane;
}
private JPanel createMessagePanel () {
JPanel msgPanel = new JPanel();
msgPanel.setBorder(BorderFactory.createEmptyBorder(20,10, 10, 20));
msgPanel.setLayout(new BoxLayout(msgPanel, BoxLayout.LINE_AXIS));
JScrollPane srlPanel = createMessageTextPanel();
msgPanel.add(srlPanel);
JButton sdButton = createSendButton();
msgPanel.add(sdButton);
return msgPanel;
}
private JScrollPane createMessageTextPanel () {
JScrollPane mtPanel = new JScrollPane();
messageArea = new JTextArea(15, 35);
messageArea.setEditable(true);
messageArea.setLineWrap(true);
messageArea.setWrapStyleWord(true);
mtPanel.add(messageArea);
return mtPanel;
}
private JButton createSendButton () {
JButton button = new JButton("Send");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed (ActionEvent event) {
String message;
message = messageArea.getText();
output.println(message);
messageArea.setText("");
}
});
return button;
}
}