【问题标题】:Simple Java: How to create a mute and unmute button in the background?简单的Java:如何在后台创建静音和取消静音按钮?
【发布时间】:2015-08-10 06:49:57
【问题描述】:

我正在进行一个不断更改页面并重新绘制页面的项目,我需要静音和取消静音才能在后台播放音乐。我的问题是每当它更改页面并重新绘制以及音乐重置和停止时。我正在这样做,每当鼠标按下静音/取消静音按钮时,音乐就会播放或停止,具体取决于它是否静音。

任何人都可以使用任何简单的编码来创建静音/取消静音按钮,以便在每次页面更改时都不会中断的后台播放音乐?

我在一个 Applet 上的 eclipse 上的 java 上做这个。

请帮我把它简化一下,因为我对 java 有点陌生,所以我不太了解。谢谢。

这是页面发生变化的一些代码:

public void paint(Graphics g){   
    switch (roomPage){
    case 0: homeScreen(g); break;
    case 1: instructionsPage(g); break;
    case 2: startPage(g); break;
    }
}

这是我想要发生的一些代码:

public void mousePressed(MouseEvent me) {
    if (xPos > 0 && xPos < 0+64 && yPos >0 &&  
            yPos < 0+64){
        if(soundMuted == false){
         //since it's not muted and it is clicked then the music will change
         //to "soundMuted = true" and the music will stop
         soundMuted = true;
        }
        else {
        //since it will be changing to "soundMuted = false" the music will
        //start again
        soundMuted = false;
        }
    }
}

虽然 ^ 的问题在于,每当我使用它并转到不同的页面时,它会出于某种原因将其重置为默认状态,即 false。我只是想要一个示例来简化静音/取消静音按钮,除非单击该按钮,否则该按钮可以在后台不间断播放。

【问题讨论】:

  • 考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个示例,它突出了您遇到的问题。这将导致更少的混乱和更好的响应
  • @MadProgrammer 我试着举个例子。
  • 那么,你演奏的音乐怎么样?无法真正将您的“示例”代码转储到 IDE 中并运行它:P
  • @MadProgrammer 我删除了它:/ 但我使用的是带有剪辑的东西并使用 .start();让它播放和 .stop();让它停止播放..你知道更简单的方法吗?我只需要一种简单的方法让它不间断地播放和静音。
  • 哪个Clipjava.applet.AudioClipjavax.sound.sampled.Clip?

标签: java audio mute


【解决方案1】:

所以,基于这个example

我将暂停/恢复功能包装在不同的方法中。

您需要将音频文件的路径粘贴到JTextField 并按加载,然后您可以按“点我播放”标签开始播放,“点我暂停”暂停它。

(在有人因为我不使用按钮而跳来跳去之前,OP 正在使用MouseListener,所以我正在“尝试”模仿我能看到的他们的一小部分工作流程)

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;

public class SimplyPlayer {

    public static void main(String[] args) {
        new SimplyPlayer();
    }

    public SimplyPlayer() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private Clip clip;
        private JTextField audioFile;
        private int lastFrame;

        public TestPane() {
            setLayout(new BorderLayout());

            ActionListener loadAction = new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (clip != null) {
                        clip.stop();
                        clip.close();
                    }

                    try {
                        loadClip(new File(audioFile.getText()));
                        System.out.println("loaded");
                    } catch (LineUnavailableException | IOException | UnsupportedAudioFileException ex) {
                        ex.printStackTrace();
                    }
                }
            };

            audioFile = new JTextField(20);
            audioFile.addActionListener(loadAction);

            JButton load = new JButton("Load");
            load.addActionListener(loadAction);

            JPanel loadPanel = new JPanel(new BorderLayout());
            loadPanel.add(audioFile);
            loadPanel.add(load, BorderLayout.EAST);

            add(loadPanel, BorderLayout.NORTH);

            JPanel panel = new JPanel(new GridBagLayout());

            JLabel play = new JLabel("Click me to play");
            JLabel pause = new JLabel("Click me to pause");

            play.setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(50, 50, 50, 50)));
            pause.setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(50, 50, 50, 50)));

            panel.add(play);
            panel.add(pause);

            add(panel);

            MouseListener handler = new MouseAdapter() {

                @Override
                public void mouseClicked(MouseEvent e) {
                    if (e.getSource() == play) {
                        resume();
                    } else if (e.getSource() == pause) {
                        pause();
                    }
                }

            };

            play.addMouseListener(handler);
            pause.addMouseListener(handler);

        }

        protected void loadClip(File audioFile) throws LineUnavailableException, IOException, UnsupportedAudioFileException {

            AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile);

            AudioFormat format = audioStream.getFormat();
            DataLine.Info info = new DataLine.Info(Clip.class, format);
            this.clip = (Clip) AudioSystem.getLine(info);
            this.clip.open(audioStream);

        }

        public void pause() {

            if (clip != null && clip.isRunning()) {
                lastFrame = clip.getFramePosition();
                System.out.println("Stop");
                clip.stop();
            }

        }

        public void resume() {

            if (clip != null && !clip.isRunning()) {
                // Make sure we haven't passed the end of the file...
                if (lastFrame < clip.getFrameLength()) {
                    clip.setFramePosition(lastFrame);
                } else {
                    clip.setFramePosition(0);
                }
                System.out.println("Start");
                clip.start();
            }

        }
    }

}

在小程序中加载音频文件有点复杂,但演示了here

【讨论】:

  • 所以使用 ^ 你刚刚制作的内容,我将如何制作它,而不是使用加载按钮并输入路径.. 我可以将路径放入代码中,它会自动加载而不必每次都输入路径?
  • "在小程序中加载音频文件有点复杂,但演示了here"
  • 我的意思是使用你刚刚制作的那个。不在小程序中..我如何让歌曲自动加载到它上面?
  • 是的,我刚刚给出的链接使用JApplet 来加载嵌入式资源。当您这样做时,只需确保pauseresume 方法可以访问Clip,如上所示。你知道有三个可运行的例子来说明如何做到这一点,两个展示如何暂停/恢复剪辑,一个展示你如何加载它......因为你只提供了代码的上下文剪辑,我有不知道如何将其合并到您的代码中。
猜你喜欢
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多