기사 출처: 컴퓨터 매니아 저자: Zhang Jian
바벨탑을 쌓는 데 얼마나 많은 모래와 돌이 사용되었는지 누가 알겠습니까? 로마를 건설하는 데 얼마나 많은 낮과 밤이 걸렸는지 누가 알겠습니까? 우리가 아는 유일한 것은 벽돌과 돌이 없으면 수천 마일을 굽이치는 만리장성이 없고, 바위와 점토가 쌓이지 않으면 영원한 피라미드도 없다는 것입니다. 무엇이든 배우려면 기본 지식의 준비가 중요하다는 것을 알 수 있습니다. 이제 Swing의 기본 기능을 이해하고 로마 건설의 위대한 프로젝트를 시작하겠습니다!
머리말
자바 카페는 오픈한지 꽤 됐어요. 이미 자바 커피의 맛을 좋아하신다면 자주 오세요. 이번에는 모두를 위해 향기로운 커피 한 잔을 준비했습니다. "Lianliankan" 게임 개발을 기반으로 Java에서 Swing을 사용하는 방법을 여러분과 함께 배우게 될 것입니다. Java가 내 커피에 독특한 맛을 더할 뿐만 아니라 전문 게임을 개발하는 방법도 배웠습니다. 두 분야 모두에서 최고입니다!
살짝 엿보기 위해 아래 사진은 게임 스크린샷입니다. 게임을 다운로드하여 시험해본 후(게임 프로그램 다운로드, 소스 파일 다운로드) java -jar kyodai.jar을 사용하여 명령줄 모드에서 실행할 수 있습니다. 또한 내 홈페이지 http://www.ismyway.com으로 이동하여 이 게임의 독립 실행형 버전과 모바일 버전을 다운로드하여 시험 플레이할 수도 있습니다(그림 1 참조).
Java Cafe에서는 이전에도 AWT에 대한 지식을 소개한 적이 있는데, Swing과 AWT의 차이점은 무엇인가요? Java를 연구하는 사람이라면 누구나 헤비급 컨트롤과 경량 컨트롤이라는 용어를 듣거나 본 적이 있을 것입니다. AWT는 일반적으로 헤비급 컨트롤이라고 하며 Swing은 경량 컨트롤입니다. 우리 모두는 Java의 슬로건이 "한 번 작성하면 어디에서나 실행 가능"이라는 것을 알고 있으며, 이는 또한 프로그램에서 가능한 한 순수한 Java 코드를 사용해야 함을 의미합니다. 안타깝게도 AWT는 기본 플랫폼에 대한 인터페이스에 의존하므로 AWT로 만든 인터페이스는 운영 체제에 따라 약간 다르게 보일 수 있습니다. Swing은 완전히 다릅니다. Swing은 순수 Java로 작성되었습니다. 따라서 Swing으로 작성된 인터페이스는 모든 플랫폼에서 동일한 모양을 보장할 수 있습니다. 여기에 또 다른 비결이 있습니다. JDK에서는 쉽게 구별할 수 있도록 모든 Swing 컨트롤이 JButton(AWT에서 해당하는 것은 Button임)과 같이 대문자 J로 시작하므로 Swing 컨트롤과 AWT 컨트롤을 쉽게 구별할 수 있습니다.
스윙 첫경험
Swing 프로그래밍을 배우고 싶은 분들을 위해 특별히 몇 가지 팁을 준비했습니다. 첫째, 코드를 다운로드하고 읽는 것이 매우 필요합니다. Swing에 관한 튜토리얼이므로 Swing에 관련된 내용만 최대한 설명하려고 합니다. 알고리즘 부분 등 Swing과 관련 없는 내용은 일반적으로 다루지 않습니다. 둘째, 공간의 제약으로 인해 코드의 모든 부분을 여기에 완전하게 작성할 수는 없으므로, 완성된 코드와도 비교해 보아야 합니다. 마지막으로 누구나 쉽게 스윙 학습에 집중할 수 있도록 게임 개발에 필요한 리소스도 다운로드 파일에 담아두었습니다. 다운로드 후 컴파일 및 실행하여 실행 결과를 확인할 수 있습니다.
1. 최상위 컨테이너
최상위 컨테이너란 무엇입니까? 그래픽 프로그래밍에 Java를 사용할 때 다이어그램은 어디에 그려 집니까? 그래픽 그리기를 제공할 수 있는 컨테이너가 필요합니다. 이 컨테이너를 최상위 컨테이너라고 생각할 수도 있습니다. 최상위 컨테이너는 그래픽 프로그래밍의 기초입니다. 모든 그래픽 항목은 최상위 컨테이너에 포함되어야 합니다. Swing에는 사용할 수 있는 세 가지 최상위 컨테이너가 있습니다.
・JFrame: Windows 시스템의 창 형태와 유사한 응용 프로그램을 디자인하는 데 사용됩니다.
・JDialog: JDialog가 대화 상자를 디자인하는 데 사용된다는 점을 제외하면 JFrame과 유사합니다.
・JApplet: 웹 페이지에 삽입할 수 있는 Java 애플릿을 설계하는 데 사용됩니다.
Swing을 사용하여 윈도우 클래스 프로그램을 생성해야 하는 경우 코드는 다음과 같아야 합니다.
import javax.swing.*;
공개 클래스 KyodaiUI
JFrame을 확장합니다.
…
}
2. 컨트롤
컨트롤은 애플리케이션 인터페이스를 구성하는 기본 요소입니다. 버튼, 텍스트 상자, 진행률 표시줄 등이 모두 컨트롤입니다. 컨트롤(여기서는 시각적 컨트롤만 설명)은 컨테이너 컨트롤과 컨테이너가 아닌 컨트롤로 나눌 수 있습니다. 말 그대로 이해하면 컨테이너 컨트롤은 다른 컨트롤을 포함할 수 있는 특수 컨트롤입니다. 예를 들어 Java의 JPanel 컨트롤은 컨테이너 컨트롤이 아닌 버튼이나 텍스트 상자를 배치할 수도 있습니다. -JPanel의 버튼 및 텍스트 상자와 같은 컨테이너 컨트롤. 여기에 여러 개의 JPanel 컨트롤을 배치합니다. (최상위 컨테이너도 컨테이너 유형 컨트롤이라는 점에 유의할 필요가 있습니다. 각 창 애플리케이션에는 하나의 최상위 컨테이너만 있을 수 있습니다. 즉, 최상위 컨테이너는 다른 컨트롤에 포함될 수 없습니다.
Java에는 방금 언급한 JPanel 외에도 JTabbedPane, JScrollPane 등이 있습니다. 비컨테이너 컨트롤에는 JButton, JLabel, JTextField 등이 있습니다. 컨테이너 유형 컨트롤에 컨트롤을 추가해야 하는 경우 다음과 같이 add(Component comp) 메서드를 사용하여 이를 달성할 수 있습니다.
JPanel 패널 = new JPanel();
JButton 버튼 = new JButton();
panel.add(버튼);
3. 레이아웃
레이아웃이란 무엇입니까? 레이아웃은 컨트롤의 배열과 위치를 제어하기 위해 Java에서 사용되는 인터페이스 관리 시스템입니다. 다른 시각적 프로그래밍 개발 언어를 사용해 본 사람들은 Java 인터페이스 디자인을 처음 접할 때 항상 어색함을 느낄 것입니다. 제어 좌표를 설정하는 WYSIWYG 방법이 없습니다! 그러나 Java 자체에서 제공하는 레이아웃 관리 시스템도 우리의 요구 사항을 잘 충족할 수 있으며 크로스 플랫폼 성능에 더 많은 이점이 있는 것으로 나타났습니다.
일반적으로 사용되는 레이아웃은 다음과 같습니다.
・BorderLayout: 인터페이스를 상하, 좌, 우, 중간 영역으로 나누는 관리 시스템입니다. BorderLayout 레이아웃에서는 컨트롤이 5개 이상인 경우에만 배치할 수 있습니다. 다른 레이아웃 시스템.
・GridLayout: GridLayout은 사용자 인터페이스를 체스판과 같은 레이아웃으로 자르는 레이아웃 관리 시스템입니다. Windows와 함께 제공되는 것과 유사한 계산기 소프트웨어를 디자인하려면 의심할 여지 없이 GridLayout이 최선의 선택입니다.
・FlowLayout: FlowLayout은 위의 두 가지 유형의 레이아웃 관리 시스템과 다릅니다. FlowLayout에서는 각 컨트롤을 배치할 위치를 지정할 필요가 없으며 FlowLayout에 컨트롤을 추가하기만 하면 FlowLayout이 순서대로 배치합니다. 컨트롤을 추가하는 순서. 공간이 충분하지 않으면 컨트롤이 자동으로 래핑됩니다.
이러한 레이아웃 관리 시스템에 대한 기본적인 이해를 마친 후, 인터페이스 디자인에 대해 함께 살펴보겠습니다. QQ 게임에서 "Lianliankan"의 설정을 주의 깊게 관찰한 결과 전체 인터페이스가 세 가지 영역으로 구분되어 있음을 알 수 있습니다. 상단은 시스템 메뉴 영역이고 가장 큰 영역은 사용자 게임 영역이며 사용자 상호 작용도 있습니다. 영역. 각 영역은 여러 컨트롤로 구성됩니다.
컨트롤이 너무 많아서 어디서부터 시작할까요? 컨테이너 컨트롤에 다른 컨트롤을 배치할 수 있으므로 먼저 배치할 컨테이너 컨트롤만 결정하면 됩니다. 이제 사용해야 하는 컨테이너 컨트롤의 수를 알았으므로 레이아웃 관리 시스템을 선택해 보겠습니다. GridLayout을 사용하시겠습니까? FlowLayout을 사용하면 약간 강요된 것 같나요? 더 나은 옵션이 있습니까? 그런데 아래 그림 2와 같이 BorderLayout을 생각해 보셨을 것 같습니다.
시작하기 전에, 인터페이스 디자인은 메인 프로그램 인터페이스의 크기인지, 각 영역의 크기인지를 먼저 고려해야 한다는 사실에 주의해야 합니다. 적절한 크기를 디자인하지 않으면 매우 커질 것입니다. 앞으로 바꾸려면 고통스럽습니다.
다음은 해당 소스 프로그램입니다.
import java.awt.*;
import javax.swing.*;
공개 클래스 KyodaiUI는 JFrame을 확장합니다.
공개 KyodaUI() {
this.setSize(780, 500); //폼의 크기를 780*500으로 설정합니다.
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setRessible(false); //양식 크기를 조정할 수 없습니다.
this.setTitle("Lianliankan"); //제목 설정
JPanel toolBar = new JPanel();
toolBar.setBackground(Color.white);
toolBar.setPreferredSize(new Dimension(780, 48));
JPanel actionPanel = new JPanel(); //새 JPanel 유형 컨트롤 생성
actionPanel.setBackground(Color.yellow); //배경색 설정
actionPanel.setPreferredSize(new Dimension(160, 380)) //크기 설정
JPanel contentPanel = new JPanel();
contentPanel.setBackground(Color.blue);
contentPanel.setPreferredSize(new Dimension(620, 380));
this.getContentPane().add(toolBar, BorderLayout.NORTH);
this.getContentPane().add(actionPanel, BorderLayout.EAST);
this.getContentPane().add(contentPanel, BorderLayout.CENTER);
}
public static void main(String[] args)에서 HeadlessException이 발생합니다.
KyodaiUI kyodaiUI = new KyodaiUI();
kyodaiUI.show();
}
}
위의 프로그램이 어떻게 작동하는지 살펴보겠습니다. 먼저, JFrame 확장은 가장 기본적인 최상위 컨테이너 컨트롤인 JFrame에서 상속되었음을 나타냅니다. 실제로 JDK에서는 문자 J로 시작하는 컨트롤이 Swing 컨트롤입니다. 그런 다음 컨테이너의 속성을 설정합니다. 그 중 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)은 사용자가 양식의 오른쪽 상단에 있는 "닫기" 버튼을 클릭할 때 창 프로세스를 닫도록 Java 가상 머신에 지시하는 데 사용됩니다. 이렇게 하지 않으면 클릭하여 창을 닫을 수 있지만 프로그램이 종료되지 않는다는 것을 알게 될 것입니다. 다음 코드에서는 최상위 컨테이너에 세 개의 Panel 컨테이너를 추가합니다. AWT에서는 add(toolBar, BorderLayout.NORTH)로 직접 작성할 수 있지만 Swing에서는 getContentPane()으로 작성해야 합니다. 그렇지 않으면 프로그램이 진행됩니다. 잘못된.
이제 이를 컴파일하고 실행하여 실행 결과와 동일한지 확인할 수 있습니다(그림 3 참조).
4. 국경
서로 다른 영역을 구별하기 위해 서로 다른 전경색을 사용하지만 계층 구조는 없습니다. 테두리가 있으면 훨씬 더 아름답습니다.
Java에서 J로 시작하는 모든 Swing 컨트롤은 setBorder 메서드를 사용하여 자체적으로 테두리를 설정할 수 있습니다. 선형, 볼록형, 오목형, 빈형 등 다양한 종류의 테두리가 있으며 이를 자유롭게 결합하여 자신만의 스타일을 만들 수도 있습니다. 모든 테두리는 다음과 같이 javax.swing.BorderFactory에서 제공되는 정적 메서드를 사용하여 생성되어야 합니다.
테두리 테두리 = BorderFactory.createBevelBorder(BevelBorder.LOWERED,
새로운색상(45, 92, 162),
새로운색상(43, 66, 97),
새로운색상(45, 92, 162),
새로운 색상(84, 123, 200));
이제 toolBar.setBackground(Color.white)를 toolBar.setBorder(border)로 변경해 보겠습니다. 이미 입체 효과가 나타났나요?
실전 전투 - 자신의 이름을 쓰세요
이제 작동하는 인터페이스가 생겼습니다. 비록 아무것도 할 수 없지만 로마는 하루아침에 만들어지지 않았습니다.
이제 메뉴 영역에 "정보" 메뉴를 제공하여 프로그램 정보를 표시해 보겠습니다. Swing 자체는 이미 만들어진 버튼 컨트롤인 JButton을 제공합니다. 새 버튼만 생성하면 됩니다. JButton about = new JButton("about"); 이 버튼을 다른 곳이 아닌 메뉴 영역에 어떻게 배치해야 할까요? 다음 코드를 추가할 수 있습니다. toolBar.add(about); 버튼을 클릭해도 응답이 없는 이유는 무엇입니까? 이는 버튼을 클릭할 때 수행할 작업을 프로그램에 지시하지 않았기 때문입니다. 버튼에 이벤트 응답을 추가하려면 먼저 about.addActionListener(this)를 사용하여 버튼을 눌렀을 때 이벤트를 수신하도록 프로그램에 지시해야 합니다. ActionListener는 프로그램 인터페이스이므로 약간의 작업도 수행해야 합니다. 수정: public class KyodaiUI는 JFrame을 구현합니다. ActionListener {...} ActionListener 인터페이스를 구현하는 목적은 프로그램에 이벤트를 처리하고 싶다고 알리는 것입니다. 물론 마지막으로 이벤트에 응답하는 코드를 추가해야 합니다.
공공 무효 actionPerformed(ActionEvent e) {
if (e.getSource() == about) {
JOptionPane.showMessageDialog(this, "내 이름", "정보",
JOptionPane.INFORMATION_MESSAGE);
반품 ;
}
}
그 중 e.getSource()는 현재 이벤트를 트리거하는 컨트롤을 나타냅니다. 우리 프로그램에는 종종 하나 이상의 컨트롤이 있으므로 이러한 컨트롤은 이벤트를 생성할 수 있으므로 이 메서드를 사용하여 이벤트를 생성한 컨트롤을 찾아야 합니다.
요약
오늘 배운 내용을 복습해 보겠습니다. 먼저 최상위 컨테이너에 대해 이해하고 컨트롤이 컨테이너 컨트롤과 비컨테이너 컨트롤로 구분된다는 것도 알고 마지막으로 버튼을 다루는 방법도 알고 있습니다. 조금.
진행하면서 배우고 연습하는 것은 당연합니다. 따라서 오늘 배운 내용을 통합하는 데 도움이 되는 작은 숙제를 남겨드리겠습니다. 위에 추가한 버튼은 메뉴 표시줄 중앙에 있으며 아름답지 않습니다. 넣어주세요. 왼쪽이나 오른쪽에 넣어보세요.
마지막으로, 더 나은 참고 자료를 제공하고 싶습니다.
●JFC/Swing으로 GUI 만들기
http://java.sun.com/docs/books/tutorial/uiswing/index.html
●2D 그래픽
http://java.sun.com/docs/books/tutorial/2d/index.html
●JDK API
http://java.sun.com/j2se/1.4.2/docs/api/index.html