미니 네트워크 프로젝트 (1) : 화면 구성하기

부트캠프(END)/Java|2022. 6. 23. 17:29

Swing 윈도우를 이용하여 간단한 프로젝트를 진행했다.

위 이미지처럼 왼쪽에는 메뉴 바, 중앙(빨간 영역)에는 주요 콘텐츠를 띄우고,

우측(초록색 영역)에는 채팅 화면을 띄우려 한다.

이 때, 주요 콘텐츠의 내용을 다양하게 구성하기 위해 화면 레이아웃을 여러 개 짜고, 

왼쪽의 메뉴 바 버튼을 클릭할 때마다 각 화면을 띄워주도록 하려 한다.

 

ControllerPanel 이라는 클래스를 만들어 JPanel을 상속받는다.

CardLayout 클래스는 카드 형태로 레이아웃을 모아놓고 원하는 것을 꺼내 사용할 수 있도록 도와준다.

import java.awt.*;
import javax.swing.*;

public class ControllerPanel extends JPanel{
	
	public CardLayout card = new CardLayout(); //모아놓고 원하는 것을 찾아줄 수 있도록 하는 레이아웃
	public HomeForm hf;
	public DetailForm df;
	public MusicFindForm mf = new MusicFindForm();
	public ChatForm cf = new ChatForm();
	public NewsForm nf = new NewsForm();
	
	public ControllerPanel() {
		hf = new HomeForm(this);
		df = new DetailForm(this);
		setLayout(card);
		//add가 가장 위에 있는게 먼저 뜬다.
		add("HF", hf);
		add("DF",df);
		add("MF",mf);
		add("CF",cf);
		add("NF",nf);
	}
}

Main에서는 ActionListener 인터페이스와 JFrame을 상속받아 화면 전환을 구현한다.

ActionListener 인터페이스를 상속받으면 각 버튼을 클릭했을 때 어떤 반응을 보일 지 구현할 수 있다.

package doodoo.main;
import doodoo.client.*;
import doodoo.common.Function;
import doodoo.data.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;

public class NetworkMain extends JFrame implements ActionListener{
  ControllerPanel cp = new ControllerPanel();
  MenuForm menu = new MenuForm();
  WaitForm wr = new WaitForm();
  LoginForm lf = new LoginForm();
  public HomeForm hf;
  public DetailForm df;
  public MovieFindForm mf = new MovieFindForm();
  public ChatForm cf = new ChatForm();
  public NewsForm nf = new NewsForm();

  public NetworkMain() {
    setTitle("무비챗");
    setLayout(null); //사용자 정의 = 직접배치
    cp.setBounds(10, 15, 850, 850);
    add(cp);
    wr.setBounds(980, 15, 250, 700);
    add(wr);

    setSize(1250, 900);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    
    //버튼을 누르면 어떻게 해야 한다=이벤트 등록
    menu.chatBtn.addActionListener(this);
    menu.exitBtn.addActionListener(this);
    menu.homeBtn.addActionListener(this);
    menu.newsBtn.addActionListener(this);
    menu.movieBtn.addActionListener(this);
  }

  public static void main(String[] args) {
    try {
      UIManager.setLookAndFeel("com.jtattoo.plaf.noire.NoireLookAndFeel");
    } catch (Exception ex) {}
    new NetworkMain();
  }

  //버튼 클릭시 처리해 주는 부분 -> 클릭시 자동 시스템(JVM)에 의해 자동 호출된다.
  @Override
  public void actionPerformed(ActionEvent e) {
    if (e.getSource() == menu.chatBtn) {
      cp.card.show(cp, "CF");
    } else if (e.getSource() == menu.exitBtn) {
      try {
        out.write((Function.END + "|\n").getBytes());
      } catch (Exception ex) {}
    } else if (e.getSource() == menu.movieBtn) {
      cp.card.show(cp, "MF");
    } else if (e.getSource() == menu.homeBtn) {
      cp.card.show(cp, "HF");
    } else if (e.getSource() == menu.newsBtn) {
      cp.card.show(cp, "NF");
    }
  }

 

 

더보기
setLayout(new GridLayout(3,2,5,5));//3줄*2칸으로 좌우/위아래공백 5씩
//		setLayout(new FlowLayout());//일자 배치
		add(b1); add(b2);
		add(b3); add(b4);
		add(b5); add(b6);
setLayout(new FlowLayout());//일자 배치
add(b1); add(b2);
add(b3); add(b4);
add(b5); add(b6);
//		layout 설정하지 않으면 디폴트로 BorderLayout
		add("North",b1); add("Center",b2);
		add("East",b3); add("West",b4);
		add("South",b5);

 

 

JMenuItem과 JMenuBar, JMenu등을 활용하면 이런 식의 레이아웃도 구현할 수 있다.

package doodoo.main;
import doodoo.client.*;
import doodoo.common.Function;
import doodoo.data.Music;
import doodoo.data.MusicSystem;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.*;
import java.io.*;

import javax.swing.*;
public class NetworkMain extends JFrame implements ActionListener {
  ControllerPanel cp = new ControllerPanel();
  MenuForm menu = new MenuForm();
  WaitForm wr = new WaitForm();
  LoginForm lf = new LoginForm();

  JMenuItem home = new JMenuItem("홈");
  JMenuItem music = new JMenuItem("음악검색");
  JMenuItem chat = new JMenuItem("채팅");
  JMenuItem news = new JMenuItem("뉴스");
  JMenuItem exit = new JMenuItem("종료");

  public NetworkMain() {
    setTitle("네트워크 뮤직 프로그램");
    setLayout(null); //사용자 정의=직접배치
    menu.setBounds(10, 15, 960, 350);

    JMenuBar bar = new JMenuBar();
    JMenu menu = new JMenu("SITE");
    menu.add(home);
    menu.addSeparator(); //구분선 추가
    menu.add(music);
    menu.addSeparator();
    menu.add(chat);
    menu.addSeparator();
    menu.add(news);
    menu.addSeparator();
    menu.add(exit);

    bar.add(menu);
    setJMenuBar(bar);

    cp.setBounds(10, 65, 960, 820);
    add(cp);
    wr.setBounds(980, 15, 250, 700);
    add(wr);

    setSize(1250, 900);

    //버튼을 누르면 어떻게 해야 한다=이벤트 등록

    chat.addActionListener(this);
    exit.addActionListener(this);
    home.addActionListener(this);
    news.addActionListener(this);
    music.addActionListener(this);

  }

 

 

댓글()