2012-03-22 3 views
1

나는 자바가 새로운 나라 다.자바의 여러 버튼 좌표

나는 광산을 만들고 있습니다. paramteres (x_length, y_length)와 함께 GridLayout을 사용하고 있습니다. 나는 어떤 버튼을 눌렀는지 알고 싶다 -> 그의 좌표 (x, y). 하지만 리스너에 입력하면 오류가 발생합니다. - 'x'의 수정자를 final로 변경합니다. 그래서 어떻게하면 단추의 좌표를 쉽게 얻을 수 있습니까?

그리고 단추의 크기를 어떻게 간단히 변경할 수 있습니까? setSize가 작동하지 않습니다.

+0

1)을 넣고 잘 사용된다. 2) 질의마다 하나의 질문을하는 것이 가장 좋습니다. 3) 레이아웃 관리자는 일반적으로 크기를 초과하는 구성 요소의 기본 크기를 존중합니다. 4) 오류 메시지 및 예외 출력을 복사/붙여 넣기하고 코드 형식을 사용하십시오. 5) ActionListener가이 GUI의 버튼에 더 잘 맞을 수 있습니다. 그것은 무엇을합니까? –

+0

x와 y가 루프에서 계속 변하기 때문에 '최종'을 만들 수 없습니다. 당신이 할 수있는 일 (하지만 못생긴 해킹인데, 그걸 내가 답으로 쓰지 않는 이유입니다)은 중첩 된 루프 안에 선언되어 있습니다 :'final int x2 = x; final int y2 = y' 그리고 리스너 안에서'x2'와'y2'를 참조하십시오. Andrew가 방금 말했듯이,'ActionListener'는 더 적절하고 크기 대신 preferredSize를 설정합니다. –

답변

2

매개 변수 (x 및 y)가 필요하므로 익명 사용자 대신 사용자 지정 클래스를 먼저 만들어야합니다.

private static class ButtonMouseListener extends MouseAdapter { 
    private final int x; 
    private final int y; 

    public ButtonMouseListener(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    public void mouseClicked(MouseEvent e) { 
     if (e.getButton() == MouseEvent.BUTTON1) { 
      JOptionPane.showMessageDialog(null, "Left -> " + x + " | " + y); 
     } else if (e.getButton() == MouseEvent.BUTTON3) { 
      JOptionPane.showMessageDialog(null, "Right -> " + x + " | " + y); 
     } 
    } 
} 

그런 다음 다음과 같은 코드를 사용할 수 있습니다

모두의
for (int y = 0; y < y_length; y++) { 
    for (int x = 0; x < x_length; x++) {    
     buttons[x][y] = new JButton("X"); 
     buttons[x][y].addMouseListener(new ButtonMouseListener(x, y)); 
     mines_array.add(buttons[x][y]); 
    } 
} 

이 재미 있습니다. 버튼 크기와 관련하여 부모 컨테이너에서 레이아웃을 사용하는 경우 해당 레이아웃의 크기는 자동으로 계산되며 setSize()를 사용하여 변경할 수 없습니다. 광산