MainScreen, MultiClient, MultiClientThread, MultiServer, MultiServerThread로 되어 있습니다.
MainScreen에서 chat버튼을 누르면 MultiClient로 만든 GUI가 나오면서 채팅이 시작되게 하고 싶습니다.
지금은 Client에 직접 id(nickname)과 ip를 명령행 인자로 받아서 MultiClient를 실행시키고 있는데
어떻게 하면 MainScreen에서 chat버튼을 누르면 MainScreen에서 설정했던 값들을 적용시켜서 MultiClient를 실행시킬 수 있을까요 ㅠ 방법을 모르겠습니다
public MultiClient(String argIp, String argId){
ip = argIp;
id = argId;
jframe = new JFrame("Multi Chatting");
jtf = new JTextField(30); //JTextField는 한줄짜리 입력창
// jta = new JTextArea("", 10, 50); //JTextArea는 여러줄짜리 입력창
jtp = new JTextPane();
jtp.setPreferredSize(new Dimension(100, 500));
jlb1 = new JLabel("Usage ID : [[ " + id + " ]]");
jlb2 = new JLabel("IP : "+ ip);
jbtn = new JButton("종료");
//jbtn2 = new JButton("사용자 목록");
jp1 = new JPanel();
jp2 = new JPanel();
jlb1.setBackground(Color.yellow);
jlb2.setBackground(Color.green);
jtp.setBackground(Color.pink);
//jta.setBackground(Color.pink);
jp1.setLayout(new BorderLayout());
jp2.setLayout(new BorderLayout());
jp1.add(jbtn, BorderLayout.EAST);
//jp1.add(jbtn2, BorderLayout.WEST);
jp1.add(jtf, BorderLayout.CENTER);
jp2.add(jlb1, BorderLayout.CENTER);
jp2.add(jlb2, BorderLayout.EAST);
jframe.add(jp1, BorderLayout.SOUTH);
jframe.add(jp2, BorderLayout.NORTH);
JScrollPane jsp = new JScrollPane(jtp, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
jframe.add(jsp, BorderLayout.CENTER);
jtf.addActionListener(this); //JTextField에 ActionListener연결
jbtn.addActionListener(this); //JButton에 ActionListener 연결
//JFrame에 WindowListener를 연결하는데, WindowsAdapter 익명클래스를 생성하면서 필요한 메서드들(windowClosing(), windowOpened())을 오버라이딩 했다.
jframe.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
try{
//윈도우를 닫을 때 사용자가 종료 메세지를 보낸 것과 동일하게 문자열을 만들어 소켓에 기록한다.
oos.writeObject(id+"#exit");
}catch(IOException ee){
ee.printStackTrace();
}
System.exit(0); //어플리케이션 종료
}
public void windowOpened(WindowEvent e){
//윈도우가 열리면 JTextField에 커서를 둔다.
jtf.requestFocus();//키 이벤트를 받을 컴포넌트를 강제로 설정(창이열리면 글쓰는공간에 포커스맞춰짐)
}
});
//jta.setEditable(false); //JTextArea 를 읽기전용으로
jtp.setEditable(false); //JTextpane을 읽기전용으로
//스크린의 사이즈를 얻어오기 위해서 Toolkit 객체를 생성한다.
Toolkit tk = Toolkit.getDefaultToolkit();
//Toolkit의 getScreenSize() 메서드를 사용해서 스크린사이즈를 담은 Dimension 객체를 리턴받는다.
Dimension d = tk.getScreenSize();
int screenHeight = d.height;
int screenWidth = d.width;
jframe.pack(); //JFrame의 사이즈를 서브콤포넌트들에 맞게 자동으로 조정해준다.
jframe.setLocation((screenWidth - jframe.getWidth())/2, (screenHeight - jframe.getHeight())/2);
jframe.setResizable(false);
jframe.setVisible(true);
//jtp.setEditable(false);
}
//ActionListener 인터페이스가 강제하는 메서드
public void actionPerformed(ActionEvent e){
//ActionEvent의 getSource() 메서드는 이벤트를 발생시킨 객체 자체를 리턴시켜 준다.
Object obj = e.getSource();
String msg = jtf.getText(); //JTextField에서 값을 읽어오는 getText() 메서드
//ActionListener에 연결한 객체가 두 개 이상이므로 IF문을 사용해 구분하였다.
//JTextField의 요청일 경우
if(obj == jtf){
if(msg == null || msg.length()==0){ //메세지 내용이 없을 경우
//Alert창 : JOptionPane.showMessageDialog(소속되는 상위객체, 메세지객체, 메세지창제목, 메세지창종류)
JOptionPane.showMessageDialog(jframe, "글을 쓰세요", "경고", JOptionPane.WARNING_MESSAGE);
}else{ //메세지 내용이 있을 경우
try{
oos.writeObject(id+"#"+msg); //메세지를 직렬화 하여 소켓에 기록 //id#msg
}catch(IOException ee){
ee.printStackTrace();
}
jtf.setText(""); //기록한 후에는 입력창을 지우고 다시 입력받을 준비를 한다.
}
//걍 System.exit(0)를 줄인 메서드
public void exit(){
System.exit(0);
}
//객체 생성과 동시에 실행시키고자 만든 메서드
public void init() throws IOException{
socket = new Socket(ip, 5002); //서버에 연결하는 소켓 객체 생성
System.out.println("connected..");
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
//MultiClientThread 객체를 생성하면서 자신(MultiClient)을 인자로 넘긴다.
MultiClientThread ct = new MultiClientThread(this);
//MultiClientThread 스레드를 시작한다.
Thread t = new Thread(ct);
t.start();
}
public static void main(String[] args)throws IOException{
//JFrame.setDefaultLookAndFeelDecorated(true);
MultiClient cc = new MultiClient(args[0], args[1]);
cc.init();
}
public ObjectInputStream getOis(){
return ois;
}
public JTextPane getJtp() {
return jtp;
}
public ObjectOutputStream getOos() {
return oos;
}
/ public JTextArea getJta(){
return jta;
}
/
public String getId(){
return id;
}
public void setId(String id) {
this.id = id;
}
public void append(String s) {
try {
Document doc = jtp.getDocument();
doc.insertString(doc.getLength(), s, null);
}catch(BadLocationException exc) {
exc.printStackTrace();
}
}
public void vote() {
votef = new JFrame("강퇴투표");
votef.setBounds(900, 500, 130, 100);
btagree = new JButton("찬성");
btdisagree = new JButton("반대");
votef.add(btagree, BorderLayout.WEST);
votef.add(btdisagree, BorderLayout.EAST);
votef.setVisible(true);
btagree.addActionListener(this);
btdisagree.addActionListener(this);
}
MultiClientThread.java
package chatprogram;
import java.io.IOException;
import chatprogram.MultiClient;
public class MultiClientThread extends Thread{
private MultiClient mc;
해결하고자 하는 문제
MainScreen, MultiClient, MultiClientThread, MultiServer, MultiServerThread로 되어 있습니다. MainScreen에서 chat버튼을 누르면 MultiClient로 만든 GUI가 나오면서 채팅이 시작되게 하고 싶습니다.
코드 혹은 오류
package chatprogram;
import javax.swing.; import java.awt.; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;
class Screen extends JFrame implements ActionListener, ItemListener, Runnable{ public JLabel jl1, jl2, jl3, jl4, jl5; static JTextField jtf; private JComboBox jcb1; private JButton jb1, jb2, jb3;
}
class Picture22 extends JFrame implements ActionListener{ JTextArea jta; JButton jb1; String memo = "";
}
public class MainScreen { public static void main(String[] args){ Screen sc = new Screen(); } }
MultiServer.java
package chatprogram;
import java.io.; import java.net.; import java.util.*;
public class MultiServer { private ArrayList list;
private Socket socket;
}
MultiServerThread
package chatprogram;
import java.net.; import java.io.;
public class MultiServerThread implements Runnable { private Socket socket; private MultiServer ms; private ObjectInputStream ois; private DataOutputStream dos; private ObjectOutputStream oos; private int count = 0, count1 = 0; public MultiServerThread(MultiServer ms) { this.ms = ms;//서버 정보 받아옴 }
}
MultiClient
package chatprogram;
import java.awt.BorderLayout; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket;
import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.JTextPane; import javax.swing.text.BadLocationException; import javax.swing.text.Document;
public class MultiClient implements ActionListener{ private Socket socket;//원통 private ObjectInputStream ois;//받는용 private ObjectOutputStream oos;//출력용 private JFrame jframe; private JTextField jtf; // private JTextArea jta; private JLabel jlb1, jlb2; private JPanel jp1, jp2; private String ip; private String id; private JButton jbtn; private JTextPane jtp; private JFrame votef; private JButton btagree, btdisagree;
//생성자 ? IP(연결하려는 서버IP) 와 ID를 인자로 받는다.
//JFrame에 WindowListener를 연결하는데, WindowsAdapter 익명클래스를 생성하면서 필요한 메서드들(windowClosing(), windowOpened())을 오버라이딩 했다.
//윈도우를 닫을 때 사용자가 종료 메세지를 보낸 것과 동일하게 문자열을 만들어 소켓에 기록한다. oos.writeObject(id+"#exit"); }catch(IOException ee){ ee.printStackTrace(); } System.exit(0); //어플리케이션 종료 } public void windowOpened(WindowEvent e){ //윈도우가 열리면 JTextField에 커서를 둔다. jtf.requestFocus();//키 이벤트를 받을 컴포넌트를 강제로 설정(창이열리면 글쓰는공간에 포커스맞춰짐) } }); //jta.setEditable(false); //JTextArea 를 읽기전용으로 jtp.setEditable(false); //JTextpane을 읽기전용으로 //스크린의 사이즈를 얻어오기 위해서 Toolkit 객체를 생성한다. Toolkit tk = Toolkit.getDefaultToolkit(); //Toolkit의 getScreenSize() 메서드를 사용해서 스크린사이즈를 담은 Dimension 객체를 리턴받는다. Dimension d = tk.getScreenSize(); int screenHeight = d.height; int screenWidth = d.width; jframe.pack(); //JFrame의 사이즈를 서브콤포넌트들에 맞게 자동으로 조정해준다. jframe.setLocation((screenWidth - jframe.getWidth())/2, (screenHeight - jframe.getHeight())/2); jframe.setResizable(false); jframe.setVisible(true);
//ActionEvent의 getSource() 메서드는 이벤트를 발생시킨 객체 자체를 리턴시켜 준다. Object obj = e.getSource(); String msg = jtf.getText(); //JTextField에서 값을 읽어오는 getText() 메서드 //ActionListener에 연결한 객체가 두 개 이상이므로 IF문을 사용해 구분하였다. //JTextField의 요청일 경우 if(obj == jtf){ if(msg == null || msg.length()==0){ //메세지 내용이 없을 경우 //Alert창 : JOptionPane.showMessageDialog(소속되는 상위객체, 메세지객체, 메세지창제목, 메세지창종류) JOptionPane.showMessageDialog(jframe, "글을 쓰세요", "경고", JOptionPane.WARNING_MESSAGE); }else{ //메세지 내용이 있을 경우 try{ oos.writeObject(id+"#"+msg); //메세지를 직렬화 하여 소켓에 기록 //id#msg }catch(IOException ee){ ee.printStackTrace(); }
//JButton의 요청일 경우 (종료버튼) }else if(obj == jbtn){ try{ oos.writeObject(id+"#exit"); //종료메세지 생성후 전송 }catch(IOException ee){ ee.printStackTrace(); } System.exit(0); //어플리케이션 종료 }/else if(obj == jbtn2) { System.out.println(); }/else if(obj == btagree){ System.out.println(btagree.getText()); try { oos.writeObject(id+"#"+"voteY");//id#voteY }catch(IOException e1) { e1.printStackTrace(); } votef.dispose(); }else if(obj == btdisagree) { System.out.println(btdisagree.getText()); try { oos.writeObject(id+"#"+"voteN");//id#voteN }catch(IOException e1) { e1.printStackTrace(); } } }
//객체 생성과 동시에 실행시키고자 만든 메서드
//MultiClientThread 객체를 생성하면서 자신(MultiClient)을 인자로 넘긴다. MultiClientThread ct = new MultiClientThread(this); //MultiClientThread 스레드를 시작한다. Thread t = new Thread(ct); t.start(); }
/ public JTextArea getJta(){ return jta; } /
MultiClientThread.java
package chatprogram;
import java.io.IOException;
import chatprogram.MultiClient;
public class MultiClientThread extends Thread{ private MultiClient mc;