有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将视频帧添加到JTabbed窗格

我创建了一个java选项卡式窗格。在选项卡式窗格中,我创建了一个名为Video的选项卡。我希望每当我点击“视频”选项卡时,就会自动在选项卡面板上播放视频。我能做这个吗?如果是,请告诉我怎么做


共 (2) 个答案

  1. # 1 楼答案

    您必须将ChangeListener添加到JTabbedPane组件并重写stateChanged方法:

        tabbedPane.addChangeListener(new ChangeListener() {
    
            @Override
            public void stateChanged(ChangeEvent e) {
                if (e.getSource() instanceof JTabbedPane) {
                    JTabbedPane pane = (JTabbedPane) e.getSource();
                    if (pane.getSelectedIndex() == 2) {
    
                        // start playing the media clip in tab 2
                        mediaPlayer.start(); 
    
                    }
                }
            }
        });
    

    下面是一个完整的工作代码:

    package tabvideo;
    
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.GridLayout;
    import java.awt.event.KeyEvent;
    import java.io.File;
    import java.io.IOException;
    import java.net.URL;
    import javax.swing.ImageIcon;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTabbedPane;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    import javax.media.CannotRealizeException;
    import javax.media.NoPlayerException;
    import javax.media.Player;
    import javax.media.Manager;
    
    public class TabbedPaneVideoDemo extends JPanel {
    
        Player mediaPlayer = null;
    
        public TabbedPaneVideoDemo() {
            super(new GridLayout(1, 1));
    
            JTabbedPane tabbedPane = new JTabbedPane();
            ImageIcon icon = createImageIcon("images/icon.gif");
    
            JComponent panel1 = makeTextPanel("Panel #1");
            tabbedPane.addTab("Tab 1", icon, panel1, "Does nothing");
            tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);
    
            JComponent panel2 = makeTextPanel("Panel #2");
            tabbedPane.addTab("Tab 2", icon, panel2, "Does twice as much nothing");
            tabbedPane.setMnemonicAt(1, KeyEvent.VK_2);
    
            JComponent panel3 = makeTextPanel("Panel #3");
            tabbedPane.addTab("Tab 3", icon, panel3, "Still does nothing");
            tabbedPane.setMnemonicAt(2, KeyEvent.VK_3);
    
            JComponent panel4 = makeVideoPanel("somevideo.avi");
            tabbedPane.addTab("Tab 4", icon, panel4, "Playes video!");
            tabbedPane.setMnemonicAt(3, KeyEvent.VK_4);
    
            tabbedPane.addChangeListener(new ChangeListener() {
    
                @Override
                public void stateChanged(ChangeEvent e) {
                    if (e.getSource() instanceof JTabbedPane) {
                        JTabbedPane pane = (JTabbedPane) e.getSource();
                        if (pane.getSelectedIndex() == 2) {
    
                            // start playing the media clip in tab 2
                            mediaPlayer.start();
    
                        }
                    }
                }
            });
    
            // Add the tabbed pane to this panel.
            add(tabbedPane);
    
            // The following line enables to use scrolling tabs.
            tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
        }
    
        protected JPanel makeVideoPanel(String filename) {
            JPanel panel = new JPanel(false);
    
            panel.setLayout(new BorderLayout()); // use a BorderLayout
    
            // Use lightweight components for Swing compatibility
            Manager.setHint(Manager.LIGHTWEIGHT_RENDERER, true);
    
            try {
    
                URL mediaURL = new File(filename).toURI().toURL();
    
                // create a player to play the media specified in the URL
                mediaPlayer = Manager.createRealizedPlayer(mediaURL);
    
                // get the components for the video and the playback controls
                Component video = mediaPlayer.getVisualComponent();
                Component controls = mediaPlayer.getControlPanelComponent();
    
                if (video != null)
                    panel.add(video, BorderLayout.CENTER); // add video component
    
                if (controls != null)
                    panel.add(controls, BorderLayout.SOUTH); // add controls
    
            } // end try
            catch (NoPlayerException noPlayerException) {
                System.err.println("No media player found");
            } // end catch
            catch (CannotRealizeException cannotRealizeException) {
                System.err.println("Could not realize media player");
            } // end catch
            catch (IOException iOException) {
                System.err.println("Error reading from the source");
            } // end catch
    
            return panel;
        } // end MediaPanel constructor
    
        /** Returns an ImageIcon, or null if the path was invalid. */
        protected static ImageIcon createImageIcon(String path) {
            java.net.URL imgURL = TabbedPaneVideoDemo.class.getResource(path);
            if (imgURL != null) {
                return new ImageIcon(imgURL);
            } else {
                System.err.println("Couldn't find file: " + path);
                return null;
            }
        }
    
        protected JComponent makeTextPanel(String text) {
            JPanel panel = new JPanel(false);
            JLabel filler = new JLabel(text);
            filler.setHorizontalAlignment(JLabel.CENTER);
            panel.setLayout(new GridLayout(1, 1));
            panel.add(filler);
            return panel;
        }
    
        /**
         * Create the GUI and show it. For thread safety, this method should be
         * invoked from the event dispatch thread.
         */
        private static void createAndShowGUI() {
            // Create and set up the window.
            JFrame frame = new JFrame("TabbedPaneDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            // Add content to the window.
            frame.add(new TabbedPaneVideoDemo(), BorderLayout.CENTER);
    
            // Display the window.
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            // Schedule a job for the event dispatch thread:
            // creating and showing this application's GUI.
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    // Turn off metal's use of bold fonts
                    UIManager.put("swing.boldMetal", Boolean.FALSE);
                    createAndShowGUI();
                }
            });
        }
    
    }
    
  2. # 2 楼答案

    编辑:你的意思是,它应该自动运行,不需要按下任何按钮,然后使用JTabbedPane{}类型SingleSelectionModel,在模型中添加一个ChangeListener,当一个选项卡被选中时,你会得到一个事件
    如果你的意思是它应该在小标签内运行,也许你可以运行一个Thread来显示IconImages的帧