用原生Java弹奏钢琴曲(2)

202 阅读3分钟

使用原生Java弹奏钢琴曲(2)

接着之前的那一篇文章 java播放钢琴曲 做的改造,同时增加了一些流行的音乐钢琴曲谱,如:菊次郎的夏天、天空之城、手心的蔷薇等等。后续会出一个python版本的代码教程。欢迎关注公众号【优码道】,精彩内容不错过。

首先上效果图

Snipaste_2024-08-30_23-46-34.png

Snipaste_2024-08-30_23-46-10.png

Snipaste_2024-08-30_23-46-38.png

观看视频体验一下代码运行效果

具体实现

音乐播放逻辑

播放逻辑和之前的文章实现逻辑一样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(400250);

        // 使窗口居中显示
        frame.setLocationRelativeTo(null);

        // 使用BoxLayout垂直布局管理器
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
        mainPanel.setBorder(BorderFactory.createEmptyBorder(20202020)); // 设置窗口四周的边距

        // 创建主旋律行
        JPanel mainMelodyPanel = new JPanel(new BorderLayout(1010)); // 增加组件之间的水平间隔
        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(1010)); // 增加组件之间的水平间隔
        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, 200));
        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, 200));
        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目录下,

Snipaste_2024-08-30_23-51-22.png

想要源代码+曲谱的可以参照文章末尾的方式,在公众号中回复关键字获取。

下面是选择主旋律的按钮监听器代码:

@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可视化】获取源代码+曲谱

qrcode_for_gh_25ff3865cf68_258.jpg