[Java] 학교 에서 스윙 을 가 르 치고 있 습 니 다. 간단 한 기능 이 실 현 된 정리 - 창 을 표시 하고 2D 도형 을 그 리 며 클릭 사건 을 감청 합 니 다.

38711 단어 Java
우리 학교의 자바 교육 에서 스윙 의 기초 조작 을 좀 파악 해 야 한다. 비록 스윙 은 이미 아무 도 사용 하지 않 지만...그러나 배 우려 면 잘 배 워 야 한다. 왜냐하면 기술 이 많 으 면 몸 을 누 르 지 않 고 좋 은 성적 을 얻 을 수 있 기 때문이다.본 고 는 10 장 에서 간단 한 기초 작업 인 디 스 플레이 창, 창 속성 변경, 그림 그리 기, 사용자 클릭 에 대한 응답 등 을 실현 했다.원본 코드 를 모두 주 었 으 니 복습 시간 이 부족 하 다 면 간단하게 보 세 요.
디 렉 터 리:
  • 사용자 인터페이스 공구 꾸러미 의 역사
  • 창 표시
  • 구성 요소 에 정 보 를 표시 합 니 다. 2D 도형
  • 감청 클릭 이벤트

  • 사용자 인터페이스 공구 꾸러미 역사
    추상 창 패키지 (Abstract Window Toolkit, AWT) - > Swing 사용자 인터페이스 라 이브 러 리 - > JavaFX.
    AWT: 사용자 인터페이스 요 소 를 처리 하 는 작업 을 대상 플랫폼 의 네 이 티 브 GUI 도구 꾸러미 에 위탁 합 니 다.
  • 장점: 얻 은 프로그램 은 모든 플랫폼 에서 실 행 될 수 있 고 목표 플랫폼 의 소감 을 가진다.
  • 단점: 서로 다른 플랫폼 의 일부 사용자 인터페이스 요소 에 차이 가 존재 하고 일부 도형 환경의 사용자 그룹 키 집합 이 부족 하 며 서로 다른 플랫폼 에 서로 다른 bug 가 존재 합 니 다.

  • Swing: 바 텀 창 시스템 은 빈 창 만 표시 하고 사용자 인터페이스 요 소 를 빈 창 에 그립 니 다.
  • 장점: 서로 다른 플랫폼 에서 똑 같은 외관 과 행 위 를 가진다.표준 라 이브 러 리 의 일부분 입 니 다.
  • 단점: Swing 은 사용자 인터페이스의 모든 픽 셀 을 그 려 야 합 니 다. 속도 가 느 립 니 다.다른 많은 원생 부품 에 비해 아름 답지 못 하 다.

  • JavaFx:
  • 장점: 애니메이션 과 화려 한 효 과 를 실현 하기 위해 최적화 했다.자바 FX 2.0 은 자바 API 를 갖 추고 있다.
  • 단점: 자바 11 부터 자바 FX 는 자바 와 함께 포장 하지 않 습 니 다.

  • 창 보이 기
  • 창 (frame) 이 무엇 입 니까? 맨 위 창 (다른 창 에 포함 되 지 않 은 창) 입 니 다.
  • 어떻게 표시 하고 설명 합 니까? Swing 의 JFrame 류 (원래 AWT 라 이브 러 리 의 Frame 류 로 확장) 를 사용 합 니 다.

  • JFrame 은 다른 구성 요소 의 캔버스 입 니 다. 위 젯 은 Swing 이 아 닌 사용자 의 창 시스템 에서 그립 니 다.
    가장 간단 한 보 이 는 창 만 들 기:
    package simpleFrame;
    
    import java.awt.*;
    import javax.swing.*; //java    
    
    public class SimpleFrameTest 
    {
         
    	public static void main(String[] args)
    	{
         
    		EventQueue.invokeLater(()-> //       (event dispatch thread)
    			{
         
    				var frame = new SimpleFrame(); //     Simple Frame  
    				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//           。
    				frame.setVisible(true);//       
    			});
    	} //       ,              
    
    }
    
    class SimpleFrame extends JFrame //   JFrame
    {
         
    	private static final int DEFAULT_WIDTH = 300;
    	private static final int DEFAULT_HEIGHT = 200;
    	
    	public SimpleFrame() 
    	{
         
    		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    	}
    	
    }
    

    코드 설명:
  • javax. swing. *: javax 는 핵심 패키지 가 아 닌 자바 의 확장 패키지 라 고 표시 합 니 다.
  • EventQueue. invokeLater (() - > {}); 이벤트 할당 스 레 드 (event dispatch thread) 는 마우스 클릭 과 버튼 등 이 벤트 를 사용자 인터페이스 구성 요소 에 전달 하 는 제어 스 레 드 입 니 다. 주 스 레 드 에서 만 Swing 구성 요소 의 초기 화 를 완료 할 수 있 지만 점점 복잡 해 지 는 Swing 그룹 키 는 알 수 없 는 오 류 를 일 으 킬 수 있 습 니 다.
  • frame. setDefaultCloseOperation (JFrame. EXIT ON CLOSE);: 사용자 가 닫 기 를 눌 렀 을 때의 응답 동작 을 정의 합 니 다. 여 기 는 종료 입 니 다.
  • frame. setVisible (true);: 창 은 구조 할 때 보이 지 않 습 니 다. 프로그래머 가 창 을 표시 하기 전에 창 디자인 을 완성 할 수 있 습 니 다. setVisible 함 수 를 호출 하여 창 을 볼 수 있 습 니 다.
  • setSize (DEFAULT WIDTH, DEFAULT HEIGHT);: 구조 함수 에 만들어 진 창의 크기 를 설정 합 니 다. 설정 하지 않 으 면 기본 창 크기 는 0x0 입 니 다.
  • 주의: 저 희 는 이벤트 할당 스 레 드 에서 프로그램 을 실행 합 니 다. 주 프로그램 이 끝 났 더 라 도 이벤트 할당 스 레 드 는 활성화 상 태 를 유지 합 니 다. 사용자 가 창 을 닫 거나 System. exit 방법 으로 종료 하지 않 는 한.
  • 창 모양 변경:
    JFrame 클래스 자 체 는 창 모양 을 바 꾸 는 몇 가지 방법 만 정 의 했 습 니 다. 그러나 종류 가 매우 많 기 때문에 창 속성 을 설정 하 는 방법 이 매우 풍부 합 니 다. 다음 과 같은 몇 가지 방법 을 보 여 줍 니 다.
  • setLocation (x, y) 는 초 클래스 Component 에서 나 온 것 으로 창 을 수평 으로 오른쪽 x 픽 셀 로 표시 하고 수직 으로 Y 픽 셀 의 위 치 를 표시 할 수 있 습 니 다.
  • setBounds (x, y, width, height) 는 초 류 Component 에서 나 와 창의 위치 와 크기 를 조정 합 니 다.
  • getTitle (), setTitle (String title) 은 초 클래스 프레임 에서 제목 을 가 져 오 거나 설정 합 니 다.
  • setLocationByPlatform (boolean b) 은 초 클래스 Window 에서 왔 으 며, true 로 설정 한 후, 창 위 치 는 플랫폼 에서 선택 합 니 다.
  • setResizable (boolean b) 은 초 클래스 프레임 에서 나 왔 습 니 다. false 로 설정 하면 창 크기 를 조절 할 수 없습니다.
  • Image getIconImage (), setIconImage (Image image) 는 초 클래스 Frame 에서 나 온 것 으로 창의 iconImage 를 가 져 오 거나 설정 합 니 다. 시스템 은 이 아이콘 을 모든 위치 에 표시 할 수 있 습 니 다.
  • 구성 요소 에 정보 표시 - 2D 도형
    창 에 내용 을 직접 그 릴 수 는 있 지만 그렇게 하지 않 습 니 다. 올 바른 방법 은 구성 요 소 를 창 에 추가 하고 구성 요소 에 정 보 를 그 리 는 것 입 니 다.
  • 구성 요 소 를 어떻게 설정 합 니까? 확장 과 JComponent 의 종 류 를 정의 하고 그 중의 paintComponent 방법 을 덮어 씁 니 다.
  • 구성 요 소 를 창 에 추가 하 는 방법: frame. add () 함 수 를 사용 합 니 다. 이 방법 은 구성 요 소 를 창의 내용 창 에 추가 합 니 다.
  • 그림, 그림, 텍스트 를 어떻게 그립 니까? 그래 픽 클래스 를 사용 합 니 다.
  • paintComponent () 방법 은 언제 자동 으로 호출 됩 니까? 1. 사용자 가 창 을 확대 하거나 극소 화 한 후에 원래 크기 로 복원 합 니 다. 2. 창 이 덮어 진 후에 다시 표시 합 니 다
  • 창 을 다시 그 려 야 한다 면 이벤트 프로 세 서 는 구성 요소 에 모든 구성 요 소 를 실행 하 는 paintComponent 방법 을 알려 줍 니 다. 이 방법 을 직접 사용 하지 마 십시오. 그렇지 않 으 면 이 자동 처리 과정 에 파 괴 될 수 있 습 니 다.
    1. 창 에 구성 요 소 를 표시 하고 구성 요소 에 텍스트 정 보 를 그립 니 다.
    package notHelloWorld;
    
    import javax.swing.*;
    import java.awt.*;
    
    public class NotHelloWorld 
    {
         
    	public static void main(String args[])
    	{
         
    		EventQueue.invokeLater(()->
    				{
         
    					var frame = new NotHelloWorldFrame();
    					frame.setTitle("Not a Hello World");
    					frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    					frame.setVisible(true);
    				});
    	}
    }
    
    class NotHelloWorldFrame extends JFrame
    {
         
    	public NotHelloWorldFrame()
    	{
         
    		add(new NotHelloWorldComponent());//          
    		pack();//         ,     getPreferredSize   
    	}
    }
    
    class NotHelloWorldComponent extends JComponent 
    {
         
    	public static final int MESSAGE_X = 75;
    	public static final int MESSAGE_Y = 100;
    	
    	private static final int DEFAULT_WIDTH = 300;
    	private static final int DEFAULT_HEIGHT = 200;
    	
    	public void paintComponent(Graphics g) //          
    	{
         
    		g.drawString("Not a Hello World program!", MESSAGE_X, MESSAGE_Y);
    	}
    	
    	public Dimension getPreferredSize() //         
    	{
         
    		return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    	}
    }
    

    코드 설명:
  • pack (): 창 크기 를 창 에 추 가 된 구성 요소 의 첫 번 째 크기 로 조정 합 니 다.
  • void paintComponent (Graphics g): 이 방법 을 덮어 서 필요 한 내용 을 확인 합 니 다. 다시 그 려 야 할 때마다 스 레 드 는 자동 으로 이 함 수 를 호출 합 니 다.
  • Dimension getPreferredSize (): 구성 요소 의 첫 번 째 크기 를 설정 합 니 다. 창 은 pack () 함 수 를 호출 하여 구성 요 소 를 이 크기 로 조정 할 수 있 습 니 다.
  • 요약, 창 에 정 보 를 표시 하 는 세 가지 절차:
  • 구성 요소 클래스 를 정의 하고 그림 의 내용 과 첫 번 째 크기 를 확인 합 니 다.
  • 창 클래스 를 정의 하고 구성 요 소 를 창 에 추가 합 니 다.
  • 이벤트 할당 스 레 드 를 만 들 고 창 대상 을 만 들 고 창 속성 을 설정 합 니 다.
  • 2. 2D 도형 그리 기:
    Graphics 클래스: 직선, 사각형, 타원 등 을 그립 니 다. 기능 이 제한 되 어 있 습 니 다.
    자바 2D 라 이브 러 리 의 도형 류: Graphics 류 의 키 종류 로 기능 이 더욱 풍부 합 니 다. 기본 적 인 도형 을 제외 하고 원호, 2 차 곡선, 3 차 곡선 등 도 그 릴 수 있 습 니 다. 여기 서 자바 2D 라 이브 러 리 의 도형 류 를 중심 으로 소개 합 니 다.
    그림 그리 기 단계:
  • shape 인 터 페 이 스 를 실현 하 는 클래스 를 만 듭 니 다 (예 를 들 어 Rectangle2D, Ellipse2D, Line 2D 등).
  • Graphics 2D 류 의 draw 방법 으로 도형 을 그립 니 다.
  • import java.awt.*;
    import javax.swing.*;
    import java.awt.geom.*; //        shape    , Ellipse2D  
    
    public class DrawTest {
         
    	public static void main(String[] args) 
    	{
         
    		EventQueue.invokeLater(()-> //      
    				{
         
    					var frame = new DrawFrame();
    					frame.setTitle("DrawTest");
    					frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    					frame.setBounds(300, 300, 800, 800);
    					frame.setVisible(true);
    				});
    	}
    
    }
    
    class DrawFrame extends JFrame //      
    {
         
    	public DrawFrame()
    	{
         
    		add(new DrawComponent());//         
    		pack();					//         
    	}	
    }
    
    class DrawComponent extends JComponent //           
    {
         
    	private static final int DEFAULT_WIDTH = 400;
    	private static final int DEFAULT_HEIGHT = 400;
    	
    	public void paintComponent(Graphics g) //       
    	{
         
    		var g2 = (Graphics2D) g;//Graphics2D Graphics   ,          
    		
    		double leftX = 100;
    		double topY = 100;
    		double width = 200;
    		double height = 150;
    		
    		var rect = new Rectangle2D.Double(leftX, topY, width,height);//       ,   :     , , 
    		g2.draw(rect);
    		
    		var ellipse = new Ellipse2D.Double();
    		ellipse.setFrame(rect);//                 
    		g2.draw(ellipse);
    		
    		var line = new Line2D.Double(leftX, topY, leftX + width, topY + height);//      ,   :    ,    
    		g2.draw(line);
    		
    		double centerX = rect.getCenterX();
    		double centerY = rect.getCenterY();
    		double radius = 150;
    		var circle = new Ellipse2D.Double();
    		circle.setFrameFromCenter(centerX, centerY, centerX + radius, centerY + radius);//                 
    		g2.draw(circle);
    	}
    	
    	public Dimension getPerredSize() //            
    	{
         
    		return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    	}
    }
    

    몇 가지 보충 설명:
  • Rectangle2D.Double() / Rectangle2D.Float(): 화면 에 픽 셀 만 인쇄 하면 Float 의 정밀도 가 우리 의 요 구 를 만족 시 킬 수 있 습 니 다. 그러나 자바 언어 는 Double 을 Float 로 자동 으로 변환 할 수 없 기 때문에 2D 라 이브 러 리 의 디자이너 는 모든 그래 픽 류 에 두 가지 버 전 을 제공 합 니 다. Double 버 전 은 double 형식의 좌 표를 사용 하여 더욱 편리 합 니 다. Float 버 전 은 float 형식의 좌 표를 사용 하여 공간 을 절약 할 수 있 습 니 다.
  • Ellipse2D 류 와 Rectangle2D 류 는 RectangleShape 류 에 계승 되 고 RectangleShape 류 는 Shape 류 에 계승 되 며 Line2D 류 는 Shape 류 에 직접 계승 된다.
  • 감청 클릭 이벤트
    GUI 를 지원 하 는 모든 작업 환경 은 사용자 와 상호작용 을 해 야 합 니 다. 다시 말 하면 작업 환경 은 버튼 과 마우스 클릭 이 일어 나 는 사건 을 계속 감시 해 야 합 니 다. 관련 사건 이 발생 하면 작업 환경 은 프로그램 에 보고 하고 프로그램 은 이에 상응하는 동작 을 합 니 다. 먼저 다음 과 같은 몇 가지 명 사 를 설명 합 니 다.
  • 이벤트 원본: 예 를 들 어 버튼 하나, 슬라이더 하나 등 이벤트 원본 은 이벤트 모니터 를 불 러 올 수 있 습 니 다.
  • 모니터 인터페이스 (Action Listener): 모니터 클래스 를 정의 하려 면 모니터 인 터 페 이 스 를 실현 해 야 합 니 다. 인터페이스 에 있 는 actionPerformed 함 수 를 다시 써 야 합 니 다. 함수 체 는 이벤트 소스 로 이벤트 (예 를 들 어 클릭) 를 받 을 때의 응답 입 니 다.
  • 이벤트 감청 기: 감청 기 인터페이스의 클래스 를 실현 합 니 다. 대상 은 이벤트 원본 을 불 러 와 서 이벤트 발생 여 부 를 감청 할 수 있 습 니 다.
  • 구체 적 인 조작 과정 은 다음 과 같다.
  • 이벤트 원본 생 성 (여기 단추 버튼 을 예 로 들 면)
  • 패 널 생 성 (Panel)
  • 이벤트 원본 을 패 널 에 추가 합 니 다
  • 창 에 패 널 추가
  • 이벤트 감청 기의 클래스 를 정의 합 니 다. (감청 기 인터페이스 ActionListener 를 실현 해 야 합 니 다.) 클래스 에 actionPerformed 방법 을 덮어 야 합 니 다.
  • 이벤트 모니터 생 성
  • 모니터 를 이벤트 소스 에 추가
  • package button;
    
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    public class ButtonFrame extends JFrame{
         
    	private JPanel buttonPanel;
    	private static final int DEFAULT_WIDTH = 300;
    	private static final int DEFAULT_HEIGHT = 200;
    	
    	public ButtonFrame()
    	{
         
    		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    	//1.     
    		var yellowButton = new JButton("Yellow");
    		var blueButton = new JButton("Blue");
    		var redButton = new JButton("Red");
    	//2.      
    		buttonPanel = new JPanel();
    	//3.           
    		buttonPanel.add(yellowButton);
    		buttonPanel.add(blueButton);
    		buttonPanel.add(redButton);
    	//4.          
    		add(buttonPanel);
    	//6.         ColorAction(     )	
    		var yellowAction = new ColorAction(Color.YELLOW);
    		var blueAction = new ColorAction(Color.BLUE);
    		var redAction = new ColorAction(Color.RED);
    	//7.           	
    		yellowButton.addActionListener(yellowAction);
    		blueButton.addActionListener(blueAction);
    		redButton.addActionListener(redAction);
    	}
    	//5.        ,     actionPerformed  
    	private class ColorAction implements ActionListener
    	{
         
    		private Color backgroundColor;
    		
    		public ColorAction(Color c)
    		{
         
    			backgroundColor = c;
    		}
    		//      ActionEvent
    		public void actionPerformed(ActionEvent event)
    		{
         
    			buttonPanel.setBackground(backgroundColor);
    		}
    	}
    	
    	public static void main(String[] args)
    	{
         
    		EventQueue.invokeLater(()->
    		{
         
    			var buttonFrame = new ButtonFrame();
    			buttonFrame.setVisible(true);
    		});
    	}
    
    }
    

    주의:
  • JButton 의 한 대상, 즉 하나의 이벤트 소스 가 하나의 이벤트 모니터 에 추가 되 었 기 때문에 이벤트 소스 가 한 번 클릭 되면 Action Event 의 대상 을 만 듭 니 다 (즉, actionPerformed 방법 을 한 번 호출 합 니 다).
  • 하나의 이벤트 원본 에 여러 개의 모니터 를 추가 할 수 있 습 니 다. 그러면 이벤트 원본 이 한 번 클릭 되면 모든 actionPerformed 방법 이 호출 됩 니 다.
  • Over. Thanks for watching.

    좋은 웹페이지 즐겨찾기