2012-04-28 3 views
4

Qt에서 나온 QGraphicsItem 객체와 관련하여 항상 QGraphicsScene을 사용하여 flowcharts, game boards 등과 같은 것들을 그립니다. 그래픽 장면은 Swing 구성 요소의 Qt에 해당하는 위젯입니다. 이 QGraphicsItem 개체에는 자체 클릭 핸들러가 있으므로 그래픽 장면의 특정 부분에 대한 클릭이 올바른 그래픽 항목에 자동으로 위임됩니다.2D 그래픽에 대한 객체 지향 접근법 : 페인트 된 객체에 JPanel 클릭을 위임

자바 스윙에서이 워크 플로우를 복제하려고합니다. 지금까지 나는 모든 것을 수동으로 페인트하는 방법을 발견했습니다. 이는 또한 클릭 논리를 수동으로 프로그래밍해야한다는 것을 의미합니다. 그것은 JPanel를 서브 클래 싱 여기에 같이 paintComponent 기능을 오버라이드 (override) 포함 :

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D)g; 

    for (int row = 0; row < _numRows; ++row) { 
     for (int col = 0; col < _numCols; ++col) { 
      g2.drawRect(2 + _squareSize*col, 2 + _squareSize*row, _squareSize, _squareSize); 
     } 
    } 
} 

합니까 자바 스윙은 2D 그래픽을 그릴 수와 비슷한 객체 지향 방법이?

+0

나는 게임 API, 또는 .JOGL 또는 이와 유사한 기능을 사용하기 위해 비슷한 게임을 볼 수도 있다고 생각합니다. –

답변

3

은 일반적으로 거기를 달성하는 방법은 두 가지입니다 거점으로

  1. 를 사용하여 단일 JComponent의과 (의 paintComponent 방법에서) 바로 위에 모든 "항목"을 그립니다. 이 경우, JComponent에 마우스/키 리스너를 추가하고 클릭 한 위치/단축키에 따라 이벤트를 처리하여 모든 마우스/키 이벤트를 직접 처리해야합니다.

  2. 또 다른 방법은 기본으로 컨테이너 (또는 단순한 JPanel)를 사용하고 레이아웃을 사용하여 다른 구성 요소를 배치하는 것입니다 (예 : "null"레이아웃으로 컨테이너에 절대 좌표로 구성 요소를 범위). 이 경우 서로 다른 이벤트가 컨테이너 내부의 위치에 따라 해당 구성 요소에 직접 전달됩니다 (기본적으로 각 구성 요소에는 아무것도 없으면 모든 이벤트가 해당 구성 요소로 전달되는 사각형 경계가 있지만 " 히트 "영역을 원하는 모양으로 바꿉니다). 또한이 경우 사용자 정의 페인트 된 구성 요소를 하위 또는 표준 Swing 구성 요소 (예 : JButton, JCheckBox 등)로 사용할 수 있습니다. 1 때때로 유용 할 수 있지만 (일부 이미지 편집기, 페인트와 같은 응용 프로그램이나 그래픽 작동 다른 응용 프로그램을 만들 때, 예를 들어에 대한)

대부분의 경우 두번째 방법은 최고입니다.

3

Shape을 사용하십시오. 타원, 선, 다각형 등의 모양이 있습니다. 기존의 것을 사용하거나 Area 클래스를 사용하여 자신을 생성하고 Shapes을 결합 할 수 있습니다.

+0

내가 틀렸다고 정정하되 [documentation] (http://docs.oracle.com/javase/7/docs/api/java/awt/Shape.html)에 따르면 'Shape'에는 내가 연결할 수있는 모든 청취자. 그런 다음 클릭 한 시점을 어떻게 알 수 있습니까? – Pieter

+0

패널에 리스너를 추가하고 클릭 한 점이 셰이프에 포함되어 있는지 확인할 수 있습니다. – StanislavL

+0

그래서 패널에서 클릭 수를 모니터링하고 각 셰이프에서 교차 계산을 수행 한 다음 클릭을 올바른 모양으로 위임합니까? 그것은 약간의 번거 로움처럼 보입니다. 이 시스템의 또 다른 한계는 두 개의 부분적으로 겹치는 모양이있는 경우 작동하지 않는다는 것입니다. – Pieter

관련 문제