- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了一个程序,它基本上是一个图片幻灯片放映,也显示文本和播放音乐。一切正常,除非我按下名为“播放歌曲”的 JButton。当我按下此按钮时,歌曲开始播放,但按钮仍处于按下状态,我无法在 GUI 中单击任何内容。我加载歌曲的方式有一个数组,其中包含选定文件夹中文件的所有路径名,然后我使用 FileInputStream 使用数组中的路径名加载文件。一旦文件被加载,它就会被播放。我认为这是读取 .mp3 文件并播放它们的最佳方式,因为我采用了类似的方法来读取选定文件夹中的所有图像,并且效果很好。任何帮助将不胜感激!这是包含我的主要方法的文件,它包含创建 GUI 的类,并包含除播放音乐之外的所有方法:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.net.URL;
import java.util.*;
import javax.imageio.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class Aubs extends JFrame
{
static File pics[] = null;
JLabel label;
JPanel panel;
JTextArea quoteDisplay, imageDisplay;
JButton newQuote, newBC, newText, song;
ArrayList<String> quotes = new ArrayList<String>();
public Aubs()
{
loadPics();
panel = new JPanel();
panel.setLayout(null);
panel.setBackground(Background());
add(panel);
label = new JLabel();
setPics();
changePic e = new changePic();
label.addMouseListener(e);
panel.addMouseListener(e);
song = new JButton("Play Song"); // The button to change song
song.setBounds(1000,115,185,30);
song.addActionListener(new Song()); // Add ActionListener
panel.add(song); // Adds the button to the screen
imageDisplay = new JTextArea("Click the image for a new one");
imageDisplay.setBounds(630,30,300,300);
imageDisplay.setFont(new Font("FatFrank",Font.BOLD,16));
imageDisplay.setForeground(Font()); // Sets the font color
imageDisplay.setOpaque(false);
imageDisplay.setEditable(false);
panel.add(imageDisplay);
panel.setBackground(Background());
quoteDisplay = new JTextArea();
setQuotes();
newQuote = new JButton("Quote");
newQuote.setBounds(1000,0,185,40);
newQuote.addActionListener(new changeQuote());
newQuote.setForeground(Color.BLACK);
panel.add(newQuote);
newBC = new JButton("New Background Color");
newBC.setBounds(1000,90,185,30);
newBC.addActionListener(new newBack());
newBC.setForeground(Color.BLACK);
panel.add(newBC);
newText = new JButton("New Font color");
newText.setBounds(1000,65,185,30);
newText.addActionListener(new newFont());
newText.setForeground(Color.BLACK);
panel.add(newText);
}
private void loadPics()
{
JFileChooser choose = new JFileChooser();
choose.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int status = choose.showOpenDialog(null);
if (status == JFileChooser.APPROVE_OPTION)
{
File dir = choose.getSelectedFile();
if (dir.exists())
{
pics = dir.listFiles(new FileFilter()
{
@Override
public boolean accept(File pathname)
{
String name = pathname.getName().toLowerCase();
return name.endsWith(".png")
|| name.endsWith(".jpg")
|| name.endsWith(".jpeg")
|| name.endsWith(".bmp")
|| name.endsWith(".gif");
}
});
}
}
}
private void setPics()
{
int i = (int)(Math.random()*pics.length); // Chooses a number for index
try
{
BufferedImage buff = ImageIO.read(pics[i]); // Reads in the image
ImageIcon icon = new ImageIcon(buff); // Converts it to an ImageIcon
icon = transform(icon); // Resizes
label.setIcon(icon);
label.setBounds(10,10,600,700);
panel.add(label);
panel.setBackground(Background());
}
catch (IOException e)
{
e.printStackTrace();
}
}
private ImageIcon transform(ImageIcon x) // Resizes the Image
{
ImageIcon temp = x;
Image image = temp.getImage();
Image tempImg = image.getScaledInstance(600,700,java.awt.Image.SCALE_SMOOTH );
temp = new ImageIcon(tempImg);
return temp;
}
private void loadQuotes()
{
URL url = getClass().getResource("Quotes/Quotes.txt");
try{
Scanner scan = new Scanner(new FileInputStream(url.getPath()));
while(scan.hasNextLine())
{
quotes.add(scan.nextLine());
}
scan.close();
}
catch(Exception ex)
{
System.out.println("File not found");
}
}
private void setQuotes()
{
loadQuotes();
int q = (int)(Math.random()*quotes.size());
quoteDisplay.setText(quotes.get(q));
quoteDisplay.setBounds(650,100,200,400);
quoteDisplay.setFont(new Font("FatFrank",Font.BOLD,16));
quoteDisplay.setForeground(Font());
quoteDisplay.setLineWrap(true);
quoteDisplay.setWrapStyleWord(true);
quoteDisplay.setOpaque(false);
quoteDisplay.setEditable(false);
panel.setBackground(Background());
panel.add(quoteDisplay);
imageDisplay.setBackground(Background());
}
private Color Font()
{
int r = (int)(Math.random() *256);
int g = (int)(Math.random() *256);
int b = (int)(Math.random() *256);
return (new Color(r, g, b).brighter());
}
private Color Background()
{
int r = (int)(Math.random() *256);
int g = (int)(Math.random() *256);
int b = (int)(Math.random() *256);
return (new Color(r, g, b).darker());
}
public void playSong()
{
MP3 play = new MP3(); // Creates and object of MP3
play.play(); // Calles the play method in MP3
}
private class changePic implements MouseListener
{
public void mouseClicked(MouseEvent e)
{
setPics();
quoteDisplay.setForeground(Font());
imageDisplay.setForeground(Background());
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e){}
}
private class changeQuote implements ActionListener
{
public void actionPerformed(ActionEvent q)
{
setQuotes();
}
}
private class newBack implements ActionListener
{
public void actionPerformed(ActionEvent bc)
{
panel.setBackground(Background());
}
}
private class newFont implements ActionListener
{
public void actionPerformed(ActionEvent fc)
{
quoteDisplay.setForeground(Font());
imageDisplay.setForeground(Font());
}
}
public class Song implements ActionListener // Supposes to change the song when a button is pressed
{
public void actionPerformed(ActionEvent s)
{
playSong();
}
}
public static void main(String[] args)
{
Aubs aubs = new Aubs();
aubs.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
aubs.setSize(new Dimension(1200, 1000));
aubs.setVisible(true);
}
}这是播放音乐的类:
import javazoom.jl.player.*;
import java.io.*;
import java.util.ArrayList;
public class MP3
{
static File list[] = null;
ArrayList<Player> songs = new ArrayList<Player>();
public void play()
{
MP3Files(); // Loads the pathnames to the array list[].
int i = 0; // Will be the count of the files loaded in
int x = (int)(Math.random()*i);
try
{
Player cur;
if(i >= list.length-1) // True when all files are loaded,
{
cur = songs.get(x); // Then it chooses a random song
cur.play(); // Play that song
}
else // True when not all files from list[] are loaded,
{
FileInputStream in = new FileInputStream(list[i]);
songs.add(new Player(in)); //add the song to theArrayList.
cur = songs.get(x); // Get random song
cur.play(); // Play random song
i++;
}
}
catch(Exception e)
{
System.out.println("Error");
}
}
public static void MP3Files() // Loads all the pathnames
{
File dir = new File("/Users/mine/Desktop/Music");
if(dir.isDirectory())
{
list = dir.listFiles(new FileFilter() // the pathnames.
{
@Override
public boolean accept(File pathname)
{
String name = pathname.getName().toLowerCase();
return name.endsWith(".mp3");
}
});
}
}
最佳答案
When I press this button the songs play but the button remains pressed and I can't click and anything in GUI.
从监听器调用的代码在 Event Dispatch Thread (EDT)
上执行,该线程负责绘制 GUI。
如果您随后调用一个长时间运行的任务,您将阻止 EDT,这意味着 GUI 无法响应任何更多事件或重新绘制自身,直到任务完成。
您需要启动一个单独的Thread
来播放您的歌曲。
阅读 Concurrency 上的 Swing 教程部分有关 EDT
的更多信息。您可以创建自己的 Thread
,也可以使用教程中描述的 SwingWorker
(它会为您创建 Thread),具体取决于您的具体要求。
关于java - 当我在我的 GUI 上播放歌曲时,JButton 一直被按下,我无法点击任何东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34551663/
我通过 spring ioc 编写了一些 Rest 应用程序。但我无法解决这个问题。这是我的异常(exception): org.springframework.beans.factory.BeanC
我对 TestNG、Spring 框架等完全陌生,我正在尝试使用注释 @Value通过 @Configuration 访问配置文件注释。 我在这里想要实现的目标是让控制台从配置文件中写出“hi”,通过
为此工作了几个小时。我完全被难住了。 这是 CS113 的实验室。 如果用户在程序(二进制计算器)结束时选择继续,我们需要使用 goto 语句来到达程序的顶部。 但是,我们还需要释放所有分配的内存。
我正在尝试使用 ffmpeg 库构建一个小的 C 程序。但是我什至无法使用 avformat_open_input() 打开音频文件设置检查错误代码的函数后,我得到以下输出: Error code:
使用 Spring Initializer 创建一个简单的 Spring boot。我只在可用选项下选择 DevTools。 创建项目后,无需对其进行任何更改,即可正常运行程序。 现在,当我尝试在项目
所以我只是在 Mac OS X 中通过 brew 安装了 qt。但是它无法链接它。当我尝试运行 brew link qt 或 brew link --overwrite qt 我得到以下信息: ton
我在提交和 pull 时遇到了问题:在提交的 IDE 中,我看到: warning not all local changes may be shown due to an error: unable
我跑 man gcc | grep "-L" 我明白了 Usage: grep [OPTION]... PATTERN [FILE]... Try `grep --help' for more inf
我有一段代码,旨在接收任何 URL 并将其从网络上撕下来。到目前为止,它运行良好,直到有人给了它这个 URL: http://www.aspensurgical.com/static/images/a
在过去的 5 个小时里,我一直在尝试在我的服务器上设置 WireGuard,但在完成所有设置后,我无法 ping IP 或解析域。 下面是服务器配置 [Interface] Address = 10.
我正在尝试在 GitLab 中 fork 我的一个私有(private)项目,但是当我按下 fork 按钮时,我会收到以下信息: No available namespaces to fork the
我这里遇到了一些问题。我是 node.js 和 Rest API 的新手,但我正在尝试自学。我制作了 REST API,使用 MongoDB 与我的数据库进行通信,我使用 Postman 来测试我的路
下面的代码在控制台中给出以下消息: Uncaught DOMException: Failed to execute 'appendChild' on 'Node': The new child el
我正在尝试调用一个新端点来显示数据,我意识到在上一组有效的数据中,它在数据周围用一对额外的“[]”括号进行控制台,我认为这就是问题是,而新端点不会以我使用数据的方式产生它! 这是 NgFor 失败的原
我正在尝试将我的 Symfony2 应用程序部署到我的 Azure Web 应用程序,但遇到了一些麻烦。 推送到远程时,我在终端中收到以下消息 remote: Updating branch 'mas
Minikube已启动并正在运行,没有任何错误,但是我无法 curl IP。我在这里遵循:https://docs.traefik.io/user-guide/kubernetes/,似乎没有提到关闭
每当我尝试docker组成任何项目时,都会出现以下错误。 我尝试过有和没有sudo 我在这台机器上只有这个问题。我可以在Mac和Amazon WorkSpace上运行相同的容器。 (myslabs)
我正在尝试 pip install stanza 并收到此消息: ERROR: No matching distribution found for torch>=1.3.0 (from stanza
DNS 解析看起来不错,但我无法 ping 我的服务。可能是什么原因? 来自集群中的另一个 Pod: $ ping backend PING backend.default.svc.cluster.l
我正在使用Hibernate 4 + Spring MVC 4当我开始 Apache Tomcat Server 8我收到此错误: Error creating bean with name 'wel
我是一名优秀的程序员,十分优秀!