입력 스트림에서 off부터 시작하여, len개를 읽어 byte 배열에 저장, 읽은 갯수를 반환
void
close()
시스템의 자원을 반환하고 입력 스트림을 닫는다. (파일)
▶ read() 메소드
InputStream is = new FileInputStream("C:/test.jpg");
int readByte;
//모든 InputStream 하위 객체 read() : 읽은 내용이 없으면 -1 반환
while((readByte = is.read()) != -1){}
▶ 키보드에서 읽어오기 : System.in
package mymain.input;
import java.io.InputStream;
public class _01_KeyboardInputTest {
public static void main(String[] args) throws Exception {
int ch;
//키보드의 입력값을 받는 inputStream
//System객체 내에 포함관계로 inputStream이 생성되어 있는 상태
InputStream is = System.in;
System.out.println("종료하려면 [Ctrl+Z]");
while((ch = is.read()) != -1) {
System.out.printf("%c",ch);
}
}
▶ 파일에서 읽어오기 : FileInputStream("파일경로")
package mymain.input;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class _02_FileInputTest {
public static void main(String[] args) throws IOException {
InputStream is = new FileInputStream("src/mymain/input/_02_FileInputTest.java");
int ch;
while((ch = is.read())!=-1) {
System.out.printf("%c",ch);
}
is.close();
}
}
▶ 네트워크에서 읽어오기 : URL(String url) > openStream()
package mymain.input;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
public class _03_NetWorkInputStream {
public static void main(String[] args) throws IOException {
URL url = new URL("https://www.naver.com");
InputStream is = url.openStream();
int ch;
while((ch = is.read())!=-1) {
System.out.printf("%c",ch);
}
}
}
(2) OutputStream 메서드
리턴타입
메소드
void
write()
출력 스트림으로 1byte씩 보낸다.
void
write(byte[] b)
출력 스트림에 byte[] b의 값을 보낸다.
void
write(byte[] b, int off, int len)
출력 스트림에 off부터 시작해서 len개 만큼 보낸다.
void
flush()
버퍼에 잔류하는 모든 바이트를 출력
void
close()
시스템의 자원을 반납하고 출력 스트림을 닫는다. (파일)
▶ read() 메소드
OutputStream os = new FileOutputStream("C:/test.txt");
byte[] data = "ABC".getBytes();
for(int i = 0; i < data.length; i++){
os.write(data[i]);
}
▶ 모니터로 출력하기 : System.out
package mymain.output;
import java.io.IOException;
import java.io.OutputStream;
public class _01_MonitorTest {
public static void main(String[] args) throws IOException {
OutputStream os = System.out;
//자바 -> 출력 스트림 -> 키보드버퍼로 문자를 전송
os.write(65);
String msg = "안녕";
byte[] msg_bytes = msg.getBytes();
os.write(msg_bytes);
int n = 1004;
String s = String.valueOf(n);
os.write(s.getBytes());
boolean bOk = true;
String b = String.valueOf(bOk);
os.write(b.getBytes());
//키보드 커퍼를 비우면서 콘솔로 전송
os.flush();
}
}
▶ 파일로 출력하기 : FileOutputStream("파일경로");
package mymain.output;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class _02_FileOutTest {
public static void main(String[] args) throws Exception{
OutputStream os = new FileOutputStream("a.txt");
os.write('A');
String name = "홍길동";
byte[] sArr = name.getBytes();
os.write(sArr);
int n = 1994;
os.write(String.valueOf(n).getBytes());
os.flush();
os.close();
}
}
(3) 바이트 배열 단위로 읽어오기/보내기
가. InputStream/OutputStream의 read(byte[] b), write(byte[] b) 사용
package mymain.input;
import java.io.FileInputStream;
import java.io.InputStream;
public class _04_InputStream_Array {
public static void main(String[] args) throws Exception{
InputStream is = new FileInputStream("src/mymain/input/_04_InputStream_Array.java");
int readByteNo;
byte[] readBytes = new byte[8];
// is.read(readBytes, 1, 8); <- index 1부터 8개
readByteNo = is.read(readBytes);
for(int i = 0; i < readBytes.length; i++)
System.out.printf("%c",readBytes[i]);
is.close();
}
}
package mymain.output;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class _03_OutputStream_Array {
public static void main(String[] args) throws Exception{
OutputStream os = new FileOutputStream("a2.txt");
byte[] output = "ABC".getBytes();
// os.write(output,1,2); /*: index1부터 2개*/
os.write(output);
os.close();
}
}
나. ByteArrayInputStream/ByteArrayOutputStream 객체 사용
package mymain.input;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;
public class _04_InputStream_Array2 {
public static void main(String[] args) throws Exception{
byte[] inSrc = {0,1,3,4,5,6};
byte[] outSrc = null;
ByteArrayInputStream input = null;
ByteArrayOutputStream output = null;
input = new ByteArrayInputStream(inSrc);
output = new ByteArrayOutputStream();
int data = 0;
while((data = input.read()) != -1) {
output.write(data);
}
outSrc = output.toByteArray();
System.out.println("Input Source : "+Arrays.toString(inSrc));
System.out.println("Output Source : "+Arrays.toString(outSrc));
}
}
//객체 생성
InetAddress ip = InetAddres.getLocalHost();
//객체 이름, 주소 추출 : String으로 반환
String ipName = ip.getHostName();
String ipAddress = ip.getHostAddress();
[2] 도메인 이름으로 IP 주소 얻으려 할때
//도메인에서 단일 ip 주소 가져오기
InetAddress ip = InetAddress.getByName("www.naver.com");
//도메인에서 여러개의 ip주소 가져오기
InetAddress[] ipArr = InetAddress.getAllByName("www.naver.com");
package tcpProtocol;
import java.io.OutputStream;
import java.net.Socket;
public class BasicSend {
public static void main(String[] args) throws Exception{
//[1] 소켓을 연다.(연결할 서버소켓의 주소와 포트를 작성)
Socket socket = new Socket("localhost",50000);
OutputStream os = socket.getOutputStream();
for(int i = 1; i <= 3; i++) {
//[2] 소켓의 OutputStream을 통해 byte단위의 데이터를 전송한다.
String data = "데이터"+i;
os.write(data.getBytes("UTF-8"));
}
os.flush();
//[3] 소켓 연결 끊기
//socket.close(); --> 의도적인 종료 : -1 값을 전달한다.
socket.close();
}
}
[2] 수신 방법
package tcpProtocol;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class BasicAccept {
public static void main(String[] args) throws Exception{
//[1] 서버 소켓을 연다.
ServerSocket serverSocket = new ServerSocket(50000);
try {
//[2] 소켓을 연다.
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
//무한 루프로 수신 대기
System.out.println("[수신 데이터]");
while(true) {
//[3] InputStream을 통해 바이트단위 데이터를 가져온다.
byte[] byteArr = new byte[300]; //한글 3byte->100자씩 읽을 것
int len = is.read(byteArr);
if(len == -1) break;
String data = new String(byteArr,0,len,"UTF-8");
//[4] 수신 data 콘솔에 출력
System.out.println(data);
}
} catch (IOException e) {
System.out.println("[연결 종료]");
}
}
}
[연습 예제_1] TCP 1:1 전송방식으로 로컬컴퓨터에서 에코메시지 전달하기
<Client>
package tcpProtocol;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.*;
public class Client extends JFrame{
JTextArea textMonitor;
JTextField textInput;
JButton button;
Socket socket;
Client(){
/* Initial Window UI Design */
super("Chat for Client");
setLocation(300,300);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
init_UiDesign();
pack();
/* TCP Socket Communication */
init_buttonAction();
init_socket();
}//end Client()
/////////////////////////////////////////////////////
/* TCP Socket Communication Method */
private void init_buttonAction() {
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String textMessage = String.format("[사용자] %s%n", textInput.getText().trim());
if(textMessage.isEmpty()) {
JOptionPane.showMessageDialog(textMonitor,"메세지를 입력하세요.");
return;
}else {
//textMonitor.append(textMessage);
echo_message();
textInput.setText("");
return;
}
}
});
}
private void init_socket() {
try {
socket = new Socket("localhost",50000);
} catch (UnknownHostException e) {
System.out.println("해당 호스트를 찾을 수 없습니다.");
} catch (IOException e) {
System.out.println("포트가 비정상적으로 닫혀있습니다.");
}
}
protected void echo_message() {
send_message();
receive_message();
}
private void send_message() {
//send Message to server
try {
OutputStream outStream = socket.getOutputStream();
String userMessage = String.format("[사용자] %s%n", textInput.getText().trim());
//append message to Monitor
textMonitor.append(userMessage);
outStream.write(userMessage.getBytes());
outStream.flush();
} catch (IOException e) {
System.out.println("전송에 오류가 발생했습니다.");
}
}
private void receive_message() {
//receive Message from server
try {
byte[] readBytes = new byte[300];
int readNum = socket.getInputStream().read(readBytes);
String echoedMessage = new String(readBytes,0,readNum);
//append message to Monitor
textMonitor.append(echoedMessage);
} catch (IOException e) {
System.out.println("수신에 오류가 발생했습니다.");
}
}
/* UI Design Method */
private void init_UiDesign() {
//textMonitor : where chat text reveals
textMonitor = new JTextArea();
textMonitor.setBackground(new Color(0x7BC4C4));
textMonitor.setEditable(false);
JScrollPane jsp = new JScrollPane(textMonitor);
textMonitor.setPreferredSize(new Dimension(300,200));
this.add(jsp);
//textInput : where user types texts & send
JPanel jpl = new JPanel(new BorderLayout());
textInput = new JTextField();
button = new JButton("전송");
jpl.add(textInput);
jpl.add(button,"East");
this.add(jpl,"South");
}
public static void main(String[] args) {
new Client();
}//end main
}
<Server>
package tcpProtocol;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.*;
public class Server extends JFrame{
JTextArea textMonitor;
JTextField textInput;
JButton button;
ServerSocket serverSocket;
Socket socket;
Server(){
/* Initial Window UI Design */
super("Chat for Server");
setLocation(300,300);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
init_UiDesign();
pack();
/* TCP Socket Communication */
init_socket();
}//end Client()
/////////////////////////////////////////////////////
/* TCP Socket Communication Method */
private void init_socket() {
try {
serverSocket = new ServerSocket(50000);
socket = serverSocket.accept();
while(true) {
//receive Message from client
byte[] readBytes = new byte[300];
int readNum = socket.getInputStream().read(readBytes);
String[] userMessage = new String(readBytes,0,readNum).split("]");
//append message to Monitor
textMonitor.append(new String(readBytes,0,readNum));
//send Message to client
OutputStream outStream = socket.getOutputStream();
String echoedMessage = String.format("[에코]%s%n",userMessage[1]);
//append message to Monitor
textMonitor.append(echoedMessage);
outStream.write(echoedMessage.getBytes());
outStream.flush();
}
} catch (IOException e) {
JOptionPane.showMessageDialog(this, e.getMessage());
}
}
/* UI Design Method */
private void init_UiDesign() {
//textMonitor : where chat text reveals
textMonitor = new JTextArea();
textMonitor.setBackground(new Color(0x7BC4C4));
textMonitor.setEditable(false);
JScrollPane jsp = new JScrollPane(textMonitor);
textMonitor.setPreferredSize(new Dimension(300,200));
this.add(jsp);
//textInput : where user types texts & send
JPanel jpl = new JPanel(new BorderLayout());
textInput = new JTextField();
button = new JButton("전송");
jpl.add(textInput);
jpl.add(button,"East");
this.add(jpl,"South");
}
public static void main(String[] args) {
new Server();
}//end main
}
>>결과
8. UDP 소켓 프로그래밍
- UDP는 소포와 같이 서버소켓을 통한 연결 없이 수신, 송신만 가능한 형태이다.
- 통신 선로가 고정적이지 않음
- 데이터 손실이 발생 가능
- 대신 TCP보다는 빠르게 전송이 가능하다
이것이 자바다 참조
[1] 송신하는 법
//송신하는 법
//[1] DatagramSocket를 연다.
DatagramSocket datagramSocket = new DatagramSocket();
//만약, multi-cast방식으로 전달할 경우,
//MulticastSocket multicastSocket = new MulticastSocket();
InetAddress ia = InetAddress.getByName("localhost"); //수신되는 곳의 주소
//[2] 전달할 데이터를 패킷으로 패킹한다.
String data = "전달 데이터";
byte[] byteArr = data.getBytes("UTF-8"); //UTF-8방식으로 바이트 변환
DatagramPacket packet = new DatagramPacket(
byteArr, byteArr.length,ia,포트번호
);
//[3] DatagramSocket을 통해 패킷을 전송한다.(바이트단위로 전송된다)
datagramSocket.send(packet);
//[4] DatagramSocket을 닫아준다.
datagramSocket.close();
[2] 수신하는 법
//수신하는 법
//[1] DatagramSocket을 연다.
DatagramSocket datagramSocket = new DatagramSocket(포트번호);
//[2] 패킷을 받을 배열과 길이를 지정한다.
DatagramPacket datagramPacket = new DatagramPacket(받은 배열을 저장할 바이트 배열,배열의 길이);
//[3] 패킷을 받는다.
datagramSocket.receive(datagramPacket);
//[4] 소켓을 닫는다.
datagramSocket.close();
[연습 예제_간단한 데이터 송수신]
<Client>
package udpProtocol;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Client {
public static void main(String[] args) throws Exception{
//[1] 데이터그램 소켓으로 가야하는 곳을 지정
DatagramSocket datagramSocket = new DatagramSocket();
InetAddress ia = InetAddress.getByName("localhost");
for(int i = 1; i <= 3; i++) {
//[2] 데이터그램 패킷으로 데이터를 묶어둔다.
String data = "데이터"+i;
byte[] byteArr = data.getBytes("UTF-8");
DatagramPacket datagramPacket = new DatagramPacket(
byteArr, byteArr.length,ia,8000
);
//[3] 패킷을 소켓을 통해 전송한다.
datagramSocket.send(datagramPacket);
}//end for
//[4] 소켓을 닫는다.
datagramSocket.close();
}//end main
}
<Server>
package udpProtocol;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Server {
public static void main(String[] args) throws Exception{
//[1] 소켓을 연다.
DatagramSocket datagramSocket = new DatagramSocket(8000);
//[2] 패킷 단위로 데이터를 받는다.
//쓰레드를 형성해서 무한 루프로 데이터를 받는다.
Thread thread = new Thread() {
@Override
public void run() {
System.out.println("수신 시작");
try {
while(true) {
DatagramPacket packet = new DatagramPacket(new byte[100],100);
datagramSocket.receive(packet);
String data = new String(packet.getData(),0,packet.getLength(),"UTF-8");
System.out.println("[받은 내용 : "+packet.getSocketAddress()+"]"+data);
}
} catch (IOException e) {
System.out.println("[수신 종료]");
}
}
};//end thread
thread.start();
Thread.sleep(10000);
datagramSocket.close();
}//end main
}
>> 수신 결과
수신 시작
[받은 내용 : /127.0.0.1:55273]데이터1
[받은 내용 : /127.0.0.1:55273]데이터2
[받은 내용 : /127.0.0.1:55273]데이터3
[수신 종료]
- getKeyCode() : void ---- Virtual Code를 확인할 수 있다.
[참고 : 키보드 정보가 들어오는 방식] - 각 회사의 키보드 -> OS/JVM에서 Virtual Key Code로 받음(각 회사 키보드 동일하게 인식) - 키보드의 shift+[ ] 예를 들어, 소문자 a를 인식하는 게 아니다. (문자는 모두 대문자로 인식) - 말그대로 어떤 키보드를 눌렀는지를 값으로 받는다.
▶ KeyEvent
- VK_xxxxx : Virtual Code Key를 의미하는 상수로, 언더바(_) 다음에 "LEFT","RIGHT","Q","R"등 키보드 키에 대한 상수를 받을 수 있다.
▶ Dimension
- Dimension객체 생성 후, 인스턴스 변수 width/height를 통해 현재 사용하는 컴퓨터의 화면 해상도 얻기
▶ Toolkit
- Dimension객체를 생성할 때 사용할 클래스다.
- Toolkit : 자원(이미지등) 정보 구하는 객체
- getDefaultToolkit().getScreenSize() : 툴키트 안의 해상도 사이즈를 구하는 메소드이다.
▶ Point
- (x,y)좌표를 입력할 수 있는 객체이다.
■ 키보드 좌(<-)/우(->)/상/하를 누를 때 윈도우창 이동시키기 (단, 모니터 화면 밖으로 나갈 수 없다.)
package window;
import java.awt.Dimension;
import java.awt.HeadlessException;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
public class MoveExceptMonitor extends JFrame{
int screen_w,screen_h; //모니터 화면 해상도 크기
public MoveExceptMonitor() throws HeadlessException {
super("KeyEvent 연습");
this.setSize(400,400);
this.setLocation(200,200);
this.setVisible(true);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//화면 해상도 구하기
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
screen_w = d.width;
screen_h = d.height;
//키보드초기화
//키보드 입력시 이벤트를 어떻게 발생시킬 것인지 작성
init_key_event();
}
private void init_key_event() {
KeyAdapter adapter = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
//눌린 키 정보 얻어보기
int key = e.getKeyCode();
//현재 윈도우의 위치
//Point pt = MoveExceptMonitor.this.getLocation();
Point pt = getLocation();
//현재 객체의 너비/높이
int sizeWidth = getWidth(); //JDK가 알아서 외부클래스로 인식한다.
int sizeHeight = getHeight();
if(key==KeyEvent.VK_LEFT) {
pt.x = pt.x - 10;
if(pt.x < 0) {
pt.x = 0;
}
}else if(key==KeyEvent.VK_RIGHT) {
pt.x = pt.x + 10;
if(pt.x+sizeWidth > screen_w) {
pt.x = screen_w - sizeWidth;
}
}else if(key==KeyEvent.VK_UP) {
pt.y = pt.y - 10;
if(pt.y < 0) {
pt.y = 0;
}
}else if(key==KeyEvent.VK_DOWN) {
pt.y = pt.y + 10;
if(pt.y+sizeHeight > screen_h) {
pt.y = screen_h - sizeHeight;
}
}
//바뀐 포인트 값으로 윈도우 위치 이동
setLocation(pt.x,pt.y);
}
};
this.addKeyListener(adapter);
}
public static void main(String[] args) {
new MoveExceptMonitor();
}
}
[비유] 상점 주인 - 상점 주인이 가게에 들어와 직원들을 살핀다. - 그는 뭔가 문제가 발생한다면 행동을 할 준비를 하고 있다.(ActionListner) - 직원A가 일할 시간에 또 사무실에서 잠을 자고 있다. - 그는 마음먹은대로 행동을 돌입해야겠다 생각한다.(AcitionEvent) - 그는 직원A에게 다음번에 자르겠다 경고한다.(Action)
- 아래의 예제들에서 JFrame의 세팅값(위치/크기/보임상태/종료버튼방식)은 모두 동일하게 할 것이다.
■ BorderLayout
- JFrame컨테이너의 디폴트 배치관리자는 BorderLayout이다.
- BorderLayout은 컴포넌트 간격을 지정하지 않을 거면 초기화를 딱히 해줄게 없다.
- 컴포넌트를 넣어줄 때 어느 영역(North/South/West/East/Center)에 위치시킬지 지정해준다.
package window;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class BorderLayoutTest extends JFrame{
BorderLayoutTest(){
//JFrame의 기본 세팅 메소들
this.setTitle("BorderLayout Test");
this.setLocation(200,200);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//버튼 컴포넌트를 5개 추가 - add()
//[레이아웃] 디폴트로 BorderLayout으로 설정되어 있음
//[1] 먼저 버튼 객체부터 생성한다.
// **버튼 생성메소드 JButton("버튼 안에 들어갈 문자열")
// 이미지나 아이콘도 넣을 수 있다.
JButton jbtNorth = new JButton("NORTH");
JButton jbtSouth = new JButton("SOUTH");
JButton jbtWest = new JButton("WEST");
JButton jbtEast = new JButton("EAST");
JButton jbtCenter = new JButton("CENTER");
//[2] 버튼을 컨테이너에 넣어둔다. **이때, 버튼이 들어갈 위치를 지정한다.
this.add(jbtNorth,BorderLayout.NORTH);
this.add(jbtSouth,"South");
this.add(jbtWest,BorderLayout.WEST);
this.add(jbtEast,"East");
this.add(jbtCenter); //생략시 디폴트 CENTER로 지정
//[유의점] 버튼 컴포넌트들을 먼저 JFrame에 넣어주고 JFrame 사이즈를 잡아줘야 한다.
// why? BorderLayout에서는 윈도우창 크기에 따라서 버튼의 너비가 자동 설정되기 때문.
this.setSize(400,400);
}
public static void main(String[] args) {
new BorderLayoutTest();
}
}
>> 실행 결과
■ FlowLayout
- JFrame컨테이너의 디폴트 배치관리자는 BorderLayout이다.
- Container의 setLayout() 메소드를 사용해서 레이아웃을 FlowLayout으로 변경한다.
*레이아웃도 객체이기 때문에 레이아웃 객체 생성을 먼저 해줘야한다.
- FlowLayout을 생성할 때 컴포넌트들의 정렬방식과 수평/수직 간격을 초기화해준다.
*기본적으로 최상단부터 나열시키는데, 정렬방식은 그의 좌(LEADING), 중간(CENTER), 끝(TRAILING) 중 하나를 고를 수 있다.
package window;
import java.awt.FlowLayout;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class FlowLayoutTest extends JFrame{
FlowLayoutTest() {
//JFrame 기본 세팅
this.setTitle("FlowLayout Test");
this.setLocation(400,400);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
//Container 레이아웃 변경
//[참고] setLayout()의 매개변수는 LayoutManager 인터페이스다.
//[생성시] 정렬방식, 수직/수평간격 지정
this.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));;
//컴포넌트들을 생성해서 넣어준다.
JLabel label = new JLabel("Select Language");
this.add(label);
String[] comLang = {"Java","C","C++","PHP","Javascript","python"};
JComboBox<String> comLangBox = new JComboBox<String>(comLang);
comLangBox.setSelectedIndex(0);
this.add(comLangBox);
this.setSize(400,400);
}
public static void main(String[] args) {
new FlowLayoutTest();
}
}
>> 실행결과
■ GridLayout
- Container의 setLayout() 메소드를 사용해서 레이아웃을 GridLayout으로 변경한다.
*이번에도 레이아웃 객체생성을 먼저한다.
- Grid레이아웃을 생성할 때, 행/열 갯수, 수평/수직 간격을 초기화한다.
- Grid는 행을 우선으로 해서 컨포넌트들의 열의 너비를 지정하므로 이점을 유의한다.
package window;
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class GridTest extends JFrame{
public GridTest() {
super("GridLayout Test");
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocation(200,200);
//Grid로 레이아웃 변경
GridLayout g = new GridLayout(3,3,10,10);
this.setLayout(g);
//컴포넌트 생성, 추가
for(int i = 0; i < 10; i++) {
JPanel jp1 = new JPanel();
jp1.add(new JLabel("PANEL"));
jp1.setSize(30,30);
Color c = new Color(0xfe9cc3);
jp1.setBackground(c);
this.add(jp1);
}
setSize(400,400);
}
public static void main(String[] args) {
new GridTest();
}
}
>> 실행 결과
■ CardLayout
- JFrame 윈도우창의 디폴트 BorderLayout배치는 그대로 둔다.
- 윈도우 창 상단에 패널+버튼들로 탭을 만든다. *패널 - FlowLayout
- 윈도우 창 하단에 패널+패널들로 카드를 만든다. *패널 - CardLayout
*묶어주는 안에 카드를 넣을 때는, 문장열로 카드명을 지정한다.
package window;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class CardTest extends JFrame{
public CardTest(){
super("GridLayout Test");
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocation(200,200);
//메뉴상단만들기
JPanel menu = new JPanel(new FlowLayout(FlowLayout.CENTER, 20, 20));
JButton jbt1 = new JButton("< Previous");
JButton jbt2 = new JButton("CARD");
jbt2.setBackground(Color.MAGENTA);
JButton jbt3 = new JButton("Next >");
menu.add(jbt1);
menu.add(jbt2);
menu.add(jbt3);
this.add(menu,"North");
//카드 만들기
JPanel cardSet = new JPanel(new CardLayout());
cardSet.add(new Screen1(),"s1");
cardSet.add(new Screen2(),"s2");
cardSet.add(new Screen2(),"s3");
this.add(cardSet);
setSize(400,400);
}
public static void main(String[] args) {
new CardTest();
}
}
class Screen1 extends JPanel{
public Screen1(){
this.setLayout(new BorderLayout());
Color c = new Color(0xe43e22);
JLabel label = new JLabel("안녕!",JLabel.CENTER);
this.setBackground(c);
this.add(label,"Center");
}
}
class Screen2 extends JPanel{
public Screen2() {
this.setLayout(new BorderLayout());
Color c = new Color(0x1ab6a8);
JLabel label = new JLabel("잘 지냈어?",JLabel.CENTER);
this.setBackground(c);
this.add(label,"Center");
}
}
class Screen3 extends JPanel{
public Screen3() {
this.setLayout(new BorderLayout());
Color c = new Color(0x985396);
JLabel label = new JLabel("이번주 주말에 뭐해?",JLabel.CENTER);
this.setBackground(c);
this.add(label,"Center");
}
}
class Student{
String name;
int ban;
int no;
int kor;
int eng;
int math;
int getTotal() {
return kor+eng+math;
}
float getAverage() {
return (int)(getTotal()/3f*10+0.5)/10f;
}
}
package objectprogm1;
public class Q6_5 {
public static void main(String[] args) {
Student s = new Student("홍길동",1,1,100,60,76);
System.out.println(s.info());
}
}
class Student{
String name;
int ban;
int no;
int kor;
int eng;
int math;
Student(){
this("아무나",0,0,100,100,100);
}
Student(String name, int ban, int no, int kor, int eng, int math){
this.name = name;
this.ban = ban;
this.no = no;
this.kor = kor;
this.eng = eng;
this.math = math;
}
String info() {
return String.format("%s,%d,%d,%d,%d,%d,%d,%.1f",this.name,this.ban,this.no,this.kor,this.eng,this.math,this.getTotal(),this.getAverage());
}
int getTotal() {
return kor+eng+math;
}
float getAverage() {
return (int)(getTotal()/3f*10+0.5)/10f;
}
}
package objectprogm1;
public class Q6_6 {
//두 점 (x,y)와 (x1,y1)간의 거리를 구한다.
static double getDistance(int x, int y, int x1, int y1) {
double squareDistance = (x1-x)*(x1-x)+(y1-y)*(y1-y);
return Math.sqrt(squareDistance);
}
public static void main(String[] args) {
System.out.println(getDistance(1,1,2,2));
}
}