2013-04-30 14 views
0

나는 이것을 일찍 게시했지만, stackoverflow 표준과 동등하지 않았다. 코드를 정리하고 내 질문에 대해 좀 더 자세히 설명 했으니 여기에 간다.중첩 클래스의 내부 클래스 내부에서 객체를 만들고 사용하는 방법은 무엇입니까?

CS1 프로젝트의 애플릿에서 두 개의 소행성 게임을 만들고있다. 특정 시간에 호출 할 수있는 메서드를 사용하여 사운드 효과를 구현하는 방법을 파악하려고합니다. 이 튜토리얼 (http://www.dreamincode.net/forums/topic/14083-incredibly-easy-way-to-play-sounds/)을 사용하여이를 발견했지만 중첩 루프 구문에 약간의 문제가 있습니다.

다른 클래스 (예 : AsteroidsGame.java)의 Sound 클래스에 'Sound'개체를 어떻게 구성합니까?

자습서 코드가 복잡하기 때문에 여기서는 가독성을 높이기 위해 제 작업을 진행합니다.

//Import Statements 
import java.applet.*; 
import javax.swing.*; 
import java.io.*; 
import java.net.*; 

public class Audioapp extends JApplet 
{ 
public class Sound // Holds one audio file 
{ 
    private AudioClip song; // Sound player 
    private URL songPath; // Sound path 

    Sound(String filename) 
    { 
     try 
     { 
      songPath = new URL(getCodeBase(),filename); // Get the Sound URL 
      song = Applet.newAudioClip(songPath); // Load the Sound 
     } 
     catch(Exception e){} // Satisfy the catch 
    } 

    //Loops audio file 
    public void playSound() 
    { 
    song.loop(); 
    } 


    //Stops audio file 
    public void stopSound() 
    { 
    song.stop(); 
    } 


    //Plays audio file once 
    public void playSoundOnce() 
    { 
    song.play(); 
    } 

} //Closes Sound() 


    public void init() 
    { 
    Sound testsong = new Sound("song.mid"); 
    testsong.playSound(); 
    } 

} //Closes Audioapp() 

편집 1 : 마지막 스레드에서 그냥 기억 누군가가 내가 그것을 실행/컴파일 할 때이 무엇을 게시 제안했다. 이 .java는 자체적으로 아무것도하지 않습니다. 하지만 그것은 내 프로젝트의 나머지 부분과 함께 배치 될 때 실제로 오류없이 컴파일됩니다.

편집 2 : Zim-Zam에게 많은 도움을 주셔서 감사합니다. 누군가이 스레드를 찾고 동일한 문제가있는 경우 그의 의견을 참고하십시오.

+1

'캐치 (예외 전자)의 인스턴스 내부 클래스는 정적이 아닌 경우에, 당신이 사용하는 것이 Audioapp.Sound sound = audioApp.new Sound()Audioapp.Sound sound = new Audioapp.Sound()

는 {}'좋은 방법이 아닙니다. –

+0

* "CS1 프로젝트 애플릿"* [CS 교사가 애플릿 교시를 중단해야하는 이유는 무엇입니까?] (http://programmers.stackexchange.com/questions/196499/why-should-cs-teachers-stop-teaching-applets)를 참조하십시오.) –

+1

* "마지막 스레드의 누군가 .."* 그 문제에 대해서는 나중에 질문을 편집하여 삭제하고 새 메시지를 시작하십시오. 조언을 제공하는 사람들은 일반적으로 스스로를 반복해야하는 것을 좋아하지 않습니다. –

답변

1

내부 클래스를 public static class Sound으로 변경하는 것이 좋습니다. 이렇게하면 Audioapp 인스턴스가 필요없이 클래스 인스턴스를 구성 할 수 있습니다.

그런 다음 Sound의 인스턴스를 만들려면 이름이 Audioapp.Sound 인 것처럼 처리하면됩니다. audioapp은 참고 Audioapp

+0

첫 번째 권장 사항은 거의 효과가 있었지만 "정적이 아닌 메서드 인 getCodeBase()는 정적 컨텍스트에서 참조 할 수 없습니다."오류가 발생합니다. 어떤 아이디어? – RonaldRaygun

+0

정적 내부 클래스는 그 내부 클래스의 정적 메서드와 필드 만 참조 할 수 있습니다. 메서드를 정적으로 변경하거나 클래스를 정적이 아닌 것으로 변경해야합니다. –

+0

내 Sound 클래스를 정적이 아닌 것으로 다시 변경했습니다. 그런 다음 두 번째 추천서와 함께갔습니다. 그러나 나는 "심볼을 찾을 수 없습니다"라는 메시지를 받았으며, 그것은 당신의 OP에서 Audioapp의 인스턴스였던 audioapp를 가리키고 있습니다. – RonaldRaygun

관련 문제