2014-06-06 6 views
1

저는 대학을위한 작은 Java 프로그램을 만들고 있습니다. 업데이트 후에 일부 그래픽을 다시 그리는 데 문제가 있습니다. 여기에는 컨텍스트가 있습니다 :다른 구성 요소의 다시 그리기

저는 그래픽 요소 (직사각형, 원 등)를 그리거나 그리는 데 사용되는 JComponent와 사용자에게 정렬 옵션을 제공하는 JMenu를 기본적으로 포함하는 메인 Jframe을 가지고 있습니다.

JComponent가 paintComponent를 대체하므로 요청시 Graphics를 그릴 수 있습니다. 그래픽은 그래픽 유형을 정의하는 메소드가있는 세관 클래스이며 각각은 자신의 drawRect() 또는 drawOval()을 호출합니다. 그것은 아주 잘 작동하고 있습니다. 주 JFrame에 대해 repaint()을 호출하면 예상대로 JComponent()의 paintComponent가 호출됩니다.

JMenu의 메뉴 중 하나에는 다른 순서에 따라 그래픽을 정렬하는 옵션이 있습니다. 따라서 각 옵션의 ActionListner에서 그래픽을 포함하는 일종의 LinkedList를 진행합니다.

문제는 내가 ActionListener에서 정렬 작업을 수행 할 때 repaint()를 호출하여 JComponent에서 Graphics를 그리지 만 대신 JMenu의 repaint()를 호출합니다. 어떤 식 으로든 JMenu에서 JComponent의 다시 칠하기를 호출 할 수 있습니까?

감사합니다.

답변

1

열쇠는 호출 코드가 호출 된 코드의 표시된 객체에 대한 깨끗한 참조를 갖는지 확인하는 것입니다. 즉, 메뉴의 리스너 코드에는, 통상, 청취자의 클래스의 필드에 배치되는 드로잉 JComponent 에의 참조가 필요합니다. 전달 방법은 프로그램의 구조에 따라 다릅니다. 이것은 생성자 매개 변수를 통해 수행되거나, 종속성 삽입을 통해 클리너가되고 싶다면 수행 할 수 있습니다.

+0

이제 분명히 언급 할 것입니다. Thanks = D 전체 JComponent를 생성자 또는 JMenu의 메서드로 전달하지 않고도이 작업을 수행 할 수 있습니까? – JulioQc

+0

@JulioQc : 어떻게 든 JComponent의 상태를 변경할 메소드가있는 객체를 전달해야합니다. –

2

JMenu의 메뉴 중 하나에는 다른 순서로 그래픽을 정렬하는 옵션이 있습니다. 따라서 각 옵션의 ActionListner에서 그래픽을 포함하는 일종의 LinkedList를 진행합니다.

그런 다음 해당 코드는 구성 요소에서 repaint()을 호출해야합니다. LinkList는 그래픽을 그리는 구성 요소의 일부 여야합니다. 따라서 구성 요소에서 호출하는 sort(...)과 같은 메서드를 사용할 수 있습니다. 그런 다음 메서드는 정렬을 수행 한 다음 구성 요소를 다시 칠합니다().

setText(...), setBackground(...)과 같이 모든 스윙 방법이 작동하는 방식입니다. 구성 요소에서이 메소드를 호출하면 구성 요소가 자체적으로 repaint()을 호출합니다.

관련 문제