Java : ActionListener를 사용하여 해당 클래스의 객체에서 다른 클래스에서 함수를 호출합니다.
-
20-09-2019 - |
문제
기본적으로 내가하고 싶은 것은 다른 클래스에서 실행되고 다른 객체에서 행동하는 메소드를 시작하는 시작 버튼을 가져 오는 것입니다.
청취자를위한 내 코드 :
button1a.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent event) {
// Figure out how to make this work
//sim.runCastleCrash();
}
} );
다른 클래스에 대한 내 코드 :
public static void main(String[] args) {
CastleCrash sim;
sim = new CastleCrash();
}
그리고
public void runCastleCrash() {
System.out.println("Castle Crash is beginning...");
//Other method parts here to be added
}
나는 이것이 너무 힘들 수 없다는 느낌을 얻지 만 조각이 빠져 있습니다.
해결책
익명 수업에서 물건을 참조하는 한 가지 방법은 final
예어:
public static void main(String[] args) {
final Object thingIWantToUse = "Hello";
JButton button = new JButton("Click");
button.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
System.out.println(thingIWantToUse);
}
});
JFrame frame = new JFrame();
frame.setLayout(new FlowLayout());
frame.add(button);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
또는 동봉 유형의 멤버 (변수 또는 방법)에 액세스 할 수 있습니다.
public class ActionListenerDemo2 {
private final JFrame frame = new JFrame();
private Object thingIWantToUse = "Hello";
public ActionListenerDemo2() {
JButton button = new JButton("Click");
button.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
thingIWantToUse = "Goodbye";
System.out.println(thingIWantToUse);
}
});
frame.setLayout(new FlowLayout());
frame.add(button);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new ActionListenerDemo2().frame.setVisible(true);
}
}
다른 팁
나는 당신과 같은 문제를 겪었고 이것이 내가 그것을 해결 한 방법입니다.
객체를 최종적으로 만들 수 있습니다 (Final CastleCrash SIM = New CastleCrash ();), 나는 그렇게하고 싶지 않았거나 다른 클래스에서 메소드를 실행하기 위해 세터 메소드와 같은 것을 만들 수 있습니다.
청취자 클래스에 대한 내 코드 :
button1a.addActionListener(new ActionListener()
{
public void actionPerformed (ActionEvent event)
{
//How to make this work ?
//Like this:
runCC();
}
});
public void runCC()
{
CastleCrash sim = new CastleCrash();
sim.runCastleCrash();
}
다른 클래스에 대한 내 코드 :
public void runCastleCrash()
{
System.out.println("Castle Crash is beginning...");
//Other method parts here to be added
}
이것이 도움이되기를 바랍니다. 행운을 빕니다! :)
McDowell은 이미 이벤트 청취자 (또는 일반적으로 익명의 내부 클래스)의 변수에 액세스하는 방법에 대한 좋은 예제로 실제로 답변합니다. 그러나 있습니다 스윙의 이벤트 청취자에 대한보다 일반적인 태양 자원 그것은 글을 쓸 때 고려해야 할 모든 경고에 대한 정식적이고 좋은 개요입니다.
어쨌든 ActionListener에서 호출 할 수있는 CastleCrash 객체에 대한 참조가 필요합니다.
당신은 아마도 JFrame을 서브 클래스 또는 JBUTTON을 포함하는 모든 것이 당신의 주요 방법과 CastleCrash 속성을 모두 가지고 있도록 익명의 내부 클래스 액션 리스트너에서 참조 할 수 있습니다.
그러나 조심하십시오. GUI 이벤트 스레드 (ACTION 리스너가 호출되는 곳) 내에서 장기적인 방법이 될 것을 부르는 것처럼 보입니다. 이것은 일반적으로 나쁜 생각입니다. GUI가 응답하지 않도록합니다.
보다 http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html 특히 그 문제를 피하는 방법에 대한 아이디어에 대한 스윙 워크 클래스의 비트.