使用原生Java弹奏钢琴曲(2)
接着之前的那一篇文章 java播放钢琴曲 做的改造,同时增加了一些流行的音乐钢琴曲谱,如:菊次郎的夏天、天空之城、手心的蔷薇等等。后续会出一个python版本的代码教程。欢迎关注公众号【优码道】,精彩内容不错过。
首先上效果图
观看视频体验一下代码运行效果
具体实现
音乐播放逻辑
播放逻辑和之前的文章实现逻辑一样java播放钢琴曲
界面实现逻辑
使用Java原生的swing界面元素实现 界面实现逻辑是:
- • 首选创建一个JFrame作为整体布局。 设置其大小并默认居于屏幕中间。
- • 其次是创建四个JPanel各占一行,分别用于存放主旋律文件、伴奏旋律文件、选择按钮、播放按钮
- • 接下里分别给各个组件添加事件监听器。
- • main函数中调用执行即可
页面布局主要代码如下:
@Slf4j
public class MusicPlayerGUI {
public static JFrame frame;
public static JTextField mainMelodyField;
public static JTextField accompanimentField;
public static String notes;
public static String accompaniments;
public static int times;
public static AudioPlay notePlay;
public static AudioPlay accompanimentPlay;
public MusicPlayerGUI() {
// 创建主窗口
frame = new JFrame("Music Player");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 250);
// 使窗口居中显示
frame.setLocationRelativeTo(null);
// 使用BoxLayout垂直布局管理器
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); // 设置窗口四周的边距
// 创建主旋律行
JPanel mainMelodyPanel = new JPanel(new BorderLayout(10, 10)); // 增加组件之间的水平间隔
mainMelodyField = new JTextField();
mainMelodyField.setEditable(false);
mainMelodyPanel.add(new JLabel("旋律文件:"), BorderLayout.WEST);
mainMelodyPanel.add(mainMelodyField, BorderLayout.CENTER);
mainPanel.add(mainMelodyPanel);
mainPanel.add(Box.createVerticalStrut(10));
// 创建伴奏行
JPanel accompanimentPanel = new JPanel(new BorderLayout(10, 10)); // 增加组件之间的水平间隔
accompanimentField = new JTextField();
accompanimentField.setEditable(false);
accompanimentPanel.add(new JLabel("伴奏文件:"), BorderLayout.WEST);
accompanimentPanel.add(accompanimentField, BorderLayout.CENTER);
mainPanel.add(accompanimentPanel);
mainPanel.add(Box.createVerticalStrut(20));
// 创建按钮行1(主旋律、伴奏)
JPanel fileChoosePanel = getFileChoosePanel();
mainPanel.add(fileChoosePanel);
mainPanel.add(Box.createVerticalStrut(10));
// 创建按钮行2(播放、暂停)
JPanel playButtonPanel = getPlayButtonPanel();
mainPanel.add(playButtonPanel);
// 将主面板添加到窗口
frame.setContentPane(mainPanel);
// 显示窗口
frame.setVisible(true);
}
/**
* 获取播放按钮布局
* @return
*/
private static JPanel getPlayButtonPanel() {
JPanel playButtonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 20, 0));
JButton playButton = new JButton("播放");
JButton pauseButton = new JButton("暂停");
playButtonPanel.add(playButton);
playButtonPanel.add(pauseButton);
// 添加按钮的事件监听
playButton.addActionListener(new StartButtonListener());
pauseButton.addActionListener(new StopButtonListener());
return playButtonPanel;
}
/**
* 获取文件选择按钮的Panel
* @return
*/
private static JPanel getFileChoosePanel() {
JPanel buttonPanel1 = new JPanel(new FlowLayout(FlowLayout.CENTER, 20, 0));
JButton mainMelodyButton = new JButton("选择旋律");
JButton accompanimentButton = new JButton("选择伴奏");
buttonPanel1.add(mainMelodyButton);
buttonPanel1.add(accompanimentButton);
// 添加按钮的事件监听
mainMelodyButton.addActionListener(new MainMelodyButtonListener());
accompanimentButton.addActionListener(new AccompanimentButtonListener());
return buttonPanel1;
}
}
控件监听器的实现
页面控件的实现逻辑都放到代码工程中的view--->listener目录下,
想要源代码+曲谱的可以参照文章末尾的方式,在公众号中回复关键字获取。
下面是选择主旋律的按钮监听器代码:
@Slf4j
public class MainMelodyButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// 打开文件选择器,选择主旋律文件
JFileChooser fileChooser = new JFileChooser();
// 设置文件过滤器,只显示.txt文件
fileChooser.setFileFilter(new NoteFileFilter());
// 替换为你想要的路径
File defaultDirectory = new File(GlobalConst.DEFAULT_FILE_PATH);
fileChooser.setCurrentDirectory(defaultDirectory);
int result = fileChooser.showOpenDialog(MusicPlayerGUI.frame);
if (result == JFileChooser.APPROVE_OPTION) {
String fileName = fileChooser.getSelectedFile().getName();
MusicPlayerGUI.mainMelodyField.setText(fileName);
MusicPlayerGUI.notes = FileUtils.readFile2String(fileChooser.getSelectedFile());
MusicPlayerGUI.times = Integer.parseInt(fileName.substring(fileName.indexOf("_") + 1, fileName.indexOf(".")));
}
}
}
公众号【优码道】后台回复【piano可视化】获取源代码+曲谱