문제

나는 현재 데스크탑 (예 : JFrame)과 애플릿에서 실행하고 싶은 작은 Java 프로그램을 가지고 있습니다. 현재 모든 도면과 논리는 클래스 확장 캔버스에 의해 처리됩니다. 이것은 데스크탑 응용 프로그램을위한 아주 좋은 주요 방법을 제공합니다.

public static void main(String[] args) {
    MyCanvas canvas = new MyCanvas();
    JFrame frame = MyCanvas.frameCanvas(canvas);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    canvas.loop();
}

애플릿과 비슷한 일을 할 수 있습니까? 이상적으로 Mycanvas는 두 경우 모두 동일하게 유지됩니다.

중요한지 확실하지 않지만 Bufferstrategy를 사용하여 그려 내고 있습니다. setIgnoreRepaint(true).

편집하다: 명확히하기 위해, 내 문제는 캔버스를 그리는 것 같습니다. 모든 그림이 canvas.loop() 전화.

도움이 되었습니까?

해결책

애플릿 a 컨테이너, 단지 추가하다 거기에 당신의 캔버스.

다른 팁

일반적으로 애플릿 인 애플리케이션이있는 방법은 진입 점 클래스를 애플릿을 확장하고 설정이 캔버스 자체를 추가하도록하는 것입니다.

그런 다음 기본 메소드 버전에서 애플릿 클래스를 인스턴스화하여 새 프레임 (또는 japplet / jframe 등)에 추가합니다.

보다 여기 그리고 여기 본질적으로 (첫 번째 예에서) 요약되는 기술의 예를 위해 :

  public static void main(String args[])
  {
    Applet applet = new AppletApplication();
    Frame frame = new Frame();
    frame.addWindowListener(new WindowAdapter()
    {
      public void windowClosing(WindowEvent e)
      {
        System.exit(0);
      }
    });

    frame.add(applet);
    frame.setSize(IDEAL_WIDTH,IDEAL_HEIGHT);
    frame.show();
  }

Canvas 스윙 구성 요소에 추가하는 데 부적절합니다. 사용 JComponent 대신 (그리고 setOpaque(true)).

스윙 구성 요소는 항상 AWT 이벤트 디스패치 스레드 (EDT)에서 조작해야합니다. 사용 java.awt.EventQueue.invokeLater (invokeAndWait 애플릿). EDT에서 차단 작업을 수행해서는 안되므로이를 위해 나만의 스레드를 시작하십시오. 기본적으로 기본 스레드 (또는 애플릿 용 애플릿 스레드)에서 실행 중이며 EDT와는 상당히 별개입니다.

나는 당신의 의존성을 제거하는 것이 좋습니다 MyCanvas 에게 JFrame. 또한 애플릿을 사용하여 프레임을 사용하여 응용 프로그램에 대한 코드를 유지하는 것이 좋습니다. 구성 요소 추가 a JApplet 동일합니다 JFrame (두 경우 모두 실제로 일어나는 일은 add 실제로 전화합니다 getContentPane().add 불필요한 혼란을 일으킬 수 있습니다). 주요 차이점은 당신이 할 수 없다는 것입니다 pack 애플릿.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top