2014-05-18 3 views
2
JButton lunarButton = new JButton(new ImageIcon("assets/Buttons/moon.png")); 
    lunarButton.setActionCommand("switch"); 
    c.gridwidth=1; 
    c.gridy = 0; 
    searchArea.add(lunarButton, c); 

.클릭하면 JButton에서 이미지를 어떻게 변경합니까?

public void actionPerformed(ActionEvent ev) 
{ 
    int count = 1; 
    String action = ev.getActionCommand(); 

    if("switch".equals(action)) 
    {   
     ImageIcon sun = new ImageIcon("assets/sun.png"); 
     ImageIcon moon = new ImageIcon("assets/moon.png"); 

     changeLunar(); 
     count++; 
     if (count % 2 == 0) 
     { 
      lunarButton.setIcon(sun); 
     } 
     else 
     { 
      lunarButton.setIcon(moon); 
     } 

나는이 코드를 구현하지만, 일식 그렇지 내 초기화() 메소드에 lunarButton 변수를 볼 수있다 "lunarButton가 해결 될 수 없다"나를 알 수 있나요? 나는 무엇을 여기에서 놓치고 있냐?

+0

클래스의 인스턴스 변수로'lunarButton'을 가지고 있습니까? – APerson

답변

3

lunarButton은 아마도 init 메소드에서 로컬로 선언 될 수 있습니다.

하나의 해결책 : 초기화 메소드가 아닌 클래스의 인스턴스 필드로 선언하십시오.

해결 방법 2 : 변수에 대해 걱정하지 마십시오. ActionEvent 매개 변수의 getSource() 메서드에서 JButton 객체을 가져옵니다. JButton에 반환 된 객체를 캐스팅하고 원하는 메서드를 호출합니다. 예를 들어

:

if("switch".equals(action)) 
{   
    // ImageIcon sun = new ImageIcon("assets/sun.png"); 
    // ImageIcon moon = new ImageIcon("assets/moon.png"); 

    JButton btn = (JButton) ae.getSource(); 

    changeLunar(); 
    count++; 
    if (count % 2 == 0) 
    { 
     btn.setIcon(sun); 
    } 
    else 
    { 
     btn.setIcon(moon); 
    } 

여담으로 : 당신이 정말로 디스크에서 버튼을 누르면마다 이미지를 다시로드하지 않습니다. 대신 의 이미지를 생성자에서 읽고 ImageIcon 필드에 채우고 필요한 경우 해당 필드를 사용하십시오.

+0

당신이 말했던 것처럼 그것을 인스턴스 필드로 만들었고, 감사했습니다. 나는 당신의 다른 방법들을 마음 속에 간직 할 것입니다.). 내가 확인할 수있을 때 확인해 보겠습니다. –

+0

@ user3427042 : ImageIcon에 관한 편집을 참조하십시오. –

+0

할 것이다, 나는 건설자, 좋은 생각에 넣을 게요. –

관련 문제