2013-02-04 5 views
0

간단한 내장 플레이어와 종료 버튼으로 구성된 간단한 VLCJ 프로젝트를 만들었습니다.VLCJ에서 AWT 버튼을 클릭 할 수 없습니다.

package test; 

import java.awt.BorderLayout; 
import java.awt.Button; 
import java.awt.Color; 
import java.awt.Frame; 
import java.awt.Panel; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

import uk.co.caprica.vlcj.binding.LibVlc; 
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent; 
import uk.co.caprica.vlcj.runtime.RuntimeUtil; 

import com.sun.jna.Native; 
import com.sun.jna.NativeLibrary; 

public class Demo { 


private final JFrame frame; 
private final EmbeddedMediaPlayerComponent mediaPlayerComponent; 
private JPanel videoPane; 
private JPanel buttonPane; 
private Button exitButton; 
private ActionListener a; 

private static String vlc_location = "C:\\Program Files\\VideoLAN\\VLC"; 

public static void main(String[] args) { 

    NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), vlc_location); 
    Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class); 

    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new Demo().run(); 
     } 
    }); 
} 

public Demo() { 

    mediaPlayerComponent = new EmbeddedMediaPlayerComponent(); 

    a = new MyActionListener(); 
    exitButton = new Button("Exit"); 
    exitButton.setActionCommand("Exit app");   
    exitButton.addActionListener(a); 

    buttonPane = new JPanel(); 
    buttonPane.setLayout(new BorderLayout()); 
    buttonPane.setBackground(Color.black); 
    buttonPane.add(exitButton, BorderLayout.CENTER); 

    videoPane = new JPanel(); 
    videoPane.setLayout(new BorderLayout()); 
    videoPane.setBackground(Color.black); 
    videoPane.add(mediaPlayerComponent, BorderLayout.CENTER); 
    videoPane.add(buttonPane, BorderLayout.PAGE_END); 


    frame = new JFrame("vlcj demo");   
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocation(100, 100); 
    frame.setSize(1200, 800);  
    frame.setContentPane(videoPane);   
    frame.setVisible(true); 
} 

public void run() {   
    mediaPlayerComponent.getMediaPlayer().playMedia(video_file); 
} 

class MyActionListener implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     String s = arg0.getActionCommand(); 

     if (s.equals("Exit")) { 
      System.exit(0); 
     } 

    } 

} 

} 

문제는 버튼이 표시 않지만 그것을 클릭 할 수 없다는 것입니다 다음과 같이

코드입니다. videoPane을 삭제하면 다시 클릭 가능합니다! 어떤 아이디어라도 놓치면 어떨까요?

vlcj 버전 2.1.0을 사용하고 있습니다.

감사합니다.

+1

버튼 대신 JButton을 사용하여 무겁고 가벼운 구성 요소를 혼합하는 것은 좋은 생각이 아닙니다. – MadProgrammer

+0

JButton을 사용해 보았지만 jpanel이 버튼을 표시하지 않습니다. 나는 패널과 jpanel의 조합도 시도했다. – user990639

+0

문제는 EDT 내에서 미디어를 재생하는 것과 관련이 있습니다. 별도의 스레드에서 미디어를 시작해보십시오 (EDT에서 UI를 설정하고 준비하기 만하면됩니다). – MadProgrammer

답변

1

귀하의 조언을 위해 감사합니다 MadProgrammer. 나는 그것에 대해 생각하고 계속 run()에서 코드 행을 주석 처리하려고 시도했다. JButton이 돌아 왔습니다!

그러나 run()의 코드 주석을 해제하면 JButton이 사라졌습니다. 아마 Swing 실행 파일이 JButton의 생성에 문제를 일으키고 있다고 생각했습니다.

따라서, 내가 한 일은 실행 가능한 전체 스윙을 멀리 언급을했다 그냥 사용

final Demo demo = new Demo(); 
demo.run(); 

데모는 이제 비디오를 재생하고, 감사 종료 버튼을 표시 할 수 있습니다!