상황 : Solitaire 게임 에서처럼 카드 더미를 그립니다. 멋지게 쌓인.LayoutManager를 사용하는 JLayeredPane
이것을 달성하려면 을 LayoutManager
인터페이스의 맞춤 구현과 함께 사용하고 있습니다. 커스텀 LayoutManager를 사용하는 이유는 스택의 방향이 다양하기 때문에 때로는 부분적으로 카드가 서로 완전히 가끔씩 부분적으로 가려지기 때문입니다.이 로직은 LayoutManager에있어 좋은 역할을하는 것처럼 보입니다. 카드.
따라서 LayoutManager
은 내 스택의 모든 구성 요소의 X 좌표 및 Y 좌표를 설정합니다. 반면에 JLayeredPane
은 레이어를 통해 Z- 좌표를 담당합니다. JLayeredPane
에 구성 요소를 추가
이렇게되면 : new Integer(j)
카드의 계층입니다
JLayeredPane pane = new JLayeredPane();
pane.setLayout(new StackLayout(...));
pane.add(new CardView(...), new Integer(j));
. JLayeredPane
계약으로 인해 Integer
이어야합니다.
여기서의 문제는 위에서 설명한 이유 때문에 내 StackLayout
에 Integer
이외의 다른 제약 조건 개체를 사용할 수 없다는 것입니다.
addLayoutComponent(Component comp, Object constraints);
및 전달 Object
여기에 항상 Integer
할 : LayoutManager
인터페이스는 다음과 같은 방법을 구현하는 방법이 필요합니다.
내 특정 상황에서 XY 좌표는 Z 좌표를 기반으로 계산할 수 있으므로 행운입니다. 예를 들어, 레이어 k
의 카드는 Y 좌표 k * offset
에 있어야합니다. 따라서 제 상황에서는 Integer
인 제약 객체가 문제가되지 않습니다.
Z 좌표와 XY 좌표 사이에 상관 관계가 없을 때 무엇을해야하는지 궁금합니다. 이 문제를 어떻게 풀 수 있습니까? 예를 들어 GridBagLayout
을 JLayeredPane
과 함께 사용하려면 어떻게해야합니까? 첫 번째 기기는 GridBagConstraints
이고 두 번째 기기는 Integer
개체가 필요합니까? 물론, GBL은 구성 요소가 겹치지 않는 방식으로 레이아웃을 작성하지만 아이디어 일뿐입니다.
기본 동작을 변경해야하므로 JLayeredPane 확장에 대해 생각해 보셨습니까? 이 방법으로, JLayeredPane super에 필요한 Integer와 GridBagLayout 또는 비슷한 것을 사용하는 GridBagConstraints를 조합 한 고유 한 Object 제 2 매개 변수를 허용하는 자체 add 메소드를 작성할 수 있습니다. –
@HovercraftFullOfEels 그것은 적절한 해결책이 될 것 같습니다. 'JLayeredPane'가 우선하는 protected void addImpl (Component comp, Object constraints, int index)를 오버라이드 (override) 할 필요가 있다고 생각합니다. 이것은, 층의 결정에 사용되는 Integer 오브젝트를 먼저 가로 채기 위해서 (때문에) 발생합니다. 다음에, 디폴트의'JLayeredPane'가 LayoutManager를 가지지 않기 때문에 궁극적으로 아무것도하지 않을 슈퍼 클래스 인 Container에 제약 조건을 전달합니다. 나는이 접근법에 대한 답을 쓸 것이다. – Timmos