Java로 그래픽 인터페이스 만들기. Java 그래픽 라이브러리에서 그래픽 인터페이스 생성 Java Swing GUI 트리에서 테이블 실행

우리는 콘솔에 문자 메시지를 출력하는 프로그램에 대해 항상 이야기하면서 당신을 많이 피곤하게 만들었던 것 같습니다. 이번 레슨에서는 이 "지루한" 예제 시리즈가 마침내 중단됩니다. Java에서 창이 어떻게 생성되는지 보여주고 이것이 간단한 작업이라는 것을 알게 될 것입니다. 다음은 코드입니다(정말 알아야 할 기능이 너무 많기 때문에 다음 강의에서 논의하기 시작하겠습니다).

import java.awt.*;

import javax.swing.*;

공개 클래스 MoneyForNothing은 JFrame을 확장합니다(

// 생성자

공개 MoneyForNothing() (

setTitle("아무것도 없는 돈에 오신 것을 환영합니다");

setSize(new Dimension(600, 400));

setDefaultCloseOperation(EXIT_ON_CLOSE);

setVisible(참);

공개 정적 무효 메인(문자열 인수)(

MoneyForNothing mfn = 새로운 MoneyForNothing();

FAR 편집 창에 있는 동일한 코드는 다음과 같습니다.

그런데 CP1251 인코딩(또는 일반적인 용어로)으로 프로그램의 소스 코드를 즉시 입력하는 것이 좋습니다. 윈도우 인코딩): F8 키를 누르면 인코딩 전환이 이루어지며 편집 영역 위의 상태 표시줄에 현재 인코딩이 표시됩니다.

진입점은 변경되지 않았지만 나머지 코드는 상당히 변경되었습니다(그러나 너무 앞서 나가지는 말자). 컴파일하고 실행하면 다음과 같은 내용이 표시됩니다.


축하합니다. 단 몇 줄만으로 실제 그래픽 창을 만들었습니다! 드래그, 크기 조정, 축소, 확장 및 닫을 수 있습니다. 사실, 우리 창문은 다소 희미한 것으로 판명되었습니다. 직설적으로 말하면 "무섭습니다". 또한 창은 화면 왼쪽 상단에 표시되지만 중앙에 표시하고 싶습니다. 거기가 사용하기 더 편리하고 이 출력이 더 멋져 보입니다. 그럼 약간의 폴리싱을 해보겠습니다.

먼저 두 번째 문제인 창을 중앙에 배치하는 문제를 해결해 보겠습니다. 여기서 멈추고 생각하는 것이 좋습니다. 어떻게 하시겠습니까?

Java 그래픽 라이브러리에는 창의 왼쪽 상단 모서리 좌표가 매개변수로 전달되는 setLocation 메소드가 있음을 알려드리겠습니다. 이 모서리에서 다른 그래픽 요소가 창 내부에 배치됩니다. 그러나 이러한 매개변수를 "정면"으로 설정하면 거의 확실히 좋은 결과가 나오지 않을 것입니다. 해상도가 다른 다른 모니터에서는 창이 예상했던 것과 완전히 달라집니다. 따라서 보다 지능적으로 좌표를 설정할 필요가 있습니다.

창을 중앙에 배치하는 데 필요한 것은 창 자체의 크기(디자이너에서 설정되고 600 x 400픽셀의 직사각형을 형성함)와 화면 해상도를 아는 것입니다. 간단한 산술, 왼쪽 상단 모서리의 필요한 좌표를 계산합니다. 이는 다음 코드를 배치하여 달성됩니다.

차원 sSize = Toolkit.getDefaultToolkit().getScreenSize(),

fSize = getSize();

if (fSize.height > sSize.height) (fSize.height = sSize.height;)

if (fSize.width > sSize.width) (fSize.width = sSize.width;)

setLocation((sSize.width - fSize.width)/2,

(sSize.height - fSize.height)/2);

setSize(new Dimension(600, 400)); 줄 바로 뒤 생성자에서. 소스 코드에 필요한 사항을 변경하고, 프로그램을 컴파일하고 실행합니다. 창이 모니터 화면 중앙에 나타나야 합니다.

이제 창 모양에 대해 몇 마디. 이상한 모양은 Java 개발자가 하드웨어 플랫폼 및 소프트웨어 "채우기"에 관계없이 모든 그래픽 요소(창, 버튼, 목록 등)가 단일 렌더링 및 단일 색상 구성표를 갖도록 하려고 했다는 사실로 설명됩니다. 이를 위해 그들은 "METAL"이라고 불리는 특별한 스타일을 개발했습니다. 개발자가 특별한 노력을 기울이지 않으면 특정 컴퓨터의 특성과 해당 컴퓨터의 특성을 고려하지 않고 프로그램의 그래픽 인터페이스 요소가 정확하게 이 스타일로 보일 것입니다. 소프트웨어. 어떤 경우에는 이것이 의미가 있지만 Windows에서 실행되는 프로그램이 Windows 프로그램과 유사하고 LINUX에서 실행되는 프로그램이 Linux 프로그램과 유사하면 훨씬 더 좋다는 데 동의할 것입니다. 이것은 달성하기 쉽습니다. 클래스를 인스턴스화하기 전에 진입점에 다음 코드를 포함하기만 하면 됩니다.

시도(UIManager.setLookAndFeel

(UIManager.getSystemLookAndFeelClassName());

잡기 (예외 lfe) ()

그것이 우리가 할 일입니다. 이제 프로그램의 업데이트된 버전을 컴파일하고 실행을 위해 실행하면 그래픽 창이 훨씬 더 "괜찮아" 보입니다.


모니터의 화면 속성 설정에 따라 창 표시가 달라집니다. 우리는 클래식을 사용합니다 윈도우 테마 XP. 예를 들어, 동일한 창은 다음과 같습니다.

모든 것이 예상대로 작동하는지 확인합니다. 창이 화면 중앙에 표시되고 모습예상한 것과 일치합니다.

이것으로 그래픽 인터페이스에 대한 첫 번째 강의를 마칩니다. 여기에서 우리는 "외관"을 보여주었지만 매우 중요하고 일반적으로 Java 프로그래밍과 특히 그래픽 인터페이스에서 프로그래밍이 불가능한 많은 문제를 완전히 제외했습니다. 다음 강의에서 이러한 문제를 다루기 시작할 것입니다. 하지만 지금은 이 문제를 가지고 놀아보세요. 소스 코드, 즉.

연습으로, 예를 들어 화면 오른쪽 하단에 있는 창 출력의 좌표를 계산하고 결과를 확인하세요.

또 다른 연습은 수행하기가 더 쉽지만 문서를 사용해야 합니다(언젠가는 실제로 시작해야 합니다). 창 크기를 조정할 수 없도록 만드세요. 시스템 버튼 영역이 그림과 같이 보이도록

(힌트: javax 및 JFrame 키워드를 검색하세요). 그러니 소매를 걷어붙이고 행운을 빕니다!

논평

생성된 창은 화면에 표시되는 좌표를 잘못 계산했기 때문에 완전히 또는 부분적으로 보이지 않을 수 있습니다. 창 제어 버튼을 사용할 수 없게 될 수도 있습니다. 작업 관리자에서 작업을 삭제하거나 컴퓨터를 다시 시작하지 않고 어떻게 응용 프로그램을 중단할 수 있습니까?

FAR에서 실행할 프로그램을 시작하므로 Ctrl-C 키 조합을 누르면 Java 프로그램 실행이 중단됩니다(여기서 "C"는 라틴 문자이므로 유사한 키릴 문자와 혼동하지 마십시오).

Java의 그래픽 인터페이스는 개발 및 형성에 있어 매우 어려운 경로를 거쳤습니다. 오랫동안 속도가 느리고 시스템 리소스를 너무 많이 사용하며 기능이 제한되어 있다는 비난을 받았습니다.

자바 AWT

Java용 GUI를 만들려는 Sun의 첫 번째 시도는 라이브러리였습니다. A.W.T.(Abstract Window Toolkit) - 다양한 창 환경에서 작업하기 위한 툴킷입니다. Sun은 C로 작성된 라이브러리에서 메소드를 호출하는 Java 계층을 만들었습니다. AWT 라이브러리 메소드는 운영 환경의 그래픽 구성 요소를 생성하고 사용합니다. 한편으로는 Java 프로그램이 동일한 OS 내의 다른 프로그램과 유사하기 때문에 이는 좋습니다. 그러나 다른 플랫폼에서 실행하면 구성 요소의 크기와 글꼴에 차이가 있어 프로그램의 모양이 손상될 수 있습니다.

멀티 플랫폼을 보장하려면 A.W.T.구성 요소 호출 인터페이스가 통합되어 그 결과 기능이 약간 감소했습니다. 그리고 구성 요소 세트는 매우 작은 것으로 나타났습니다. 예를 들어 AWT에는 테이블이 없으며 버튼은 아이콘 표시를 지원하지 않습니다. 아직도 패키지 java.awt는 첫 번째 릴리스부터 Java에 포함되었으며 GUI를 만드는 데 사용할 수 있습니다.

그래서 구성품은 A.W.T.그들은 어떤 "일"도 하지 않습니다. 컨트롤을 위한 "Java 래퍼"일 뿐입니다. 운영 체제, 그들이 작업하는 곳입니다. 이러한 구성 요소에 대한 모든 요청은 모든 작업을 수행하는 운영 체제로 리디렉션됩니다.

사용된 자원 A.W.T.자동으로 해제하려고 합니다. 이는 아키텍처에 약간의 복잡성을 추가하고 성능에 영향을 미칩니다. AWT를 사용하여 진지한 내용을 작성하는 것은 다소 어려울 것입니다. 현재는 애플릿에만 사용됩니다.

SWING의 기본 개념

후에 A.W.T. Sun은 그래픽 구성 요소 라이브러리를 개발했습니다. 그네, 완전히 Java로 작성되었습니다. 2D는 렌더링에 사용되며, 이는 여러 가지 장점을 제공합니다. 전부 표준 구성 요소다양성과 기능성 측면에서 AWT보다 훨씬 뛰어납니다. Swing을 사용하면 기존 구성 요소를 상속하여 새 구성 요소를 쉽게 만들 수 있으며 다양한 스타일과 스킨을 지원합니다.

새로운 사용자 인터페이스 라이브러리의 제작자 그네그들은 "바퀴를 재발명"하지 않고 라이브러리의 기반으로 AWT를 선택했습니다. 물론 우리는 특정 중량급 AWT 구성 요소(Button, Label 등의 클래스로 표시)를 사용하는 것에 대해 이야기한 것이 아닙니다. 경량 구성요소만이 필요한 수준의 유연성과 제어성을 제공했습니다. 상속 다이어그램은 AWT와 Swing 간의 관계를 보여줍니다.

가장 중요한 차이점 그네 AWT의 장점은 Swing 구성 요소가 운영 체제에 전혀 연결되지 않아 훨씬 더 안정적이고 빠르다는 것입니다. Java에서는 이러한 구성 요소를 경량이라고 하며, 작동 방식에 대한 기본 원칙을 이해하면 Swing 작동 방식을 설명하는 데 큰 도움이 됩니다.

최고 레벨의 스윙 컨테이너

GUI 응용 프로그램을 만들려면 최상위 컨테이너라고 하는 특수 Swing 라이브러리 구성 요소를 사용해야 합니다. 이는 사용자 인터페이스 구성 요소를 수용하는 운영 체제 창입니다. 최상위 컨테이너에는 JFrame 및 JWindow 창, JDialog 대화 상자 및 JApplet 애플릿(창은 아니지만 이 애플릿을 실행하는 브라우저에 인터페이스를 표시하도록 설계됨)이 포함됩니다. Swing의 최상위 컨테이너는 중량급 구성 요소이며 일반 규칙의 예외입니다. 다른 모든 Swing 구성 요소는 가볍습니다.

단순한 그네윈도우 인터페이스 생성의 예 JFrame.

java.awt.Dimension 가져오기; import javax.swing.JFrame; import javax.swing.JLabel; 공개 클래스 JFrameTest ( 공개 정적 void createGUI() ( JFrame 프레임 = new JFrame("테스트 프레임"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel label = new JLabel("테스트 레이블"); add(label);frame.setPreferredSize(new Dimension(200, 100)); Runnable() ( 공개 무효 실행() ( createGUI(); ) ) )

건설자 J프레임()매개변수 없이 생성 빈 창. 건설자 JFrame(문자열 제목)빈 창을 만듭니다 제목 제목. 만들다 가장 간단한 프로그램빈 창이 있는 경우 다음 방법을 사용해야 합니다.

  • setSize(int width, int height) - 창 크기를 결정합니다.
  • setDefaultCloseOperation(int Operation) - 프로그램이 종료될 때의 동작을 정의합니다.
  • setVisible(boolean visible) - 창을 표시합니다.

창의 크기를 정의하지 않으면 그 안에 무엇이 있든 상관없이 높이가 0이 됩니다. 창 크기에는 "작업" 영역뿐만 아니라 테두리와 제목 표시줄도 포함됩니다.

setDefaultCloseOperation 메소드는 "프로그램 종료" 시 수행될 작업을 지정합니다. 이를 위해서는 JFrame 클래스에 설명된 EXIT_ON_CLOSE 상수를 작업 매개변수로 전달해야 합니다.

기본적으로 창은 보이지 않게 생성됩니다. 화면에 창을 표시하기 위해 true 매개변수와 함께 setVisible 메소드가 호출됩니다. false 매개변수로 호출하면 창이 보이지 않게 됩니다.

GUI 자바 스윙창을 만드는 예 JFrame다음 그림에 나와 있습니다.

도서관을 연결하려면 그네애플리케이션이 라이브러리를 가져와야 합니다. javax.swing.

일반 창, 대화 상자, 애플릿 등 최상위 컨테이너가 생성될 때마다 루트 패널 JRootPane. Swing의 최상위 컨테이너는 다른 구성요소가 JRootPane 외부로 나갈 수 없도록 보장합니다.

루트팔레트 JRootPane컨테이너에 "깊이" 속성을 추가하여 구성 요소를 서로 위에 배치할 수 있을 뿐만 아니라 필요한 경우 위치를 변경하고 구성 요소의 깊이를 늘리거나 줄일 수 있는 기능을 제공합니다. 이 기능은 다중 문서 애플리케이션을 만들 때 필요합니다. 그네, 창은 드롭다운(상황에 맞는) 메뉴 및 도구 설명뿐만 아니라 서로 위에 있는 간단한 구성 요소를 나타냅니다.

다음 그림은 루트 패널의 구조를 명확하게 보여줍니다. JRootPane.

루트 패널 JRootPane Swing 기본 클래스 JComponent에서 상속된 컨테이너입니다. 이 컨테이너에서는 내부 클래스 RootPaneLayout에 구현된 특수 레이아웃 관리자가 구성 요소 배열을 담당합니다. 이 레이아웃 관리자는 루트 패널의 모든 구성 요소 부분이 제대로 배치되었는지 확인하는 일을 담당합니다. 레이어 패널은 전체 창 공간을 차지합니다. 해당 레이어 FRAME_CONTENT_LAYER에는 메뉴 표시줄과 콘텐츠 패널이 포함되어 있으며 무엇보다도 투명 패널이 있습니다.

루트 패널의 모든 구성 요소 JRootPane획득하거나 변경할 수 있습니다. 이를 위해 일련의 get/set 메소드가 있습니다. 프로그래밍 방식으로 JRootPane getRootPane() 메소드를 사용하여 얻을 수 있습니다.

최상위 컨테이너 외에도 루트 패널은 다중 문서 애플리케이션에서 생성되고 JDesktopPane "데스크탑"에 있는 내부 JInternalFrame 창에서 사용됩니다. 이렇게 하면 이러한 창이 일반적인 경량 구성 요소라는 사실을 잊고 실제 최상위 컨테이너인 것처럼 작동할 수 있습니다.

JLayeredPane

루트 패널(컨테이너)의 바닥에는 소위 다층 패널이 있습니다. JLayeredPane, 컨테이너의 사용 가능한 모든 공간을 차지합니다. 모든 사용자 인터페이스 구성 요소를 포함하여 루트 패널의 다른 모든 부분이 이 패널에 있습니다.

JLayeredPane컨테이너에 깊이 속성을 추가하는 데 사용됩니다. 즉, 다중 레이어 패널을 사용하면 구성 요소의 레이어가 위치한 컨테이너에서 3차원을 구성할 수 있습니다. 일반 컨테이너에서 구성 요소의 위치는 구성 요소가 차지하는 컨테이너의 양을 보여주는 직사각형에 의해 결정됩니다. 계층화된 패널에 구성 요소를 추가할 때 구성 요소가 차지할 직사각형뿐만 아니라 해당 구성 요소가 위치할 레이어도 지정해야 합니다. 샌드위치 패널의 레이어는 정수로 식별됩니다. 레이어를 정의하는 숫자가 높을수록 레이어가 더 높은 곳에 위치합니다.

컨테이너에 추가된 첫 번째 구성 요소는 나중에 추가된 구성 요소보다 높습니다. 대부분의 경우 개발자는 구성 요소의 위치를 ​​처리하지 않습니다. 구성요소를 추가하면 해당 위치가 자동으로 변경됩니다. 그러나 다중 레이어 패널을 사용하면 구성 요소가 컨테이너에 추가된 후 구성 요소의 위치를 ​​동적으로 변경할 수 있습니다.

적층 패널 기능은 일부 구성 요소에서 널리 사용됩니다. 그네. 다중 문서 응용 프로그램, 도구 설명 및 메뉴에 특히 중요합니다. 다중 문서 그네애플리케이션은 특수 컨테이너를 사용합니다. JDesktopPane("데스크톱"), 상속됨 JLayeredPane, 내부 스윙 창이 들어 있습니다. 다중 문서 애플리케이션의 가장 중요한 기능("활성" 창을 다른 창 위에 배치, 창 최소화, 드래그)은 계층화된 패널 메커니즘에 의해 제공됩니다. 도구 설명과 메뉴에 계층화된 패널을 사용할 때의 주요 이점은 작업 속도가 더 빠르다는 것입니다. 도구 설명이나 메뉴를 요청한 구성 요소 위에 있는 각 도구 설명이나 메뉴에 대해 새로운 강력한 창을 만드는 대신, 그네빠르고 가벼운 구성 요소를 만듭니다. 이 구성 요소는 다른 모든 구성 요소 스택 위의 계층화된 패널에서 충분히 높게 배치되며 도구 설명이나 메뉴를 표시하는 데 사용됩니다.

멀티레이어 패널을 사용하면 레이어를 무제한으로 구성할 수 있습니다. 구조 JLayeredPane모든 Swing 구성 요소에서 사용되는 여러 표준 레이어가 포함되어 있습니다. 올바른 작업다층 패널의 모든 메커니즘. 표준 JLayeredPane 레이어는 다음 그림에 표시되어 있습니다.

기본 레이어는 컨테이너에 추가된 모든 일반 구성 요소를 수용하는 데 사용됩니다. 이 레이어에는 다중 문서 응용 프로그램의 내부 창이 있습니다.

팔레트 레이어는 일반적으로 다른 인터페이스 요소와 겹치는 도구 세트가 있는 창을 수용하도록 설계되었습니다. 이 계층에 배치하는 JDesktopPane을 사용하여 이러한 창을 생성할 수 있습니다.

모달 레이어는 경량 모달 대화 상자를 호스팅하기 위한 것입니다. 그러나 그러한 대화 상자아직 구현되지 않았으므로 이 레이어는 현재 Swing에서 사용되지 않습니다.

팝업 메뉴와 툴팁을 배치하는 데 가장 일반적으로 사용되는 레이어입니다.

최상층. 프로그램 인터페이스에서 명확하게 표시되어야 하는 끌어서 놓기 작업을 위해 설계되었습니다.

계층화된 패널이 있는 JLayeredPane의 작은 예는 여러 계층에 구성 요소를 추가하는 방법과 계층이 서로 쌓이는 방식을 보여줍니다.

javax.swing.* 가져오기; import java.awt.*; // 텍스트 클래스를 사용하여 두 가지 유형의 그림을 그리기 위한 클래스 Figure 확장 JComponent( private 정적 최종긴 serialVersionUID = 1L; 사적인 색상 색상; 비공개 int 유형; 개인 문자열 텍스트; // 매개변수: 그림의 색상 및 유형 Figure(Color color, int type, String text) ( this.color = color; this.type = type; this.text = text; setOpaque(false); ) public void PaintComponent(Graphics g ) ( // 그림 그리기 g.setColor(color); switch (type) ( 사례 0: g.fillOval(0, 0, 90, 90); break; 사례 1: g.fillRect(0, 0, 130 , 80 ); break; ) g.setColor(Color.yellow); g.drawString(text, 10, 35); // 창을 닫을 때 종료 setDefaultCloseOperation(EXIT_ON_CLOSE); 계층화된 패널 JLayeredPane lp = getLayeredPane(); // 세 개의 그림 만들기 Figure Figure1 = new Figure(Color.red , 0, "Figure popup") Figure Figure2 = new Figure(Color.blue, 0, "Figure 1") ; Figure Figure3 = new Figure(Color.yan, 1, "Figure 2"); // 창에서 그림의 위치 결정 Figure1.setBounds (10, 40, 120, 120); Figure2.setBounds(60, 120, 160, 180); 그림3.setBounds(90, 55, 250, 180); // 다른 레이어에 모양 추가 lp.add(Figure1, JLayeredPane.POPUP_LAYER); lp.add(그림2, JLayeredPane.PALETTE_LAYER); lp.add(그림3, JLayeredPane.PALETTE_LAYER); // 그림 중 하나의 위치 변경 lp.setPosition(Figure3, 0); // 크기 결정 및 창 열기 setSize(280, 250); setVisible(참); ) 공개 정적 void main(String args) ( JFrame.setDefaultLookAndFeelDecorated(true); new JLayeredPaneTest(); ) )

예제에서는 작은 창을 만듭니다. JFrame여러 Figure 구성 요소가 계층화된 패널에 추가됩니다. 최상위 Swing 컨테이너에서 계층화된 패널을 얻으려면 메소드를 호출하기만 하면 됩니다. getLayeredPane().

Figure 보조 클래스는 기본 JComponent 클래스의 속성을 상속하며 서로 다른 색상으로 두 가지 유형의 모양(원 및 직사각형)을 그릴 수 있도록 합니다. 그림 그리기에 대한 매개변수는 클래스 생성자에서 설정됩니다.

인터페이스를 정의하면 서로 다른 색상의 세 가지 모양(원 두 개와 직사각형 한 개)이 생성됩니다. 원은 POPUP_LAYER 레이어에 배치되고 직사각형은 PALETTE_LAYER 레이어에 배치됩니다. 일반 레이아웃 관리자는 계층화된 패널에서 작동하지 않으므로 구성 요소를 배치할 때 절대 화면 좌표를 지정합니다.

마지막으로 직사각형 중 하나의 위치가 변경되어 원래는 두 번째로 추가되었지만 레이어의 첫 번째 위치가 되었습니다. 애플리케이션을 실행하면 레이어 패널이 작동하고 레이어와 위치에 따라 구성 요소가 깔끔하게 배열되어 있는 것을 볼 수 있습니다.

기존 응용 분야에서 샌드위치 패널은 눈에 보이지 않게 기능을 수행하는 직접 사용되는 경우가 거의 없습니다. 그러나 때로는 개발자의 초인적인 노력이나 트릭 없이도 일반 구성 요소 위에 애니메이션이나 비디오를 배치할 수 있는 등 놀라운 효과와 특이한 인터페이스를 만드는 데 도움이 됩니다.

콘텐츠 창

콘텐츠 창 ContentPane은 프로그램의 사용자 인터페이스 구성 요소를 수용하는 데 사용되는 루트 창의 다음 부분입니다. 콘텐츠 창레이어 패널 공간의 대부분을 차지합니다(메뉴 모음이 차지하는 공간 제외). 콘텐츠 패널이 나중에 창에 추가되는 구성 요소를 가리는 것을 방지하기 위해 레이어 패널은 해당 패널을 FRAME_CONTENT_LAYER(번호 -30000)라는 매우 낮은 특수 레이어에 배치합니다.

메소드를 사용하여 콘텐츠 패널에 액세스할 수 있습니다. getContentPane()클래스 JFrame. add(Component 컴포넌트) 메소드를 사용하면 컨트롤 요소를 추가할 수 있습니다. 바꾸다 콘텐츠 창다른 JPanel 유형 패널에서는 다음 메소드를 사용할 수 있습니다. setContentPane()

콘텐츠 패널에 버튼을 추가하는 예:

JButton newButton = 새로운 JButton(); getContentPane().add(newButton);

결과적으로 버튼이 있는 창이 생성됩니다. 버튼은 창의 사용 가능한 전체 영역을 차지합니다. 이 효과는 모든 프로그램에서 유용하지 않으므로 패널에서 요소를 배열하는 다양한 방법을 사용해야 합니다.

컨텐츠 패널은 완전히 교체될 수 있습니다. 다음을 고려하세요 그네콘텐츠 패널 사용 예 콘텐츠 창.

javax.swing.* 가져오기; public class ContentPaneReplace는 JFrame을 확장합니다 ( private static final long serialVersionUID = 1L; public ContentPaneReplace() ( super("Test ContentPane"); setDefaultCloseOperation(EXIT_ON_CLOSE); // 두 개의 버튼이 있는 패널을 만듭니다. JPanelcontents = new JPanel();contents. add (new JButton("Family")); content.add(new JButton("School")); // 콘텐츠 패널 교체 setContentPane(contents) // 창 크기 결정 setSize(200, 100); true); 공개 정적 void main(String args) ( JFrame.setDefaultLookAndFeelDecorated(true); new ContentPaneAdd(); ) )

이 예에서는 작은 창과 두 개의 버튼이 있는 패널을 만듭니다. setContentPane()창의 콘텐츠 패널을 대체합니다. 따라서 add() 메서드를 호출하는 간단한 추가 대신 대체가 사용되었습니다. 창 인터페이스는 다음 스크린샷에 표시되어 있습니다.

콘텐츠 패널 콘텐츠 창그 자체는 특별한 것이 아니다. 구성 요소가 특별히 추가되었다는 점만 기억하면 됩니다.

투명한 JOptionPane

투명 패널 JOptionPane다층 패널의 모든 요소 위에 루트 패널로 배치됩니다. JOptionPane의 배치는 메뉴 표시줄이 차지하는 영역을 포함하여 전체 창 영역을 완전히 덮도록 계층화된 패널 위에 투명 패널을 배치하는 루트 패널에 의해 제어됩니다.

JOptionPane응용 프로그램에서는 거의 사용되지 않으므로 기본적으로 루트 패널에서 보이지 않게 만들어 그리기 시스템의 부하를 줄입니다. 한 가지 명심해야 할 점은 투명 패널을 표시하는 경우 해당 패널이 투명한지 확인해야 한다는 것입니다(불투명 속성은 false로 설정됨). 그렇지 않으면 루트 패널의 다른 모든 요소와 나머지 패널이 가려지기 때문입니다. 인터페이스가 보이지 않게 됩니다.

투명패널은 어떤 경우에 사용할 수 있나요? JOptionPane? 도움을 받으면 처음부터 구현하는 데 상당한 노력이 필요한 응용 프로그램 기능을 식별할 수 있습니다. 투명 패널은 자동화된 사용자 인터페이스 테스트에 맞게 조정될 수 있습니다. 여기에 합성된 이벤트를 사용하면 중간 디버깅 결과를 추적할 수 있습니다. 때로는 이 접근 방식이 수동 테스트보다 훨씬 더 효과적입니다.

투명 패널 JOptionPane메뉴 표시줄을 포함한 모든 구성 요소 위에 떠 있는 멋진 애니메이션을 만들거나 UI의 주요 부분으로 전송되기 전에 일부 이벤트를 처리해야 하는 경우 이벤트를 가로채는 데 사용할 수 있습니다.

투명한 Swing JOptionPane 사용 예:

// 투명 패널 사용 JOptionPane import java.awt.Dimension; import java.awt.Font; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.UIManager; 공용 클래스 JOptionPaneTest는 JFrame을 확장합니다(private static final long serialVersionUID = 1L; public static final 글꼴 글꼴= new Font("베르다나", Font.PLAIN, 11); public static void createGUI() ( JFrame 프레임 = new JFrame("JOptionPane 테스트"); WindowEvent 이벤트) () 공개 무효 windowDeactivated(WindowEvent 이벤트) () 공개 무효 windowDeiconified(WindowEvent 이벤트) () 공개 무효 windowIconified(WindowEvent 이벤트) () 공개 무효 windowOpened(WindowEvent 이벤트) () 공개 무효 windowClosing(WindowEvent 이벤트) ( 객체 options = ("Yes", "No!" ) int rc = JOptionPane.showOptionDialog(event.getWindow(), "창을 닫으시겠습니까?", "확인", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, 옵션, 옵션) ; if (rc == 0) ( event.getWindow().setVisible(false); System.exit(0); ) )) JLabel label = new JLabel("창을 닫을 때 투명 패널 사용"); ().add(label); 프레임.setPreferredSize(new Dimension(350, 80)); 프레임.팩(); 프레임.setLocationRelativeTo(null); 프레임.setVisible(true); ) public static void main(String args) ( javax.swing.SwingUtilities.invokeLater(new Runnable() ( public void run() ( UIManager.put("Button.font", FONT)); UIManager.put("Label.font ", FONT); JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); createGUI(); ) )); ) )

setDefaultCloseOperation 메소드에 상수를 전달하는 경우 JFrame.EXIT_ON_CLOSE을 선택하고 창이 닫히면 애플리케이션 작동이 중지됩니다. 예제에서는 상수가 이 메서드에 전달됩니다. JFrame.DO_NOTHING_ON_CLOSE창을 닫아도 아무 일도 일어나지 않도록 말이죠. 예제의 애플리케이션은 메소드의 JFrame 리스너 WindowListener에서 종료됩니다. 창닫기. 창이 닫히면 투명 Swing JOptionPane에서 확인 대화 상자를 여는 WindowEvent 이벤트 매개변수와 함께 windowClosing 메소드가 호출됩니다.

다음 스크린샷은 두 개의 애플리케이션 창을 보여줍니다. 상단 메인 창. 이 창을 닫으면 하위 의도 확인 대화 상자가 열립니다.

메뉴 바 JMenuBar

Swing에서 JRootPane을 사용할 때 중요한 기능 중 하나는 창에 메뉴 표시줄을 배치해야 한다는 것입니다. JMenuBar. 프로그램 기능에 액세스하기 위한 일종의 메뉴가 없으면 심각한 응용 프로그램을 구축할 수 없습니다. Swing 라이브러리는 경량 구성 요소이기도 한 사용자 친화적인 JMenuBar 메뉴를 생성하기 위한 탁월한 기능을 제공합니다.

메뉴바 JMenuBar특수 레이어 FRAME_CONTENT_LAYER의 다중 레이어 패널에 배치되며 창 상단의 작은 공간을 차지합니다. 메뉴바의 길이는 창의 크기와 같습니다. 메뉴 표시줄의 너비는 포함된 구성 요소에 따라 달라집니다.

루트 패널은 컨텐츠 패널과 메뉴 표시줄을 보장합니다. JMenuBar겹치지 않았습니다. 메뉴 표시줄이 필요하지 않은 경우 루트 패널은 콘텐츠 패널을 수용하기 위해 모든 공간을 사용합니다.

스윙 예

페이지 텍스트에 설명된 예제의 소스 코드를 다운로드할 수 있습니다.

지식 기반에서 좋은 작업을 보내는 것은 간단합니다. 아래 양식을 사용하세요

연구와 업무에 지식 기반을 활용하는 학생, 대학원생, 젊은 과학자들은 여러분에게 매우 감사할 것입니다.

게시 날짜 http://www.allbest.ru/

소개

지난 몇 년 동안 개발자들은 Java 애플릿과 애플리케이션에 그래픽과 애니메이션을 통합하기 위해 열심히 노력해 왔습니다. java.awt 및 javax.swing 애플리케이션 프로그래밍 인터페이스를 사용하여 개발자는 게임, 화면 보호기, 화면 보호기그리고 3D 그래픽 사용자 인터페이스.

작업의 목적은 java.awt 및 javax.swing 라이브러리의 그래픽 인터페이스를 사용하여 애플리케이션을 구축하는 데 전념하는 컴퓨팅 및 그래픽 작업입니다.

관련성 오늘날 프로그래밍 언어에서는 그래픽이 그다지 중요하지 않습니다. 모든 프로그램을 시각화할 수 있어 특정 프로그램을 더 밝고 편리하게 사용할 수 있습니다. 데이터베이스 개발, 모바일 및 컴퓨터 게임 작성에 편리한 밝고 흥미로운 웹 페이지를 만들 수 있습니다.

1. 문제의 공식화

그래픽 사용자 인터페이스(GUI)는 최종 사용자가 Java 애플리케이션과 상호 작용하는 주요 방법입니다. Java 또는 그래픽 애플리케이션 인터페이스로 애플리케이션 소프트웨어를 개발하려면 일반적으로 AWT 및 Swing 패키지가 사용됩니다.

AWT(액세스를 위해 다운로드되는 java.awt 패키지)에는 VBA 및 Delphi에서 수행되는 것과 유사하게 그래픽 작업을 수행하고 창 컨트롤을 생성할 수 있는 클래스 세트가 포함되어 있습니다.

Swing(액세스하려면 javax.swing 패키지 다운로드)에는 대부분 AWT와 유사한 새로운 클래스가 포함되어 있습니다. 클래스 이름(JButton, JLabel 등)에 J가 추가됩니다.

~에 이 순간시각적 인터페이스를 구축하기 위한 주요 클래스는 Swing 패키지에 포함되어 있습니다. AWT 패키지의 클래스는 메시지를 처리하는 데 사용됩니다. 가장 간단한 그래픽 응용아래에 나와 있습니다.

javax를 가져옵니다. 그네.*;

공개 최종 클래스 HelloWorld는 Runnable을 구현합니다(

공개 정적 무효 메인(문자열 인수) (

//Swing에는 자체 제어 스레드(소위 디스패칭 스레드)가 있습니다.

//메인(main()이 실행되는)과 병렬로 실행됩니다.

//개울. 메인 스레드의 실행이 끝나면(메인 메소드가 종료됨)

//Swing 인터페이스를 담당하는 스레드는 작업을 계속할 수 있습니다.

//사용자가 모든 창을 닫아도 프로그램은 계속 작동합니다.

//(이 스레드가 살아있는 한). Java 6 이후로 모든 것이

//구성요소가 파괴되면 제어 스레드가 자동으로 중지됩니다.

//초기화를 포함하여 제어 스레드에서 실행되는 모든 코드를 실행합니다.

SwingUtilities.invokeLater(new HelloWorld());

공개 무효 실행() (

// "Hello, World!"라는 제목의 창을 만듭니다.

프레임 f = new JFrame("Hello, World!");

// 앞서 다음과 같은 연습을 했습니다. 리스너를 생성하고 등록했습니다.

// windowClosing()에 응답한 기본 창 인스턴스에서

// 강제 정지 가상 기기 System.exit() 호출

// 이제 창 닫기에 대한 반응을 설정하는 보다 "올바른" 방법이 있습니다.

// 이 방법현재 창을 삭제하지만 응용 프로그램을 중지하지는 않습니다. 그들을

// 모든 창이 닫힐 때까지 애플리케이션 자체가 실행됩니다.

f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

// 그러나 다음과 같이 설정할 수도 있습니다.

// f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// 창 패널에 텍스트가 포함된 편집 불가능한 구성 요소를 추가합니다.

// f.getContentPane().add (new JLabel("Hello, World!")); - 구식

f.add(new JLabel("Hello World"));

// pack()은 창을 최적의 크기로 "압축"합니다.

// 그 안에 있는 모든 구성 요소.

// 창 표시

f.setVisible(true);

Swing 기술은 프레젠테이션의 다음 측면을 제어하는 ​​메커니즘을 제공합니다.

키보드(Swing은 사용자 입력을 가로채는 방법을 제공합니다)

색상(Swing은 화면에 표시되는 색상을 변경하는 방법을 제공합니다)

텍스트 입력 필드(Swing은 모든 일상 작업을 처리하기 위한 텍스트 구성 요소를 제공합니다).

JComponent

전체 Swing 시각적 구성 요소 라이브러리의 기본 클래스는 JComponent입니다. 이는 다른 시각적 구성요소의 슈퍼클래스입니다. 이는 추상 클래스이므로 실제로 JComponent를 생성할 수는 없지만 클래스 계층 구조의 결과로 각 Swing 구성 요소가 사용할 수 있는 수백 개의 함수가 포함되어 있습니다. JComponent 클래스는 모든 구성 요소에 색상 지정 인프라를 제공하고 키보드의 모든 키 입력을 처리하는 방법을 알고 있으므로 해당 하위 클래스는 특정 키만 수신하면 됩니다. JComponent 클래스에는 다른 JComponent 객체를 추가할 수 있는 add() 메서드도 포함되어 있으므로 Swing 구성 요소를 다른 구성 요소에 추가하여 중첩된 구성 요소(예: JButton을 포함하는 JPanel 또는 훨씬 더 멋진 조합)를 만들 수 있습니다. JButton을 포함하는 JMenu로).

JLabel

가장 간단하면서도 동시에 Swing 라이브러리의 주요 시각적 구성 요소는 JLabel 또는 "라벨"입니다. 이 클래스의 메서드에는 텍스트, 이미지, 정렬 및 레이블이 설명하는 기타 구성 요소 설정이 포함됩니다.

get/setText() - 라벨의 텍스트를 가져오거나 설정합니다.

get/setIcon() - 라벨의 이미지를 가져오거나 설정합니다.

get/setHorizontalAlignment - 텍스트의 가로 위치를 가져오거나 설정합니다.

get/setDisplayedMnemonic() - 레이블에 대한 니모닉(밑줄 그어진 문자)을 가져오거나 설정합니다.

get/setLabelFor() - 이 레이블이 첨부된 구성 요소를 가져오거나 설정합니다. 사용자가 Alt + 니모닉 키 조합을 누르면 포커스가 지정된 구성 요소로 이동합니다.

J버튼

Swing의 주요 활성 구성 요소는 Jbutton입니다.

JButton의 속성을 변경하는 데 사용되는 메서드는 JLabel의 메서드와 유사합니다(대부분의 Swing 구성 요소에서 유사함을 알 수 있음). 텍스트, 이미지 및 방향을 제어합니다.

get/setText() - 버튼의 텍스트를 가져오거나 설정합니다.

get/setIcon() - 버튼의 이미지를 가져오거나 설정합니다.

get/setHorizontalAlignment() - 텍스트의 가로 위치를 가져오거나 설정합니다.

get/setVerticalAlignment() - 텍스트의 수직 위치를 가져오거나 설정합니다.

get/setDisplayedMnenomic() - Alt 버튼과 함께 버튼을 누르게 하는 니모닉(밑줄 그어진 문자)을 가져오거나 설정합니다.

JFrame

JFrame 클래스는 구성 요소를 구성하고 사용자에게 표시하기 위해 다른 구성 요소를 자체에 추가할 수 있는 컨테이너입니다.

JFrame은 운영 체제 독립적인 Swing 부분과 이들이 실행되는 실제 운영 체제 사이의 브리지 역할을 합니다. JFrame은 창으로 등록되므로 최소화/최대화, 크기 조정 및 이동과 같은 많은 운영 체제 창 속성을 받습니다. 충족하면서도 실험실 작업 JFrame을 구성 요소를 배치하는 팔레트로 생각하면 충분합니다. 다음은 JFrame에서 해당 속성을 변경하기 위해 호출할 수 있는 몇 가지 메서드입니다.

get/setTitle() - 프레임 제목을 가져오거나 설정합니다.

get/setState() - 프레임 상태를 가져오거나 설정합니다(최소화, 최대화 등).

is/setVisible() - 프레임의 가시성, 즉 화면에 표시 여부를 가져오거나 설정합니다.

get/setLocation() - 창에서 프레임이 표시되어야 하는 위치를 가져오거나 설정합니다.

get/setSize() - 프레임 크기를 가져오거나 설정합니다.

add() - 프레임에 구성요소를 추가합니다.

스키마, 모델 및 이벤트

Java로 시각적 애플리케이션을 구축할 때 화면에 무작위로 배치하고 즉시 작동할 것이라고 기대할 수는 없습니다. 구성 요소는 특정 위치에 배치되고, 상호 작용에 반응하고, 해당 상호 작용을 기반으로 업데이트하고, 데이터로 채워야 합니다. 을 위한 효율적인 작업시각적 구성 요소를 사용하려면 다음 세 가지 Swing 아키텍처 구성 요소를 설치해야 합니다.

구성표(레이아웃). Swing에는 응용 프로그램에서 구성 요소가 배치되는 위치와 응용 프로그램 창 크기가 조정되거나 구성 요소가 제거 또는 추가될 때 구성 요소에 어떤 일이 발생해야 하는지를 제어하는 ​​클래스인 많은 스키마가 포함되어 있습니다.

이벤트 프로그램은 키 입력, 마우스 클릭 및 사용자가 수행할 수 있는 모든 작업에 응답해야 합니다.

모델 (모델). 고급 구성 요소(목록, 테이블, 트리) 및 JComboBox와 같은 일부 간단한 구성 요소의 경우에도 모델이 가장 좋습니다. 효과적인 방법데이터 작업. 이는 구성 요소 자체(MVC 생각)에서 대부분의 데이터 처리 작업을 제거하고 일반적인 데이터 개체 클래스(예: Vector 및 ArrayList)에 대한 래퍼를 제공합니다.

시각적 구성요소에 동적 장면을 묘사해야 하기 때문에 그래픽 2D 클래스에 특별한 주의를 기울여야 합니다.

계산 및 그래픽 작업의 개별 작업: 응용 프로그램 창에서 세그먼트를 따라 이동하는 점 주위의 프레임 평면에서 회전하는 세그먼트를 그립니다.

Java 그래픽 인터페이스 구성 요소

2. 고급 언어로 작업 구현자바

import java.awt.*;

import java.awt.geom.*;

import java.awt.image.BufferedImage;

* 4. 묘사하다 V 창문 애플리케이션 (애플릿) 선분, 회전 V

* 비행기 액자 포인트들 움직이는 에 의해 분절.

공용 클래스 LB4는 java.applet.Applet을 확장하여 Runnable을 구현합니다(

비공개 정적 최종 긴 serialVersionUID= 1L;

비공개 int w, h;

개인용 BufferedImage bi;

개인 Graphics2D 큰;

개인 부울 중지 = false;

개인 스레드 타이머 = null;

개인 색상 fonColor = 색상. 하얀색;

개인 색상 세그먼트색상 = 색상. LIGHT_GRAY;

개인 색상 pointColor = 색상. 녹색;

프라이빗 세그먼트 세그먼트;

// 초기의 위치 그림

개인 이중 길이Segment;

// 방향 오프셋 회전

개인 이중 movePoint = -1;

개인 이중 교대 = 0;

개인 이중 속도 포인트 = 1;

// 속도 변화 식량 V 공간

개인 int speedRepaint = 30;

// 모서리 ~에 어느 ~이 일어나고있다 변화 식량 분절

개인 정수 대학원 = 15;

/** 이것 방법 ~ 할 것이다 ~라고 불리는 ~ 후에 다운로드 애플릿 */

공개 무효 초기화() (

// 우리는 창조한다 사물그리고 설치하다 초기의 가치.

치수 희미 = getSize();

// 우리는 창조한다분절 질문 길이

lengthSegment = (이중) 수학. (w, h) / 3;

세그먼트 = 새 세그먼트(lengthSegment, lengthSegment / 2, grad,

세그먼트컬러, 포인트컬러, 폰컬러);

bi = (BufferedImage) createImage(w, h);

big = bi.createGraphics();

big.setRenderingHint(RenderingHints. KEY_안티앨리어싱,

렌더링힌트. VALUE_ANTIALIAS_ON);

// 우리는 창조한다 흐름, 어느 ~ 할 것이다 주기적으로 부르다 방법업데이트.

타이머 = 새 스레드(this);

) 잡기 (예외 e) (

체계. 밖으로.println(e);

) //끝 초기화

// 이것 방법 수행하다 다시 그리기 창문 애플릿

공공 무효 업데이트(그래픽 g) (

// 우리는 얻는다 바늘 ~에 객체그래픽2D

Graphics2D g2 = (Graphics2D) g;

// 그려 보자 준비가 된 영상 ~에 화면

g2.drawImage(bi, 0, 0, this);

) catch (예외 오류) (

체계. 밖으로.println(error.getMessage());

개인 무효 drawSegment() (

* //청소 그림 big.setBackground(Color.BLUE); big.clearRect(0, 0,

// 그려 보자 선분

시프트 += movePoint * speedPoint;

만약 (시프트< -lengthSegment / 2) {

movePoint *= -1;

시프트 = -lengthSegment / 2;

) else if (shift > lengthSegment / 2) (

movePoint *= -1;

시프트 = 길이세그먼트 / 2;

세그먼트.setPos(shift, speedPoint);

세그먼트.회전();

big.drawImage(segment.getSegment(), null, 0, 0);

// 이것 방법 수행 V 분리된 개울(시간제 노동자).

// 원인 다시 그리기 창문 애플릿 모든 잠깐만.

공개 무효 실행() (

실. 현재스레드();

실. (속도다시 그리기);

) 잡기 (예외 오류) (

// 이것 방법 수행 만약에 사용자 왼쪽 페이지

// 와 함께 애플릿. 정류장 흐름(타이머) 그리고, 각기,

// 다시 그리기 창문애플릿.

공공 무효 중지() (

// 이 메소드는 사용자가 페이지에 접속할 때 실행됩니다.

//애플릿으로. 병렬 스레드(타이머)를 시작합니다.

공개 무효 시작() (

if (타이머 == null) (

타이머 = 새 스레드(this);

// 이 메소드는 애플릿 페이지가 닫힐 때 실행됩니다.

공공 무효 파괴() (

super.destroy();

실. 현재스레드();

// 병렬 스레드(타이머)가 작업을 완료할 때까지 기다립니다.

실. 생산하다();

) // 파괴 종료

) // 공개 클래스 RotatingSegment 종료

//세그먼트 생성

개인 정적 이중 엑스 = 0;

최종 이중 RAD = 10;

개인 이중 길이;

개인용 BufferedImage 세그먼트;

개인 색상 세그먼트Color;

개인 색상 pointColor;

개인 색상 backGroundColor;

개인 Rectangle2D.Double r;

개인 Ellipse2D.Double p;

개인 이중 회전Axis;

개인 Point2D.Double 센터;

개인 이중 교대;

// 세그먼트의 위치가 변경되는 각도

사립 대학원생;

세그먼트(이중 길이, 이중 posPointRotating, int grad,

색상분할Color, Color pointColor, Color backGroundColor)

예외가 발생합니다(

// 매개변수 확인

만약 (길이<= 0 || posPointRotating < 0 || length < posPointRotating)

새로운 예외를 발생시킵니다(

"오류: Segment 클래스의 매개변수가 잘못 설정되었습니다.");

this.grad = 대학원;

this.segmentColor = 세그먼트색상;

this.pointColor = 포인트컬러;

this.backGroundColor = backGroundColor;

this.길이 = 길이;

// 그림을 만듭니다

세그먼트 = 새로운 BufferedImage((int) 길이 * 3, (int) 길이 * 3,

버퍼링된 이미지. TYPE_INT_ARGB);

center = new Point2D.Double(length, 3 * length / 2);

// 세그먼트 생성

RotationAxis = center.x + posPointRotating - RAD / 2;

p = new Ellipse2D.Double(rotationAxis, center.y, RAD, RAD);

// 세그먼트의 색상을 설정합니다.

g2.setColor(segmentColor);

// 세그먼트 그리기

// 포인트 색상 설정

g2.setColor(pointColor);

// 점을 그립니다

// 회전점을 이동한다

공공 무효 setPos(이중 시프트X, 이중 시프트Y) (

// 세그먼트 생성

this.shift = ShiftX;

center.y = center.y + ShiftY * 수학. (수학. 라디안으로(졸업 * 엑스));

r = new Rectangle2D.Double(center.x, center.y, length, RAD);

p = new Ellipse2D.Double(rotationAxis + Shift, center.y, RAD, RAD);

// 세그먼트를 회전시킵니다.

공공 무효 회전() (

AffineTransform at = AffineTransform. getRotateInstance(

수학. 라디안으로(졸업*(++ 엑스)), 회전축 + RAD / 2 + 시프트,

// 그래픽 컨텍스트를 얻습니다.

Graphics2D g2 = 세그먼트.createGraphics();

// 주어진 색상으로 모든 것을 칠합니다.

g2.setBackground(backGroundColor);

g2.clearRect(0, 0, (int) (3 * 길이), (int) (3 * 길이));

g2.setTransform(at);

g2.setColor(segmentColor);

// 세그먼트 그리기

// 포인트 색상 설정

g2.setColor(pointColor);

// 점을 그립니다

// 이미지를 반환합니다.

공개 BufferedImage getSegment() (

3. 프로그램 작동 예

프로그램 실행 결과:

그림 1. 프로그램 실행 결과

그림 2. 프로그램 실행 결과

그림 3. 프로그램 실행 결과

결론

이것으로 Java 그래픽에 대한 논의를 마칩니다. 본 논문에서는 Java의 2D 그래픽 프로그래밍 도구에 대한 간략한 개요를 제시했습니다. 우리는 기하학적 모양과 질감의 사용을 보여주는 애플리케이션을 제시했습니다.

우리는 Java의 그래픽 기능 중 일부를 논의했습니다. 좌표계 및 그래픽 컨텍스트와 같은 그래픽 기본 사항에 대한 간략한 소개부터 시작했습니다. 그런 다음 Java 2D 도구에 대해 논의했습니다. 그래픽 효과를 활용하는 방법도 간략하게 다루었습니다.

Java 그래픽 프로그래밍 소개의 후반부입니다. java.awt 및 javax.swing 라이브러리의 그래픽 인터페이스를 사용하여 축을 중심으로 2차원 객체를 회전시키는 간단한 그래픽 편집기를 만들었습니다.

서지

1. H.M. 데이텔, P.J. 데이텔, S.I. Santry - Java 프로그래밍 기술, 1권(그래픽, JAVABEANS, 사용자 인터페이스)

2. Judy Bishop - Java를 효율적으로 실행

3. James Gosling, Bill Joy, Guy Steele, Gilad Bracha - Java 언어 사양, 제2판.

4. Tim Lindholm, Frank Yellin - Java Virtual Machine 사양, 제2판.

5. Gosling J., Arnold K. - Java 프로그래밍 언어

6. 웹사이트 www.ibm.com의 정보

7. 웹사이트 www.mexmat.sgu.ru의 정보

8. 웹사이트 www.uic.rsu.ru의 정보

Allbest.ru에 게시됨

...

유사한 문서

    GUI 조직 구조, 익명 클래스를 사용한 이벤트 리스너의 선언 및 생성. 테이블의 데이터 표현은 AbstractTableModel 클래스입니다. 테이블 셀 시각화. Java의 두 가지 주요 I/O 스트림 유형입니다.

    강의, 2014년 5월 1일에 추가됨

    Java 프로그래밍 언어와 Java 2D 및 Java 3D 애플리케이션 프로그래밍 인터페이스를 사용하여 2D 및 3D 그래픽을 그리기 위한 그래픽 편집기 개발. 그래픽 편집기 3D 페인트 만들기. Graphics 클래스의 기본 메서드입니다.

    과정 작업, 2009년 11월 19일에 추가됨

    Net Beans 8.1 애플리케이션 패키지에 대한 설명입니다. 애플릿 사용자 인터페이스 개발. java.swing 라이브러리 프레임을 기반으로 프레임 창을 만듭니다. 텍스트 데이터의 색상을 변경합니다. 애플릿 정보 모델의 설계 및 생성.

    테스트, 2016년 7월 11일에 추가됨

    프로그래밍 언어의 네트워크 기능. Java 애플릿 사용의 이점. java.awt 라이브러리에 포함된 클래스입니다. 사용자 인터페이스 만들기. 서버에 대한 소켓 연결입니다. 자바의 그래픽. 색상 구성 요소의 값.

    과정 작업, 2014년 11월 10일에 추가됨

    Java 기초 클래스, 기본 개념. Abstract Window Toolkit의 원래 클래스 계층 구조입니다. 사용자 인터페이스 대표. JavaBeans의 이벤트 처리. 컨트롤, 여러 줄로 구성된 JText 필드. TextEditor 프로그램 목록.

    코스 작업, 2013년 6월 26일에 추가됨

    Java 프로그램을 실행합니다. JDK 프로그램 및 클래스 세트입니다. Java의 객체지향 프로그래밍. 그래픽 인터페이스 생성의 원리. 그래픽 시스템 구성요소 및 컨테이너. 애플릿은 브라우저 환경에서 실행되는 프로그램입니다.

    코스 작업, 2011년 2월 8일에 추가됨

    함수를 표로 작성하는 콘솔 애플리케이션의 다이어그램 콘솔 애플리케이션과 애플리케이션 및 GUI의 차이점 JFrame 및 JPanel의 클래스 다이어그램. Java로 간단한 프레임 만들기. 프레임 내부의 인터페이스 요소 레이아웃. 이벤트 처리 루프.

    강의, 2014년 5월 1일에 추가됨

    PHP 프로그래밍 언어의 개념과 일반적인 특성, 작업의 원리와 단계, 구문 및 관련 배열. Java의 예외 처리. JDBC를 사용하여 데이터베이스 작업. 그래픽 인터페이스를 개발하는 방법을 배웁니다.

    프레젠테이션, 2014년 6월 13일에 추가됨

    자동차 제조업체를 위한 데이터베이스의 논리 다이어그램 개발. 시스템의 정보학적 모델링. Java 프로그래밍 언어를 사용하여 데이터베이스용 그래픽 사용자 인터페이스를 만듭니다. 소프트웨어 테스팅.

    과정 작업, 2013년 12월 16일에 추가됨

    그래픽 사용자 인터페이스를 사용하여 콘솔 애플리케이션 만들기. C++ Builder 프로그램의 구성 요소 팔레트 내용입니다. 객체 지향 프로그래밍 기능, 코드 편집기 기능 및 C++ 양식을 사용합니다.

따라서 Game of Life 논리가 구현됩니다. 나는 모니터 화면을 통해 '생명'의 다양한 형태를 사유하는 과정을 즐기고 싶다. 이를 위해 무엇이 필요합니까?

메뉴와 버튼이 있는 창 자체와 그 동작은 라이브러리를 사용하여 생성됩니다. 그네.도서관을 통해 우리의 '생명'의 진화 과정을 그려보세요 A.W.T.(보다 정확하게는 Java 2D). 이는 Java에서 그래픽 인터페이스를 생성하기 위한 두 가지 주요 패키지입니다.

AWT의 작업은 초기에 소위 피어 인터페이스를 기반으로 합니다. 요점은 화면에 Java 개체를 표시해야 하는 경우 운영 체제가 이와 쌍을 이루는 그래픽 개체를 생성하여 실제로 표시된다는 것입니다. 이 두 개체는 프로그램이 실행되는 동안 서로 상호 작용합니다. 이 구현으로 인해 각 플랫폼은 자체 JDK를 릴리스해야 합니다.

나중에 피어 인터페이스를 사용하지 않는 "경량" 구성 요소인 구성 요소가 AWT에서 생성되었습니다. 이러한 구성 요소의 라이브러리를 Swing이라고 합니다. 즉, Swing은 본질적으로 AWT의 확장입니다.

AWT 자체에는 이미지 그리기 및 표시를 위한 새로운 도구가 추가되었습니다. 자바 2D.

Swing의 주요 요소에 대해 간단한 설명과 함께 나열하겠습니다.

전체 Swing 시각적 구성 요소 라이브러리의 기본 구성 요소는 다음과 같습니다. JComponent. 이는 각 구성요소의 슈퍼클래스입니다. 이는 추상 클래스이므로 실제로 JComponent를 생성할 수는 없지만 클래스 계층 구조의 결과로 각 Swing 구성 요소가 사용할 수 있는 문자 그대로 수백 개의 함수를 포함합니다.

JFrame(응용 프로그램 창)은 다른 구성 요소를 추가하여 구성하고 사용자에게 표시할 수 있는 기본 컨테이너입니다. JFrame은 OS 독립적인 Swing 부분과 이들이 실행되는 실제 OS 사이의 브리지 역할을 합니다. JFrame은 OS에 창으로 등록되므로 운영 체제 창의 친숙한 속성 중 많은 부분을 얻습니다.

JMenu/JMenuItem/JMenuBar— JFrame에서 메뉴 시스템을 개발하기 위해 설계되었습니다. 모든 메뉴 시스템의 기본은 JMenuBar이며 모든 JMenu 및 JMenuItem은 이를 사용하여 생성됩니다. JMenu는 JMenuItem의 하위 클래스입니다. 그러나 모양이 다릅니다. JMenu는 다른 JMenuItem 및 JMenu를 포함하는 데 사용됩니다. JMenuItem을 선택하면 작업이 활성화됩니다.

JLabel(라벨) - (텍스트 또는 그래픽) 다른 요소를 설명하기 위한 것입니다.

J버튼(버튼)은 누르면 어떤 작업을 수행할 수 있게 해주는 주요 활성 구성 요소입니다. 구성 요소의 표시를 제어하는 ​​표준 방법 외에도 구성 요소의 상태(활성/비활성, 선택/선택 안 함, 마우스를 위에 얹음/마우스 없음, 누르기/놓기)를 관리하기 위한 방법 그룹이 포함되어 있습니다.

JTextField(텍스트 필드) - 사용자가 프로그램에서 처리할 수 있는 텍스트 데이터를 입력할 수 있습니다.

JTextArea여러 줄을 입력할 수 있도록 하여 JTextField를 확장합니다.

JPassword필드(비밀번호 입력 필드)는 입력한 문자를 숨길 수 있는 JTextField 유형입니다.

JComboBox(콤보 목록) - 사용자가 기존 목록에서 항목을 선택하거나 목록에 새 항목을 추가할 수 있습니다.

JCheckBox(체크박스) 및 JRadio버튼(스위치) - 사용자에게 선택할 수 있는 옵션을 제공합니다. JRadioButton은 일반적으로 사용자에게 강제 답변 질문을 제공하기 위해 함께 그룹화됩니다(답변은 상호 배타적입니다. 질문당 하나의 답변만 있을 수 있습니다). JRadioButton을 선택한 후에는 그룹에서 다른 옵션을 선택할 때까지 선택을 취소할 수 없습니다. JCheckBox는 다르게 작동합니다. 언제든지 옵션을 선택/선택 취소하고 질문에 대한 여러 답변을 선택할 수 있습니다. JCheckBox 또는 JRadioButton 구성 요소를 함께 그룹화할 수 있는 클래스는 다음과 같습니다. 버튼그룹.

JSlider— 그래픽으로 표현된 범위에서 숫자 값을 선택하기 위한 요소입니다.

JSpinner -값 그룹에서 선택하기 위한 것입니다. 이 점에서는 JComboBox와 유사하지만 서로 바꿔서 사용할 수는 없습니다. 논리적으로 일관된 옵션을 위해서만 JSpinner를 사용해야 합니다. 여기에는 숫자와 날짜가 이상적입니다. 반면에 JComboBox는 서로 관계가 없는 것처럼 보이는 무작위 옵션을 제공하는 데 더 나은 선택입니다.

JToolBar대부분의 애플리케이션에서 발견되는 도구 모음을 함께 구성하는 다른 구성 요소(JButton, JComboBox 등)에 대한 컨테이너 역할을 합니다. 도구 모음을 사용하면 프로그램에서 자주 사용하는 명령을 편리한 위치에 배치하고 그룹화할 수 있습니다. 일반적으로 도구 모음 버튼은 메뉴 명령에 해당합니다.

JToolTip마우스를 무언가 위로 가져가면 나타나는 작은 "거품"입니다. 요소에 대한 도구 설명을 제공하고, 정보를 드릴다운하거나, 압축된 UI에 요소의 전체 텍스트를 표시하는 등 애플리케이션에서 매우 유용할 수 있습니다. Swing에서 일정 시간 동안 구성 요소 위에 마우스 커서를 놓으면 활성화됩니다. 일반적으로 마우스를 멈춘 후 약 1초 후에 나타나며 커서가 구성 요소 위에 남아 있는 한 계속 표시됩니다.

JOptionPane- UI 개발자에게 간단한 메시지(오류 또는 기타 정보에 대한)를 발행하고 데이터(예: 이름 또는 번호)를 빠르게 검색하는 방법을 제공하기 위한 클래스입니다.

JScrollPane -모든 스크롤 작업을 처리하는 Swing 구성 요소입니다.

JList사용자에게 선택할 수 있는 다양한 옵션을 제공하는 데 유용한 구성 요소입니다. JComboBox의 확장이라고 생각하면 됩니다. JList는 더 많은 옵션을 제공하고 여러 옵션을 선택할 수 있는 기능을 추가합니다. JList와 JComboBox 사이의 선택은 종종 다음과 같습니다: 다중 선택 기능이 필요하거나 15개 이상의 옵션이 있는 경우(이 숫자가 일반적인 규칙은 아니지만) 항상 JList를 선택해야 합니다. 가시 영역에 맞는 것보다 더 많은 옵션을 제공할 수 있으므로 JScrollPane과 함께 JList를 사용해야 합니다. JList에는 다양한 선택 유형의 옵션을 설정할 수 있는 선택 모델도 있습니다. 이러한 유형에는 단일 선택(하나의 옵션만 선택할 수 있음), 단일 간격(인접한 옵션을 선택할 수 있지만 그 수에는 제한이 없음) 및 다중 간격(어떤 조합으로든 원하는 수의 옵션을 선택할 수 있음)이 있습니다.

Java에는 그래픽 사용자 인터페이스를 생성하기 위한 두 가지 주요 패키지가 있습니다. 이는 AWT(Abstract Windows Toolkit) 및 Swing입니다. AWT는 운영 체제 위젯을 사용하므로 이 라이브러리가 약간 더 빠릅니다. 하지만 제 생각에는 Swing이 더 잘 디자인되었습니다.

이번 튜토리얼에서는 Swing 라이브러리의 기본 요소를 살펴보고, 간단한 인터페이스(GUI)를 예시로 만들어 보겠습니다.

컨테이너는 인터페이스 구성 요소를 그룹화하는 데 사용됩니다. 애플리케이션의 기본 컨테이너를 생성하려면 JFrame 컨테이너가 가장 자주 사용됩니다(JWindows 및 JApplet도 있음). 가장 쉬운 방법은 JFrame에서 상속하여 많은 메서드에 액세스하는 것입니다. 예를 들면 다음과 같습니다.

setBounds(x, y, w, h) - 창의 왼쪽 상단 정점 좌표와 너비 및 높이를 지정합니다.

setRessible(bool) - 창 크기를 조정할 수 있는지 여부를 나타냅니다.

setTitle(str) - 창 제목을 설정합니다.

setVisible(bool) - 실제로 창을 표시합니다.

setDefaultCloseOperation(Operation) - 창이 닫힐 때 수행될 작업을 지정합니다.

기본 컨트롤:

  • JLabel - 고정된 텍스트를 표시하기 위한 요소입니다.
  • JTextField - 간단한 편집 상자;
  • JButton - 일반 버튼(버튼);
  • JCheckBox - 선택 요소(체크박스와 유사)
  • JRadioButton - 라디오 버튼

보시다시피 모든 것이 매우 간단하고 논리적입니다.

컨트롤을 표시할 때 특수 관리자인 LayoutManager가 사용됩니다. 모든 LayoutManager에는 요소를 추가하고 제거하는 메서드가 있습니다.

FlowLayout - 요소를 순차적으로 표시하는 데 사용됩니다. 요소가 특정 줄에 맞지 않으면 다음 줄에 나타납니다.

GridLayout - 동일한 셀 크기를 가진 테이블 형식으로 요소를 표시합니다.

BorderLayout - 5개 이하의 요소를 표시할 때 사용됩니다. 이러한 요소는 프레임 가장자리와 중앙(북쪽, 남쪽, 동쪽, 서쪽, 중앙)에 위치합니다.

BoxLayout - 행이나 열에 요소를 표시합니다.

GridBagLayout - 각 위젯의 위치와 크기를 할당할 수 있습니다. 이는 가장 복잡하지만 가장 효과적인 디스플레이 유형이기도 합니다.

이벤트 처리에도 주의를 기울일 가치가 있습니다. 이를 위해 소위 이벤트 리스너가 사용됩니다.

이제 이론은 충분하고 GUI 예제로 넘어가겠습니다.

java.awt.* 가져오기; import java.awt.event.*; import javax.swing.*; 공용 클래스 SimpleGUI는 JFrame을 확장합니다( private JButton 버튼 = new JButton("Press"); private JTextField input = new JTextField("", 5); private JLabel label = new JLabel("Input:"); private JRadioButton radio1 = new JRadioButton ("선택"); private JRadioButton radio2 = new JRadioButton("선택"); private JCheckBox check = new JCheckBox("Check", false) ( super("간단한 예"); this.setBounds (100,100,250,100); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 컨테이너 컨테이너 = this.getContentPane(3,2,2,2)); ButtonGroup = new ButtonGroup(); radio2); radio1.setSelected(true); box.addActionListener(new ButtonEventListener()); class ButtonEventListener는 ActionListener를 구현합니다( public void actionPerformed(ActionEvent e)) ""; message += "버튼을 눌렀습니다\n"; message += "텍스트는 " + input.getText() + "\n"; message += (radio1.isSelected()?"라디오 #1":"라디오 #2") + "가 선택되었습니다\n"; message += "CheckBox는 " + ((check.isSelected()) ?"checked":"unchecked"); JOptionPane.showMessageDialog(null, message, "출력", JOptionPane.PLAIN_MESSAGE); ) ) public static void main(String args) ( SimpleGUI app = new SimpleGUI(); app.setVisible(true); ) )

노트:

getContentPane은 최상위 컨테이너를 반환합니다. ButtonGroup은 상호 연결된 라디오 버튼 그룹을 만드는 데 사용됩니다.

내부 클래스 ButtonActionListener는 ActionListener 인터페이스를 구현합니다. 이렇게 하려면 actionPerformed 메소드의 구현을 제공해야 합니다.

JOptionPane은 대화 상자를 표시하는 데 사용됩니다.

여러분의 질문과 의견을 기다리겠습니다. Swing에 대해 더 자세히 알고 싶으시면 저에게 알려주세요. 곧 더 발전된 기술과 구성 요소가 포함된 또 다른 기사를 작성하겠습니다.