2012-02-13 4 views
4

ScrollBar을 추가하려고합니다. ScrollBar은 표시된 문서를 반복합니다. 그러나 스크롤 막대가 바뀌면 이벤트를받는 데 문제가 있습니다. 나는 내가 무엇을 들어야하는지 잘 모르겠다. 나는 어떤 사건에 대응해야하는지 잘 모르겠다. 나는 다음과 같은 시도를하고 몇 가지 사건이 발생하지만, 나는 이것이 이상적인 사건이라고 생각하지 않는다.scala에서 ScrollBar 이벤트 스윙 처리

listenTo(scrollBar) 
    listenTo(scrollBar.keys) 
    listenTo(scrollBar.mouse.moves) 
    listenTo(scrollBar.mouse.wheel) 
    listenTo(scrollBar.mouse.clicks) 

내가 스크롤 내부를 클릭 할 때 예를 들어, 난 단지 MouseClicked, MousePressedMouseReleased를 얻을 - 실제로 값을 변경하려면 화살표를 클릭하지 않는 경우.

이벤트가 제대로 수신되지 않는 스크롤 막대에 대해 this discussion이 발견되었지만 2 살입니다. 제가 말할 수있는 한, 저자는 파일을 따라가는 것이 아닙니다. 어쩌면 그는 해결 방법을 찾았을 것입니다.

아이디어가 있으십니까?

+0

전체 코드를 업로드 할 수 있습니까? 최상위 컨테이너 인 창에 스크롤 막대를 추가 할 수 없습니다. – unknown

+0

스크롤 막대를 컨테이너에 추가합니다. – schmmd

답변

1

좋은 질문입니다. 화살표를 클릭하면 ScrollBar이 처리되지 않고 ScrollBarUI이 처리합니다. 기본 구현 (또는 ScrollBarUI 구현의 대다수 기본 클래스)이 BasicScrollBarUI이라고 생각합니다.

javax.swing.plaf.basic.BasicScrollBarUI의 출처를 살펴 보려면 incrButtondecrButton 버튼이 있으며 듣고 싶은 구성 요소입니다.

P. 내 Slider에 대한 사용자 지정 (키) 수신기가 있고 비슷한 구성 요소/모델을 노출하는 사용자 지정 UI가있는 비슷한 요구 사항 (거의 모든 구성 요소가 보호되어 있으므로 쉽게 하위 클래스에서 액세스하고 공용 getters를 통해 노출 할 수 있음)가 훌륭하게 작동했습니다. 나를 위해. 나는 평범한 자바에서 그런 일을했다. 아마도 스칼라에서는 속성 이름을 지정하여 버튼을들을 수있다.

0

스칼라 스윙이 한 개 더 부러집니다. Adjustable 특성은 완전히 텅 비어 보이며 아무것도 유선이 아닙니다.

다음 작품 :

class ScrollBarAlive extends swing.ScrollBar { 
    me => 
    peer.addAdjustmentListener(new java.awt.event.AdjustmentListener { 
    def adjustmentValueChanged(e: java.awt.event.AdjustmentEvent) { 
     publish(new swing.event.ValueChanged(me)) 
    } 
    }) 
} 

시험 : 적절한 구현도 AdjustingEvent의 하위 유형을 소개 할

import swing._ 

object ScrollBarTest extends SimpleSwingApplication { 
    lazy val top = new Frame { 
    val label = new Label { text = "0" } 
    val scroll = new ScrollBarAlive { 
     orientation = Orientation.Horizontal 
     listenTo(this) 
     reactions += { 
     case event.ValueChanged(_) => 
      label.text = value.toString + (if (valueIsAjusting) " A" else "") 
     } 
    } 
    contents = new BorderPanel { 
     add(label, BorderPanel.Position.North) 
     add(scroll, BorderPanel.Position.South) 
    } 
    pack().centerOnScreen() 
    open() 
    } 
} 

.