2014-01-23 7 views
0

사용자가 JMenu를 클릭 한 다음 JMenuItem (열린 비디오)을 클릭하면 JFrame에 비디오 플레이어가 임베드되어 JFileChooser가 팝업되고 헴을 묻습니다. 비디오를 선택하고 오른쪽에있는 JTextFile을 제거하고 왼쪽에 비디오를 설정합니다. 그 모든 작업을했는데 Canvas에 비디오를 넣는 방법을 모릅니다. 항상 오류가 발생하므로 삭제 된 상태이므로 쓰기 방법이 필요합니다. 모든 오류 라인 그래서 여기에 코드가 어떤 오류를 포기하지 않는 내가 2 클래스를 첫 번째 클래스 GUI와 두 번째 하나는 내가 여기에 하나를 작성할 수 있습니다 actionlistener 및 내 첨부 된 클래스에 쓸 무엇에 대해 나를 도울 수Canvas를 사용하여 비디오를 재생하는 방법

이것은 비디오 작업 클래스입니다

,451,515,
/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 


package animeaid; 


import java.awt.Canvas; 
import java.awt.Color; 
import uk.co.caprica.vlcj.binding.LibVlc; 
import uk.co.caprica.vlcj.player.MediaPlayerFactory; 
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer; 
import uk.co.caprica.vlcj.runtime.RuntimeUtil; 
import com.sun.jna.Native; 
import com.sun.jna.NativeLibrary; 

    /** 
    * 
    * @author isslam 
    */ 

    public class VideoOpration { 

     public static Canvas c; 

     VideoOpration() { 

      MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory(); 
      c = new Canvas(); 
      c.setBackground(Color.black); 
      EmbeddedMediaPlayer mediaPlayer = mediaPlayerFactory.newEmbeddedMediaPlayer(); 
      mediaPlayer.setVideoSurface(mediaPlayerFactory.newVideoSurface(c)); 
      mediaPlayer.playMedia(GuiInterface.mediaPath); 

     } 

} 

JFileChoosear이

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 

package AnimeAid; 

import com.sun.jna.Native; 
import com.sun.jna.NativeLibrary; 
import java.awt.*; 
import java.awt.event.*; 
import java.io.File; 
import javax.swing.*; 
import javax.swing.table.*; 
import uk.co.caprica.vlcj.binding.LibVlc; 
import uk.co.caprica.vlcj.runtime.RuntimeUtil; 



/** 
* 
* @author isslam 
*/ 
public class GuiInterface extends JFrame { 

    private final JTable table; 
    private final JTextField enterText; 
    private final JMenu jMenu1,jMenu2,jMenu3; 
    private final JMenuBar jMenuBar1; 
    private final JMenuItem itemNewSrt,itemOpenVideo; 
    private static JFileChooser ourFileSelector; 
    File ourFile; 
    public static String mediaPath=""; 
    String vlcPath="C:\\Program Files\\VideoLAN\\VLC"; 


    public GuiInterface(String title){ 

    setSize(1024, 720); 
    setTitle(title); 
    setDefaultCloseOperation(GuiInterface.EXIT_ON_CLOSE); 
    String[] columnNames = {"#","Start","End","Translation column"}; 
    Object[][] data = { 
    {"1", "00:00:01,600","00:00:04,080", "Mr Magnussen, please state your\n" + 
    "full name for the record."}, 
    {"2", "00:00:04,080 ","00:00:07,040","Charles Augustus Magnussen."}}; 
    enterText = new JTextField(); 
    ourFileSelector = new JFileChooser(); 
    jMenuBar1 = new JMenuBar(); 
    jMenu1 = new JMenu("File"); 
    jMenu2 = new JMenu("Video"); 
    jMenu3 = new JMenu("Subtitle"); 

    jMenuBar1.add(jMenu1); 
    jMenuBar1.add(jMenu2); 
    jMenuBar1.add(jMenu3); 

    itemNewSrt = new JMenuItem("this text only"); 
    jMenu1.add(itemNewSrt); 


    itemOpenVideo = new JMenuItem("Open Video"); 
    jMenu2.add(itemOpenVideo); 

    setJMenuBar(jMenuBar1); 
    table = new JTable(data, columnNames); 
    table.setFillsViewportHeight(true); 
    table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 
     TableColumn columnA = table.getColumn("#"); 
     columnA.setMinWidth(10); 
     columnA.setMaxWidth(20); 
     TableColumn columnB= table.getColumn("Start"); 
     columnB.setMinWidth(80); 
     columnB.setMaxWidth(90); 

     TableColumn columnC= table.getColumn("End"); 
     columnC.setMinWidth(80); 
     columnC.setMaxWidth(90); 

     JPanel textFiled = new JPanel(new GridBagLayout()); 
     GridBagConstraints co = new GridBagConstraints(); 
     co.fill = GridBagConstraints.HORIZONTAL; 
     co.gridx =0; 
     co.gridy =0; 
     co.weightx=0.5; 
     co.weighty=1; 
     co.gridheight=0; 
     co.gridwidth=0; 
     co.ipadx=900; 
     co.ipady=80; 
     co.anchor = GridBagConstraints.PAGE_START; 
     co.insets = new Insets(100, 0, 5, 0); 
     textFiled.add(enterText,co); 

     JPanel p = new JPanel(); 
     p.add(VideoOpration.c); 

     JScrollPane scrollPane = new JScrollPane(table); 
     add(scrollPane, BorderLayout.CENTER); 
     add(textFiled, BorderLayout.NORTH); 
     add(p, BorderLayout.WEST); 









     //Container cp = getContentPane(); 
     //cp.add(videoCon); 
     itemOpenVideo.addActionListener(new MenuBarMethod()); 

    } 

public class MenuBarMethod implements ActionListener{ 

