2014-10-10 3 views
0

저는 막판 자바 GUI 작업을 맡은 C 프로그래머입니다. GUI 또는 Java 사용자가 아니기 때문에 두 객체를 만들었습니다.actionlistener 내부에서 변수를 하나 밖에 할당하는 방법

1은 두 번째 객체의 결과가 할당되기를 기대하는 텍스트 상자입니다. 2는 콤보 상자입니다. 사용자가 콤보 상자에서 선택할 때, 그 값을 첫 번째 개체 (텍스트 필드)에 채우고 싶습니다.

class Foo { 
    // declared instance variable 
    private String theValue; 

    // created textField, and JComboBox thingies 

    listBox.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      // this line produces the reported error 
      //textField.setText((String)(((JComboBox)e.getSource()).getSelectedItem())); 

     // this line works, but then get below error when try to assign theValue outside method 
      theValue = ((JComboBox)e.getSource()).getSelectedItem(); 
     }      
    }); 
... 
textField.setValue(theValue); // errors out 

과 (분명히 잘 자바 오류를 알고) 다음을 얻을 : 여기 내의 actionListener()는 다른 방법

에 정의 내부 클래스 내부가 아닌 최종 변수 텍스트 필드를 참조 할 수 없습니다 주석 처리 된 행은 동일한 결과를 산출했습니다. theValue를 텍스트 필드의 값으로 할당 할 수 있기를 바랬지 만 범위 문제가 있으므로 리스너 내에서 분명히 선언 할 수는 없습니다.

모든 지원

이 크게

+0

설명을 위해 : actionPerformed() 메서드 내에서 theValue에 대한 지정을해도 오류가 발생하지 않습니다. 그러나 나중에 나중에 theValue를 리스너 외부의 다른 변수에 할당하려고하면보고 된 오류가 발생합니다. – frododot

+0

감사합니다 MadProgrammer! 문제 해결됨...! – frododot

답변

1

중 하나 JTextFieldfinal를 만들거나 클래스 내의 인스턴스 필드하게 :-) 감사합니다. 당신은 당신 다른 변수에 대해이 작업을 수행 할 수

final JTextField textField = ... 

또는

public class ... { 

    private JTextField textField; 

    public ...() { = new JTextField(...); 

. 일반적으로 다른 이유가없는 한 인스턴스 필드를 사용하는 것이 좋습니다. 좀 더 자세한 내용은 Understanding Class Members 좀 봐 ...

인스턴스 필드는 C에서 "개인"변수와 같다고 생각할 수 있습니다. C 파일 자체 내에서 선언 된 인스턴스 변수는 외부 파일에서 참조 할 수 없습니다

은 GUI의, 첫째

업데이트 (나는 그래서 완전히 정확하지 않을 수 있습니다 C를 한 적이 있기 때문에 죄송 아주 긴 시간)에 이벤트 기반의 경향 선언, 즉, 그들은에서 작동하지 않습니다 선형/절차 적 방식. 당신은 일련의 콜백을 설정하고 그들을 콜 될 무언가를 기다립니다. 콜백이 발생하면, 당신은 할당 아래 나머지 코드를 즉시 실행할 것을 의미하고 ActionListener을하기 전에, 예에서

import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JTextField textField; 
     private JComboBox comboBox; 
     private String theValue; 

     public TestPane() { 
      textField = new JTextField(10); 
      comboBox = new JComboBox(new String[]{"Banana", "Apple", "Grapes", "Strawberries"}); 
      comboBox.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        theValue = (String)comboBox.getSelectedItem(); 
        textField.setText(theValue); 
       } 
      }); 
      comboBox.setSelectedItem(null); 

      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      add(textField, gbc); 
      add(comboBox, gbc); 
     } 

    } 

} 

에서, JComboBox에 할당 된 ActionListener 즉시 호출되지 않습니다 ... 적절한 조치를 취할 부름을받을 기회가있다.

함수 포인터 또는 콜백처럼 생각하십시오. ... 당신은 다른 함수에 전달할 수 있지만, 당신은 그것을 호출 할 수있는 경우에 모르는

JComboBox 변경 및 트리거와 액션 이벤트의 상태는 ActionListeneractionPeformed 메소드가 호출

, 한 번에 현재 값을 가져 와서 텍스트 필드에 적용하여 변수에 할당 할 수 있습니다. 아니면 무엇을해야합니까?

ActionListener 및 첨부 된 을 첨부 했으므로 실제로 ActionListener에 알림이 전송됩니다 ...까다로운;)

+0

최종 변수를 사용하는 방법이 명확하지 않습니다. 현재 클래스에서 private로 선언 된 theValue가 청취자 외부에 있습니다. 내가 그것을 지정할 가치가 없기 때문에 최종으로 선언 할 수는 없다 (최종 결정이 필요함). JTextField를 만드는 것에 대해 언급 한 다른 솔루션을 시도했는데, JTextField는 리스너 외부에서 다시 선언 된 것으로서보고 된 오류가 발생했습니다. 더 자세한 내용이 필요합니다 :-) – frododot

+0

코드가 주석에 맞지 않습니다. 질문을 업데이트하는 것이 더 좋습니다;) – MadProgrammer

+0

두 번째 예제와 같은 인스턴스 필드로 만들려고 했습니까? 방법을 사용하여 코드를 수정하지 않았는지 확인하십시오. – MadProgrammer

관련 문제