2011-03-20 4 views
2

안녕 모두,마우스 수신기를 발사 한 항목을 알려주는 방법

나는 별표 등급의 간단한 구성 요소를 쓰려고합니다. 나는 Java 언어에 대해 상당히 익숙하지 않으며, Java에서 수행 할 수있는 작업을 수행 할 수 있는지 확실하지 않습니다. JLabel 배열 안에 JLabel을 추가 할 수 있습니까? 배열의 각 JLabel에는 마우스 이벤트 리스너가 있습니다. 이제 마우스 이벤트가 Label [3]에서 발생하면 인덱스 값을 얻을 수 있도록 설정할 수 있습니까? 여기

내가 내 패널

public Rating(Integer max,int size) { 

JLabel position = new JLabel[max]; 


    this.setLayout(new FlowLayout()); 
    for(int i=0; i != max;i++){ 
    position[i]=new JLabel(icons.getIcon("star-empty", size)); 
    position[i].setOpaque(true); 
    position[i].addMouseListener(this); 
    add(position[i]); 
    } 
} 


@Override 
public void mouseEntered(MouseEvent e) { 
    JLabel a= (JLabel) e.getComponent(); 
    //****Have some code in here to tell me where in the position array the event came from????*** 
    int index = ????? 
    } 

생각을 구축하는 방법입니다/아이디어/제안하십시오.

참고 단추를 사용하는 것으로 생각했지만 지저분 해 보였으므로 ImageIcon을 사용하여 방법을 찾고 싶습니다.

THanks.

답변

3

:

position[i].addMouseListener(this); 

...나중에 그것을 발견 할 수 인덱스 번호를 받아, 수있는 특별한 리스너 클래스를 만들 수 있습니다

position[i].addMouseListener(new RatingMouseListener(i)); 

각 레이블이 다른 인덱스 값에 리스너의 별도의 인스턴스를해야합니다. 내부 클래스의 코드는 다음과 같습니다.

private class RatingMouseListener extends MouseAdapter { 
    private final int index; 

    public RatingMouseListener(int index) { 
     this.index = index; 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     System.out.println("Mouse entered for rating " + index); 
    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     System.out.println("Mouse exited for rating " + index); 
    } 
} 

그런 다음 MouseAdapter의 모든 메서드를 재정의합니다.

다른 사람들처럼 액션 이벤트를 더 잘 지원하기 때문에 대신 JButton을 사용해야 할 수도 있습니다. 여전히 아이콘을 줄 수 있습니다.

0

JButton이 원하는대로 보일 수 있습니다. 그들은 ImageIcon을 가질 수 있으며 단추처럼 보이지 않아도됩니다.

1

나는 보통 그것을 할 방법은 다음과 같습니다

int i; 
for (i = 0; i <max; i++) 
    if (position[i] == e.getcomponent()) 
    break; 

지금 position[i] 당신이 찾고있는 레이블입니다.

2

setName 메소드를 사용하여 인덱스에 따라 각 JLabel의 이름을 지정한 다음 MouseEvent의 getComponent 메소드를 사용하여 원래 JLabel을 다시 얻고 getName을 사용하면 인덱스가 있습니다. 그것은 한 가지 방법 일 것이지만 이지만은 두 위치 (암시 적으로 배열에 배치되고 레이블의 이름으로 명시 적으로)에 인덱스 정보를 저장하는 작업이 포함되므로 불일치가 발생하기 쉽습니다.

getComponent에서 얻은 JLabel 참조를 배열을 통해 검색 할 수도 있지만 특히 큰 배열의 경우에는 그렇게 좋지 않습니다.

0

색인이 중요한 이유는 무엇입니까? 구성 요소를 가져 오는 방법을 알고 있으므로 배열을 반복하여 인덱스를 가져옵니다.

참고 단추를 사용하는 것이 좋겠지 만보기가 더러워지며 ImageIcon으로 길을 찾고 싶습니다.

버튼을 사용하면 색인을 결정하는 문제가 어떻게 해결됩니까? 그러나 단추를 사용하는 것이 레이블보다 낫다는 것에 동의하고 MouseListener 대신 ActionListener를 사용하는 것이 좋습니다. 당신은 사용하여 라벨과 같은 버튼 모양을 만들 수 있습니다

button.setBorderPainted(false); 

을 이제 버튼의 인덱스 값을 저장하기 위해 setActionCommand (...) 메소드를 사용하는 ActionListener를 사용하는 경우. 그런 다음 getActionCommand (...) 메소드를 사용합니다. 대신 당신이했던 것처럼 각 레이블에 대해 동일한 수신기를 사용하는

+0

인덱스가 중요한 이유는 클릭 한 번보다 작거나 같은 인덱스를 "true"로 설정해야하기 때문에 채워진 시작 부분을 페인트하고 다른 용도로 사용할 수 있습니다. – user597608

+0

그래서 버튼 배열을 반복하면서 클릭 한 버튼까지 모든 버튼의 아이콘을 설정합니다. 어쨌든 당신은 이것을하는 방법에 대한 해답을 얻었습니다. – camickr

관련 문제