2010-02-02 7 views
4

두 개 이상의 JButton을 공유 상태로 만들려고합니다. 즉, 마우스 버튼을 JButton 위에 놓았을 때 둘 다 우울하게 표시됩니다 ("무장"으로 표시됨). 또는 체크 상자 인 경우 체크/체크되지 않은 동시에 등 사용자에게JButton 간의 상태 공유

,이 나타나야 두 버튼이 계층 구조에서 둘 이상의 위치에서 나타나는의 같은 버튼 것처럼 (이 허용하지 않는 현실 스윙에.)

하나의 ButtonModel을 만들고 두 모델에 같은 모델을 지정하면 반쯤 얻을 수 있습니다.

그러나 이 아니고 눈에 띄는 효과는 버튼간에 공유됩니다. 하나의 버튼을 클릭하면 해당 버튼에 포커스가 부여됩니다 (버튼 내에서 사각형으로 표시됨).) 다른 단추에서 제거합니다. 단추 중 하나에 포커스가있을 때 포커스가있는 것처럼 두 단추를 렌더링하고 싶습니다.

깨끗한 방법이 있습니까?

이상적으로 나는 선택한 룩앤필과는 독립적으로하고 싶습니다.

편집 :ButtonModel을 공유하는 데 또 다른 문제점이 있음을 발견했습니다. 단추 중 하나에 포커스가 없으면 모델의 armedpressed 속성이 false으로 설정됩니다. 이것은 이후 처리 후 mousePressed이 발생하므로 첫 번째 버튼에 포커스가있을 때 두 번째 버튼을 누르면 두 번째 버튼을 누를 때까지 눌린 상태로 들어 가지 않습니다.

답변

3

2 개의 버튼에 대해 동일한 ButtonModel을 사용하여 정말 잘 움직였습니다.

이제 초점 문제에 대해. 대답은 아니요. L&F 불가지론적인 방법이 없습니다. BasicButtonUI (또는 사용중인 ButtonUI)을 무시하고 포커스 드로잉 논리를 무시해야합니다.

+0

당신이 옳다고 생각하고 ButtonUI를 확장해야하지만 기본 UI에 위임 할 수 있습니다. 그것은 제가 지금 사용하고있는 기술의 일부입니다. – finnw

+0

이 L & F는 무엇입니까? 나는 다른 지위에서 그것을 봤다. –

+1

@ davidblaine L & F = 모양과 느낌 –

1

나는 텍스트, 청취자 등을 이미 분류했다고 가정합니다.

BasicButtonUI의 paint 메소드를 사용하면 특정 페인팅을하기 전에 버튼에 포커스가 있는지 여부를 실제로 확인합니다. 그래서 두 개의 초점을 맞춘 컴포넌트를 동시에 가질 수 없다면, 내가 생각할 수있는 유일한 방법은 다른 버튼의 UI를 사용하여 페인트하는 것입니다.

두 버튼 모두 FocusButton이어야하며 서로 setButton을 호출해야합니다. 나는 다른 것들 사이에 null 검사를 추가하기 위해 귀찮게하지 않았습니다.

public class FocusButton extends JButton { 
    private JButton btn; 

    public FocusButton() { 
     addFocusListener(new FocusListener() { 
      public void focusGained(FocusEvent e) { 
       // Other button seems to repaint when focus is gained anyway 
      } 

      public void focusLost(FocusEvent e) { 
       btn.repaint(); 
      } 
     }); 
    } 

    public void setButton(JButton btn) { 
     this.btn = btn; 
    } 

    public void paint(Graphics g) { 
     if (!btn.hasFocus()) { 
      super.paint(g); 
     } else { 
      btn.paint(g); 
     } 
    } 
} 

편집 :이 당신의 버튼 크기가 동일하지 않은 경우 너무 잘 작동하지 않습니다, 분명히 그들은 다른 텍스트를 가정하는 경우 전혀 작동하지 않습니다.

+0

3 가지 이상의 버튼으로 확장 할 수 있다면 가장 좋은 해결책이 될 수 있습니다. – finnw

+0

하나의 단추 목록 대신 단추 목록을 저장할 수 있습니다. 목록에서 초점을 맞추는 방법을 사용하도록 페인트를 변경하고 초점이 모두 사라진 경우 다시 칠할 수 있습니다. – lins314159

3

는 여기에 내가했던 일이야 :

  • 새로운 클래스와 SharedFocusButton
  • SharedFocusButton 무시 hasFocus, getModelpaintBorderJButton을 확장합니다.
  • JButton.paintBorder(Graphics) 또는 ButtonUI.update(Component, Graphics)이 실행중인 경우 그룹의 단추에 포커스가있는 경우 true을 반환하도록 hasFocus의 동작을 일시적으로 변경하십시오. 또한 일시적으로 프록시 ButtonModel을 반환 getModel의 동작을 변경 기본 같은
  • 프록시 ButtonModel 동작합니다 (다른 시간에 그것을 공유 ButtonModel을 반환),가에 armed 또는 pressed 속성 '값을 변경하는 것을 거부하는 것을 제외하고 ButtonModel 공유 focusLost 이벤트를 처리하는 동안 false. (. 각 버튼은 자신의 UI 처리 포커스 이벤트가 있기 때문에이 자동으로 수행되지 않습니다) 자신을 다시 그리기 위해 그룹의 모든 버튼을 강요 손잡이 focusGainedfocusLost
  • ,

남은 문제 :
초점 Tab 키가 같은 그룹의 한 단추에서 다른 단추로 포커스를 절대로 옮기지 않도록 탐색을 수정해야합니다.

+0

동일한 크기 (사용자가 창 크기를 조정할 경우 제어하기가 어렵습니다)의 단추와 모양에 제한되지 않기 때문에 솔루션이 내 것보다 잘 작동한다고 생각합니다. – lins314159