    @Override 
    public void actionPerformed(ActionEvent a){ 
     Object buttonPressed=a.getSource(); 
     if(buttonPressed.equals(itemOpenVideo)){ 
     ourFileSelector.setFileSelectionMode(JFileChooser.FILES_ONLY); 
     ourFileSelector.showSaveDialog(null); 
     ourFile = ourFileSelector.getSelectedFile(); 
     mediaPath = ourFile.getAbsolutePath(); 
     NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), vlcPath); 
     Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class); 

     } 
    } 

} 

} 
+0

* 1)은 항상/페이스트 오차 예외 출력 복사 "항상 오류 준다." 2) 더 빨리 도움을 받으려면 [MCVE] (http://stackoverflow.com/help/mcve)를 게시하십시오. - BTW - 정확한 철자를 위해서는 'VideoOperation'클래스 이름이 'VideoOperation'이어야합니다. –

+0

이 코드에는 오류가 없습니다. 메인 프레임의 jpanel에 비디오를 넣는 방법을 모르겠습니다. –

+0

@peeskillet이 코드를보실 수 있습니까? –

답변

1

비디오 표면 캔버스가 JPanel에 추가되고 선언 GUI의 클래스입니다.

기본적으로 JPanel에는 FlowLayout이 있으며 FlowLayout은 기본 크기에 따라 구성 요소를 배치합니다. 캔버스에 기본 크기가 없으므로 캔버스가 나타나지 않습니다. CENTER 제약 조건이있는 BorderLayout과 같이 패널에서보다 적절한 레이아웃 관리자를 설정하거나 Canvas에 setSize()를 사용하여 크기를 지정하십시오.

당신은 더 문제가

...

생성자 종료되고 따라서 가비지 컬렉션 대상이 될 것입니다 경우 귀하의 MediaPlayerFactory 및 EmbeddedMediaPlayer 참조가 범위를 벗어나 이동합니다. 동영상 재생이 중지됩니다. 이러한 객체를 가비지 수집을 방지하기 위해 고정해야합니다 (일반적으로 클래스의 필드가이를 수행 할 것이라고 선언하지만 이러한 참조가 포함 된 클래스가 범위를 벗어나지 않도록해야합니다).

"VideoOpration"클래스는 나에게 불필요하게 보이지만 코드가 없으면 코드가 명확 해집니다.

마지막으로 근본적인 문제는 정보를 교환하기 위해 두 클래스간에 정적 변수를 공유하면 안된다는 것입니다. 메소드를 호출하고 변수를 전달하는 것과 같은 기본 기능을 알고 있습니까?

[1], 특히 [2]에서 vlcj와 함께 제공되는 많은 예제를 실제로 살펴보아야합니다.

[1] https://github.com/caprica/vlcj/tree/master/src/test/java/uk/co/caprica/vlcj/test

[2] https://github.com/caprica/vlcj/blob/master/src/test/java/uk/co/caprica/vlcj/test/basic/TestPlayer.java

관련 문제