package edu.mbl.jif.gui.imaging.player; import edu.mbl.jif.gui.slider.SpinInteger; import edu.mbl.jif.utils.JifUtils; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; public class PlayerControl extends JPanel { private JPanel panel_Buttons = new JPanel(); private JButton button_StepBack = new JButton(); private JButton button_Begin = new JButton(); private JButton button_PlayRev = new JButton(); private JButton button_StepFwd = new JButton(); public JButton button_Pause = new JButton(); private JButton button_End = new JButton(); private JButton button_PlayFwd = new JButton(); private JSlider slider = new JSlider(); private ChangeListener sliderListener; private JToggleButton button_Repeat = new JToggleButton(); public boolean repeat = false; private JToggleButton button_Bounce = new JToggleButton(); public boolean bounce = false; private SpinInteger spin_FPS; private boolean isPlaying = false; private int currentFrame = 0; private int lastFrame = 0; private Border border1; JLabel valueMax = new JLabel(); JLabel valueCurrent = new JLabel(); JLabel labelFPS = new JLabel(); public PlayerControl() { super(); try { jbInit(); } catch (Exception e) { e.printStackTrace(); } } private void jbInit() throws Exception { // setLayout(null); setBorder(BorderFactory.createLoweredBevelBorder()); setOpaque(true); // // button_StepBack.setMargin(new Insets(0, 0, 0, 0)); button_StepBack.setIcon(JifUtils.loadImageIcon("playPrev.gif", PlayerControl.class)); button_StepBack.setToolTipText("Step to Previous Frame"); button_StepBack.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button_StepBack_actionPerformed(e); } }); button_Begin.setMargin(new Insets(0, 0, 0, 0)); button_Begin.setIcon(JifUtils.loadImageIcon("playBegin.gif", PlayerControl.class)); button_Begin.setToolTipText("Go to Beginning"); button_Begin.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button_Begin_actionPerformed(e); } }); button_PlayRev.setMargin(new Insets(0, 0, 0, 0)); button_PlayRev.setIcon(JifUtils.loadImageIcon("playRev.gif", PlayerControl.class)); button_PlayRev.setToolTipText("Play in Reverse"); button_PlayRev.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button_PlayRev_actionPerformed(e); } }); button_StepFwd.setMargin(new Insets(0, 0, 0, 0)); button_StepFwd.setIcon(JifUtils.loadImageIcon("playNext.gif", PlayerControl.class)); button_StepFwd.setToolTipText("Step to Next Frame"); button_StepFwd.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button_StepFwd_actionPerformed(e); } }); button_Pause.setMargin(new Insets(0, 0, 0, 0)); button_Pause.setIcon(JifUtils.loadImageIcon("playPause.gif", PlayerControl.class)); button_Pause.setToolTipText("Pause"); button_Pause.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button_Pause_actionPerformed(e); } }); button_End.setMargin(new Insets(0, 0, 0, 0)); button_End.setIcon(JifUtils.loadImageIcon("playEnd.gif", PlayerControl.class)); button_End.setToolTipText("Go to End"); button_End.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button_End_actionPerformed(e); } }); button_PlayFwd.setMargin(new Insets(0, 0, 0, 0)); button_PlayFwd.setIcon(JifUtils.loadImageIcon("playFwd.gif", PlayerControl.class)); button_PlayFwd.setToolTipText("Play Forward"); button_PlayFwd.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button_PlayFwd_actionPerformed(e); } }); // button_Repeat.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button_Repeat_actionPerformed(e); } }); button_Bounce.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button_Bounce_actionPerformed(e); } }); // border1 = BorderFactory.createEmptyBorder(); panel_Buttons.setBorder(border1); //panel_Buttons.setBorder(BorderFactory.createRaisedBevelBorder()); panel_Buttons.setBounds(new Rectangle(2, 2, 249, 41)); panel_Buttons.setOpaque(false); valueMax.setFont(new java.awt.Font("Dialog", 1, 12)); valueMax.setText("/ MAX"); valueMax.setBounds(new Rectangle(54, 45, 37, 19)); valueCurrent.setFont(new java.awt.Font("Dialog", 1, 12)); valueCurrent.setHorizontalAlignment(SwingConstants.RIGHT); valueCurrent.setBounds(new Rectangle(9, 44, 41, 21)); valueCurrent.setText("0"); labelFPS.setFont(new java.awt.Font("Dialog", 0, 10)); labelFPS.setHorizontalAlignment(SwingConstants.RIGHT); labelFPS.setText("fps"); labelFPS.setBounds(new Rectangle(169, 46, 21, 15)); slider.setFont(new java.awt.Font("Dialog", 0, 10)); panel_Buttons.add(button_Begin, null); panel_Buttons.add(button_PlayRev, null); panel_Buttons.add(button_StepBack, null); panel_Buttons.add(button_Pause, null); panel_Buttons.add(button_StepFwd, null); panel_Buttons.add(button_PlayFwd, null); panel_Buttons.add(button_End, null); // button_Repeat.setBounds(new Rectangle(113, 42, 23, 24)); button_Repeat.setToolTipText("Repeat"); button_Repeat.setIcon(JifUtils.loadImageIcon("repeat.gif", PlayerControl.class)); button_Repeat.setMargin(new Insets(2, 1, 2, 1)); button_Bounce.setIcon(JifUtils.loadImageIcon("bounce.gif", PlayerControl.class)); button_Bounce.setMargin(new Insets(2, 1, 2, 1)); button_Bounce.setToolTipText("Bounce (forward/backward)"); button_Bounce.setBounds(new Rectangle(140, 42, 23, 24)); // slider.setMaximum(lastFrame - 1); slider.setMinimum(0); slider.setValue(0); slider.setMinorTickSpacing(1); slider.setMajorTickSpacing(10); slider.setPaintTicks(true); slider.setSnapToTicks(true); slider.setBounds(new Rectangle(7, 69, 248, 27)); slider.setOpaque(false); slider.setBackground(Color.lightGray); // final SpinnerNumberModel modelNum = new SpinnerNumberModel(2, 1, 30, 1); spin_FPS = new SpinInteger("", modelNum, "##", 3, 12); modelNum.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { fps_Changed(modelNum.getNumber().intValue()); } }); spin_FPS.setBounds(new Rectangle(188, 40, 62, 28)); spin_FPS.setOpaque(false); this.setBackground(Color.lightGray); this.setPreferredSize(new Dimension(256, 100)); this.add(panel_Buttons, null); this.add(spin_FPS, null); this.add(valueCurrent, null); this.add(valueMax, null); this.add(button_Repeat, null); this.add(button_Bounce, null); this.add(labelFPS, null); this.add(slider, null); } public void setLastFrame(int numFrames) { lastFrame = numFrames; slider.setMaximum(lastFrame - 1); valueMax.setText("/ " + String.valueOf(lastFrame)); sliderListener = new ChangeListener() { // This method is called whenever the slider's value is changed public void stateChanged(ChangeEvent evt) { JSlider slider = (JSlider) evt.getSource(); //System.out.println("SliderEvent: " + evt); //if (!slider.getValueIsAdjusting()) { int value = slider.getValue(); sliderMoved(value); //} } }; enableSliderListener(true); } public void setbackground(Color color) { this.setBackground(color); slider.setBackground(color); } void fps_Changed(int value) { } public void setFPS(int fps) { spin_FPS.setValue(fps); } //////////////////////////////////////////////////////////////// void button_Begin_actionPerformed(ActionEvent e) { updateSliderPosition(currentFrame); } void button_PlayRev_actionPerformed(ActionEvent e) { updateSliderPosition(currentFrame); } void button_StepBack_actionPerformed(ActionEvent e) { updateSliderPosition(currentFrame); } void button_Pause_actionPerformed(ActionEvent e) { updateSliderPosition(currentFrame); } void button_StepFwd_actionPerformed(ActionEvent e) { updateSliderPosition(currentFrame); } void button_PlayFwd_actionPerformed(ActionEvent e) { updateSliderPosition(currentFrame); } void button_End_actionPerformed(ActionEvent e) { updateSliderPosition(currentFrame); } void sliderMoved(int i) { System.out.println("Slider: " + i); valueCurrent.setText(String.valueOf(i)); } void setCurrentDisplay(int n) { valueCurrent.setText(String.valueOf(n)); } //////////////////////////////////////////////////////////////// void updateSliderPosition(int frame) { final int f = frame; edu.mbl.jif.gui.swingthread.SwingWorker3 worker = new edu.mbl.jif.gui.swingthread.SwingWorker3(){ public Object construct() { slider.setValue(f); slider.repaint(); valueCurrent.setText(String.valueOf(f+1)); return null; } public void finished() { } }; worker.start(); } public void enableSliderListener(boolean t) { if (t) { slider.addChangeListener(sliderListener); } else { slider.removeChangeListener(sliderListener); } } public void setEnabledAll(boolean t) { button_Begin.setEnabled(t); button_PlayRev.setEnabled(t); button_StepBack.setEnabled(t); button_Pause.setEnabled(t); button_StepFwd.setEnabled(t); button_PlayFwd.setEnabled(t); button_End.setEnabled(t); } void button_Repeat_actionPerformed(ActionEvent e) { if (button_Repeat.isSelected()) { button_Bounce.setSelected(false); bounce = false; repeat = true; } else { repeat = false; } } void button_Bounce_actionPerformed(ActionEvent e) { if (button_Bounce.isSelected()) { button_Repeat.setSelected(false); repeat = false; bounce = true; } else { bounce = false; } } public boolean isRepeat() { return repeat; } public boolean isBounce() { return bounce; } public static void main(String[] args) { JFrame f = new JFrame(); PlayerControl pc = new PlayerControl(); pc.setLastFrame(33); pc.setBackground(Color.lightGray); f.getContentPane().add(pc, BorderLayout.CENTER); f.pack(); f.validate(); f.setVisible(true); } }