- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的游戏对话框结束后,应该会显示一个可怕的弹出窗口,并伴有刺耳的噪音。当我单击按钮(BPanel)时,图片显示为“损坏”,直到声音文件播放完毕。尖叫声结束后,画面弹出。
是否可以简单地将两者同步在一起?请注意,问题发生在使用 Scaryface.png 和 Sound 类的 Woc 类中。
主要方法:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Game {
public static void main(String args[]) {
Woc WineOrCheese = new Woc("Wine or Cheese");
WineOrCheese.applyBackground("TitleBackground.png");
WineOrCheese.applyButton("Play.png", 250, 200, 400, 200);
}
}
Woc 是 JFrame
import static java.lang.System.out;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Woc extends JFrame {
private JFrame window;
private Woc.BPanel background;
private BufferedImage backgroundImg;
final int HEIGHT = 600;
final int WIDTH = 900;
private BufferedImage scaryImg;
public Woc(String text) {
/*********************************
* Sets up window. *
********************************/
window = new JFrame(text);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLayout(null);
window.setVisible(true);
window.setSize(WIDTH, HEIGHT);
window.setLocationRelativeTo(null);
}
public void applyBackground(String ImgName) {
try {
backgroundImg = ImageIO.read(getClass().getResource(ImgName));
} catch (IOException e) {
out.println("No image detected");
}
background = new Woc.BPanel(backgroundImg, 0, 0, WIDTH, HEIGHT);
window.add(background);
background.setBounds(0, 0, WIDTH, HEIGHT);
}
public void applyButton(String ImgName, int x1, int y1, int width,
int height) {
BufferedImage buttonImg = null;
try {
buttonImg = ImageIO.read(getClass().getResource(ImgName));
} catch (IOException e) {
}
Woc.BPanel button = new Woc.BPanel(buttonImg, x1, y1, width, height);
window.add(button);
button.setBounds(0, 0, WIDTH, HEIGHT);
button.addMouseListener(new Clicker());
}
public static void play(String filename) {
try {
Clip clip = AudioSystem.getClip();
clip.open(AudioSystem.getAudioInputStream(new File(filename)));
clip.start();
} catch (Exception exc) {
exc.printStackTrace(System.out);
}
}
private class BPanel extends JPanel {
public BufferedImage img;
public int x1, y1, width, height;
public BPanel(BufferedImage img, int x1, int y1, int width, int height) {
super();
this.img = img;
this.x1 = x1;
this.y1 = y1;
this.width = width;
this.height = height;
// this.setOpaque(false);
this.setBackground(new Color(0, 0, 0, 0));
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, x1, y1, width, height, null);
}
}
private class Clicker implements MouseListener {
@Override
public void mouseClicked(MouseEvent arg0) {
//Dialog of game is here in the form of JOptionPane.
applyBackground("Scaryface.png");
for (int k = 0; k < 10; k++) {
for (int z = 0; z < 10; z++) {
out.println(".");
}
}
Sound scary = null;
try {
scary = new Sound("scary.wav", window);
} catch (Exception e) {
}
}
@Override
public void mouseEntered(MouseEvent arg0) {
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}
声音等级:
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.*;
public class Sound {
public Sound(String s, JFrame win) throws InterruptedException {
Clip play = null;
try {
File in = new File(s);
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(in);
play = AudioSystem.getClip();
play.open(audioInputStream);
FloatControl volume = (FloatControl) play.getControl(FloatControl.Type.MASTER_GAIN);
volume.setValue(1.0f); // Reduce volume by 10 decibels.
play.start();
// Loop until the Clip is not longer running.
// We loop this way to allow the line to fill, otherwise isRunning will
// return false
do {
Thread.sleep(10);
} while (play.isRunning());
play.drain();
} catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) {
ex.printStackTrace();
} finally {
try {
play.close();
} catch (Exception exp) {
}
}
}
}
顺便问一下,有什么技巧可以让我的游戏更容易编写吗?有什么方法或类(class)可以改善和减轻我必须经历的痛苦吗? (好吧,不是真正的痛苦,但仍然很痛苦)
最佳答案
do {
Thread.sleep(10);
} while (play.isRunning());
和
play.drain();
使用上述代码阻止事件调度线程,从而阻止 UI 更新。请参阅Concurrency in Swing了解更多详情
避免使用 null
布局,像素完美布局是现代 UI 设计中的一种幻觉。影响组件个体尺寸的因素太多,您无法控制其中任何一个。 Swing 的设计初衷是与布局管理器一起工作,放弃它们将导致无穷无尽的问题,您将花费越来越多的时间来尝试纠正
您不应该使用带按钮的 MouseListener
,而应使用 ActionListener
,触发按钮的方法不止一种。请参阅How to Use Buttons, Check Boxes, and Radio Buttons和 How to Write an Action Listeners了解更多详情
如果您想知道音频何时结束,您应该使用 LineListener
,for example 。这样,您可以选择音频完成后要执行的操作。就个人而言,我会将 LineListener
的实例传递给您的 Sound
类,因为您的 Sound
类不应该关心播放之外的任何内容。声音
Without the while loop, the sound is unable to play. How do I resolve this issue because this was the only way I was able to play the sound
在音频完成之前不要关闭Clip
,为此我将使用(另一个)LineListener
。
以下示例基本上采用您的 Sound
类并向其应用 LineListener
。一个用于通知相关方(启动声音的一方)有关线路事件的信息,另一个用于在内部监视剪辑并在其停止时将其关闭。
该示例使用 ReentrantLock
和 Condition
来停止代码执行,直到剪辑完成,在此示例中,这将阻止 JVM 终止,但您不这样做不需要,我只是用来提供一个基本的演示
import java.io.File;
import java.io.IOException;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
public class TestAudio {
public static void main(String[] args) {
ReentrantLock lockWait = new ReentrantLock();
Condition conWait = lockWait.newCondition();
try {
new Sound("...", new LineListener() {
@Override
public void update(LineEvent event) {
if (event.getType().equals(LineEvent.Type.STOP)) {
System.out.println("Line has stopped");
lockWait.lock();
try {
conWait.signal();
} finally {
lockWait.unlock();
}
}
}
});
System.out.println("Waiting for audio to finish");
lockWait.lock();
try {
conWait.await();
} finally {
lockWait.unlock();
}
System.out.println("Audio has finished");
} catch (InterruptedException | LineUnavailableException | IOException | UnsupportedAudioFileException exp) {
exp.printStackTrace();
}
}
public static class Sound {
private Clip play;
public Sound(String s, LineListener listener) throws InterruptedException, LineUnavailableException, IOException, UnsupportedAudioFileException {
play = null;
File in = new File(s);
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(in);
play = AudioSystem.getClip();
play.addLineListener(new LineListener() {
@Override
public void update(LineEvent event) {
if (event.getType().equals(LineEvent.Type.STOP)) {
System.out.println("Audio stopped, closing clip");
play.close();
}
}
});
play.addLineListener(listener);
play.open(audioInputStream);
FloatControl volume = (FloatControl) play.getControl(FloatControl.Type.MASTER_GAIN);
volume.setValue(1.0f); // Reduce volume by 10 decibels.
play.start();
}
}
}
有关使用 Swing 和 Clip
的更复杂示例,请查看 Playing multiple sound clips using Clip objects
关于java - Java Swing 中面板无法与声音文件同时显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34758718/
是否可以在无需用户点击或鼠标悬停的情况下播放声音文件? 我有一个记分牌,我想在球队得分时播放声音文件。任何指示将不胜感激。我基本上完成了记分牌,但没有声音。 谢谢。 最佳答案 https://gith
我正在创建一个音频应用程序,其中有两个名为 录制音频 浏览音频 当用户单击第一个按钮时,他可以录制音频。这已经实现。 当用户单击第二个按钮时,他可以浏览以查找iPhone库中已经存在的音频/声音。我对
香港专业教育学院一直在使用SoX来将文件修剪为恰好2秒长,但是我注意到音频文件最后总是额外多了32毫秒左右,显然它的额外数据是要告知其他解码器其信息,但是否必须添加放在文件的长度上? 我创建了一个程序
我将使用代码来获取设备的默认音量/声音,该默认音量/声音是使用设备上的音量调高或调低按钮设置的,下面是我要访问声音的代码, 为了解决此错误,我已经进行了研究,发现要访问此代码,我们需要使用CoreAu
我有解码 MP3 并用所有“值”填充数组的代码。 我的问题是:这些值(value)观是什么?它们是频率吗?它们是振幅吗? 这是代码: File file = new File(song.getFile
哈乌乌,我正在尝试实现 Pong。 现在我想播放声音,但它抛出异常(UnsupportedAudioFileException)。我做错了什么? AudioInputStream ainBalk;
我在大学的一个兄弟会中,在这个兄弟会中我们有楼梯。时不时有人从那些楼梯上掉下来。我们通常从吧台后面的电脑播放音乐(通常来自互联网或 iTunes)。我有一个 usb 按钮,想编写一个程序,当有人从楼梯
我想检测来自用户语音的声音/噪音,如果语音输入为空,它会自动停止。 为应用程序点赞 talking tom cat当有声音/语音输入时它会自动开始收听,当没有声音/语音输入时会自动停止。 任何帮助都将
我正在使用 jQuery Sound Plugin在我的网站上创建一些声音效果,但我无法播放。我收到此消息: settings.events.error(null, {msg: "You have n
我有一段代码可以在我点击一个按钮后播放声音。当我第二次单击此按钮时,首先会出现重置之类的东西。 我想要的是:每次单击按钮时我都想立即播放声音而无需重置按钮。 我的代码: -(IBAction)play
我在android studio中制作了一个闹钟。我可以运行该应用程序,除了播放闹钟铃声外,其他一切正常。实际上,当闹钟时间到来时,没有声音播放。我不知道我的代码有什么问题。请帮我找出错误。 主要 A
有什么方法可以在关闭声音的情况下播放 UILocalNotification 声音。实际上,我正在尝试创建一个闹钟,即使用户关闭了声音也能正常工作。或实现此目的的任何替代方法。 最佳答案 如果用户关闭
我试图从字符串创建音频,我试图举一个例子,用户输入他们的名字,然后将其转换为声音/音频 - 声音/音频会根据输入的字符串而有所不同。 (我不想在字符串上执行“文本到语音”,只是创建由字符串生成的声音,
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
对大量二进制文件(例如音频和视频文件)进行版本控制的最佳方法是什么? Git 似乎并不是真正为处理大量二进制文件而设计的。 另一个问题是内容制作者不一定想学习如何使用像 Git 这样的开发人员工具。
我想让一个 python 程序在它完成任务时发出哔声来提醒我。目前,我使用 import os 然后使用命令行语音程序说“处理完成”。我宁愿它是一个简单的“铃铛”。 我知道 Cocoa 应用程序中可以
请原谅这个愚蠢的新手问题,但是:当我(不小心)在命令行窗口中按退格键时,如何关闭 MATLAB 发出的极其烦人的“哔”声? 最佳答案 只是beep off在最新版本中。 https://www.mat
如何找出用户在控制面板中配置了哪些声音文件? 示例:我想播放“设备已连接”的声音。 哪个API可用于查询控制面板声音设置? 我看到控制面板对话框中有一些由第三方程序创建的自定义条目,因此必须有一种方法
我对实现与此人 link 类似的处理方式感兴趣。 据我了解,她将一段视频切成 tiff 格式,然后使用 RiTa 库进行合成 有谁知道如何实现这样的事情,只是改变我正在使用其他扩展名或文件格式的事实。
使用 C#,我试图捕获 PC 正在播放的音频,而不使用 WASAPI 和环回,因为我的声卡似乎不支持它。 TeamViewer 之类的程序是如何做到的?当我使用它时,人们可以从我的 PC 听到音频。
我是一名优秀的程序员,十分优秀!