2017-05-06 22 views
-1

은 내가 모두가 addMouseListener 필요하지만이 작업이 addMouseListener에서 나는 다음과 같이 해당 배열의 인덱스의 사용을 만들 필요가 JPanel의의의 8x8 배열을 체스 프로그램을 만들려고 노력하고 있어요 :각 단일 요소에 JPanels를 추가하지 않고 addMouseListener를 JPanels 배열의 요소에 사용하는 방법.

panels[0][0].addMouseListener(new MouseAdapter() { 

     public void mousePressed(MouseEvent e) { 
      panels[0][0].setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED)); 
     } 

     public void mouseReleased(MouseEvent e) { 

     } 
    }); 

저는 64 개의 JPanels를 가지고 있기 때문에 63 번 복사해야하며 가능한 변경 사항도 복사해야합니다. 이 목표를 달성하기위한보다 효과적인 방법이 있습니까?

+1

1) * "이후 나는 64 개의 JPanels를 가진다. * 패널 대신에 JButton 컴포넌트를 사용하고,''MouseListener'' 대신에'ActionListener'를 사용하고, 각 버튼에 리스너를 추가하는 팩토리 메소드를 사용한다. .2) [강력하고 크기 조정이 가능한 스윙 체스 GUI 만들기] (http://stackoverflow.com/q/21142686/418556)를 참조하십시오. –

답변

2

당신은 이것에 대한 루프를 사용한다 :

for (int r = 0; r < panels.length; ++r) { 
    for (int c = 0; c < panels[r].length; ++c) { 
     // Do this to fix the "must be final" error: 
     final int row = r; 
     final int col = c; 
     panels[row][col].addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       panels[row][col].setBorder(.....); 
      } 
      // ..... more 
     }); 
    } 
} 

그러나, 이것에 대해 갈 수있는 몇 가지 다른 추가 방법이 있습니다.

class MyMouseListener extends MouseAdapter { 
    int panelRow; 
    int panelCol; 

    MyMouseListener(int panelRow, int panelCol) { 
     this.panelRow = panelRow; 
     this.panelCol = panelCol; 
    } 
    //..... 
} 

를 익명 클래스를 사용하는 예는 뒤에서 무엇을 기본적으로 그 : 하나는 패널의 위치를 ​​저장하는 class를 작성할 수 있다는 것입니다. 패널 자체에 대한 참조를 저장할 수도 있습니다.

또는 당신이 MouseEventgetSource() 방법을 사용할 수 있습니다 :이 경우

@Override 
public void mousePressed(MouseEvent e) { 
    JPanel panelWhichWasClicked = (JPanel) e.getSource(); 
    // ..... 
} 

, 당신은 당신이 모든 패널에 추가 할 수있는 1 개 마우스 수신기가 필요합니다.

+0

첫 번째 동작하지 않으며 그것을 시도했기 때문에 나는 알고있다. 내가 얻는 오류는'row'와'col' 변수가 final 일 필요가 있다는 것입니다. – tomishomo

+0

수정 방법은 편집을 참조하십시오. 그건 내 부분에 대한 감시 일 뿐이야. 그들은 Java 8에서 작동하는 방식을 변경했으며 어떤 이유로 든 필요 없다고 생각했습니다. – Radiodef

3

나는 방금 할 당신의 루프 코드에서

MouseListener ml = new MouseAdapter() 
{ 
    @Override 
    public void mousePressed(MouseEvent e) 
    { 
     JPanel panel = (JPanel)e.getSource(); 
     panel.setBorder(...); 
    } 
}; 

그리고 일반적인 수신기를 쓸 수있는이 63 배

을 복사해야 즉, 64 JPanel의를 가지고 있기 때문에 :

panels[?][?].addMouseListener(ml); 

코드를 재사용 할 수 있도록 항상 일반 수신기를 작성해야합니다.

+0

이 코드는 멋지지만 코드의 인덱스가 필요하기 때문에 여전히 작동하지 않을 것이라고 생각합니다. 두 개의 정수를 취하는 mousePressed() 메서드 내에서 메서드를 호출합니다.이 메서드는 해당 JPanel의 인덱스 인 행과 열을 사용합니다. 이 문제를 어떻게 해결할 수 있습니까? – tomishomo

+0

이제는 panelPart 요소가 (JPanel) e.getSource()와 같은지 찾고 row 및 col 정수를 전달할 때 mousePressed() 메서드 내에서 for 루프를 수행합니다. 그것은 작동하고있는 것처럼 보이지만 이것이 올바른지 아닌지 강조 할 수 있는지 궁금합니다. – tomishomo

+1

@borisverwoerd,'멋져 보이네요. '- 왜 그렇게 해보지 않으시겠습니까 ??? 왜 행/열이 필요하다고 생각하니? – camickr

0

배열을 가지고있을 때는 다른 접근 방식을 취해야합니다.

먼저 5 개 추상 메소드를 가지고 있지만 당신이의 mouseClicked 아마 관심이 MouseListener를 구현해야합니다 클래스 : 클래스 내부 어딘가에 그런

public class Example implements MouseListener{ 

@Override 
public void mouseClicked(MouseEvent e) { 
    JPanel panel = (JPanel) e.getSource(); // finding which panel is clicked on 
} 

@Override 
public void mousePressed(MouseEvent e) {} 
@Override 
public void mouseReleased(MouseEvent e) {} 
@Override 
public void mouseEntered(MouseEvent e) {} 
@Override 
public void mouseExited(MouseEvent e) {} 
} 

당신은 할 것 :

for(int i = 0; i < panels.length; i++){ 
    for(int j = 0; j < panels[0].length; j++){ 
     panels[0][0].addMouseListener(this); 
    } 
}