java将视频帧添加到JTabbed窗格 3 月 Questions & Answers 354 我创建了一个java选项卡式窗格。在选项卡式窗格中,我创建了一个名为Video的选项卡。我希望每当我点击“视频”选项卡时,就会自动在选项卡面板上播放视频。我能做这个吗?如果是,请告诉我怎么做
# 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 楼答案 编辑:你的意思是,它应该自动运行,不需要按下任何按钮,然后使用JTabbedPane{}类型SingleSelectionModel,在模型中添加一个ChangeListener,当一个选项卡被选中时,你会得到一个事件 如果你的意思是它应该在小标签内运行,也许你可以运行一个Thread来显示IconImages的帧
# 1 楼答案
您必须将
ChangeListener
添加到JTabbedPane
组件并重写stateChanged
方法:下面是一个完整的工作代码:
# 2 楼答案
编辑:你的意思是,它应该自动运行,不需要按下任何按钮,然后使用}类型
JTabbedPane
{SingleSelectionModel
,在模型中添加一个ChangeListener
,当一个选项卡被选中时,你会得到一个事件如果你的意思是它应该在小标签内运行,也许你可以运行一个
Thread
来显示IconImages
的帧