Я делаю клавиатуру для школьного задания и заметил проблему, с которой никогда раньше не сталкивался. Мой JFrame открывается сразу же, но JPanels внутри него, в основном панель содержимого, после этого загружается медленно. Это придает проекту незавершенность, и я ищу исправление. В конце концов они действительно загружаются, но я ищу способ сделать так, чтобы рама и панели открывались одновременно.

public class main {

    public static JFrame frame;
    public static JPanel panel, option, keys;
    public static JButton A, B, C, D, E, F, G, A3, C3, D3, F3, G3;
    public static AudioInputStream audioInputStream;
    public static Clip clip;

    public static void start() {
        frame = new JFrame("PIANO");
        frame.setPreferredSize(new Dimension(700, 500));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);

        panel = new JPanel();
        panel.setOpaque(true);
        panel.setLayout(null);
        frame.setContentPane(panel);

        option = new JPanel();
        option.setOpaque(true);
        option.setSize(new Dimension(700, 100));
        option.setLocation(0, 0);
        option.setBackground(Color.GRAY);
        panel.add(option);

        keys = new JPanel();
        keys.setOpaque(true);
        keys.setSize(new Dimension(700, 400));
        keys.setLocation(0, 100);
        keys.setLayout(null);
        panel.add(keys);

        C3 = new JButton();
        C3.setSize(new Dimension(60, 190));
        C3.setLocation(70, 0);
        C3.setBackground(Color.BLACK);
        C3.setOpaque(true);
        C3.addActionListener((ActionEvent ae) -> {

            try {
                audioInputStream = AudioSystem.getAudioInputStream(new File("C_s.wav").getAbsoluteFile());

                // create clip reference
                clip = AudioSystem.getClip();

                // open audioInputStream to the clip
                clip.open(audioInputStream);

                clip.start();
            } catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) {
                Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
            }

        });
        keys.add(C3);

        D3 = new JButton();
        D3.setSize(new Dimension(60, 190));
        D3.setLocation(170, 0);
        D3.setBackground(Color.BLACK);
        D3.setOpaque(true);
        D3.addActionListener((ActionEvent ae) -> {

            try {
                audioInputStream = AudioSystem.getAudioInputStream(new File("D_s.wav").getAbsoluteFile());

                // create clip reference
                clip = AudioSystem.getClip();

                // open audioInputStream to the clip
                clip.open(audioInputStream);

                clip.start();
            } catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) {
                Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
            }

        });
        keys.add(D3);

        frame.pack();
        frame.setVisible(true);

    }
}
0
Dawson 23 Окт 2018 в 19:04

2 ответа

Лучший ответ

Я нашел решение проблемы, хотя до сих пор не совсем уверен, что заставило его работать медленно. Как только я добавил компонент в другую опцию JPanel, моя программа работала именно так, как я хотел. Это не остановилось, как было.

public class main {

public static JFrame frame;
public static JPanel panel, option, keys;
public static JButton A, B, C, D, E, F, G, A3, C3, D3, F3, G3;
public static AudioInputStream audioInputStream;
public static Clip clip;
public static boolean octave1, octave2;

public static void start() {
    frame = new JFrame("PIANO");
    frame.setPreferredSize(new Dimension(700, 500));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);

    panel = new JPanel();
    panel.setOpaque(true);
    panel.setLayout(null);
    frame.setContentPane(panel);

    option = new JPanel();
    option.setOpaque(true);
    option.setSize(new Dimension(700, 100));
    option.setLocation(0, 0);
    option.setBackground(Color.GRAY);
    panel.add(option);

    //ADDED NEW

    oct1 = new JRadioButton("Low Octave");
    oct1.setSelected(true);
    oct1.addActionListener((ActionEvent ae) -> {

        oct2.setSelected(false);
        octave1 = true;
        octave2 = false;

    });
    option.add(oct1);

    oct2 = new JRadioButton("High Octave");
    oct2.addActionListener((ActionEvent ae) -> {

        oct1.setSelected(false);
        octave1 = false;
        octave2 = true;

    });

    //END OF NEW

    keys = new JPanel();
    keys.setOpaque(true);
    keys.setSize(new Dimension(700, 400));
    keys.setLocation(0, 100);
    keys.setLayout(null);
    panel.add(keys);

    C3 = new JButton();
    C3.setSize(new Dimension(60, 190));
    C3.setLocation(70, 0);
    C3.setBackground(Color.BLACK);
    C3.setOpaque(true);
    C3.addActionListener((ActionEvent ae) -> {

        try {
            audioInputStream = AudioSystem.getAudioInputStream(new File("C_s.wav").getAbsoluteFile());

            // create clip reference
            clip = AudioSystem.getClip();

            // open audioInputStream to the clip
            clip.open(audioInputStream);

            clip.start();
        } catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) {
            Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
        }

    });
    keys.add(C3);

    D3 = new JButton();
    D3.setSize(new Dimension(60, 190));
    D3.setLocation(170, 0);
    D3.setBackground(Color.BLACK);
    D3.setOpaque(true);
    D3.addActionListener((ActionEvent ae) -> {

        try {
            audioInputStream = AudioSystem.getAudioInputStream(new File("D_s.wav").getAbsoluteFile());

            // create clip reference
            clip = AudioSystem.getClip();

            // open audioInputStream to the clip
            clip.open(audioInputStream);

            clip.start();
        } catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) {
            Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
        }

    });
    keys.add(D3);

    frame.pack();
    frame.setVisible(true);

}
}
-1
Dawson 25 Окт 2018 в 15:55

Вы всегда должны использовать потоки для тяжелых задач, таких как загрузка файлов или чтение из базы данных, чтобы они могли работать в фоновом режиме, не затрагивая ваш графический интерфейс. Я надеюсь это тебе поможет:

new Runnable() {
        @Override
        public void run() {
            C3.addActionListener((ActionEvent ae) -> {

                try {
                    audioInputStream = AudioSystem.getAudioInputStream(new File("C_s.wav").getAbsoluteFile());

                    // create clip reference
                    clip = AudioSystem.getClip();

                    // open audioInputStream to the clip
                    clip.open(audioInputStream);

                    clip.start();
                } catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) {
                    ex.printStackTrace();
                    //Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
                }

            });
        }

    }.run();

//You can leave your listeners on the same lines as your the example

new Runnable() {
        @Override
        public void run() {
            D3.addActionListener((ActionEvent ae) -> {

                try {
                    audioInputStream = AudioSystem.getAudioInputStream(new File("D_s.wav").getAbsoluteFile());

                    // create clip reference
                    clip = AudioSystem.getClip();

                    // open audioInputStream to the clip
                    clip.open(audioInputStream);

                    clip.start();
                } catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) {
                    ex.printStackTrace();
                    //Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
                }

            });
        }

    }.run();
-2
Baro 23 Окт 2018 в 17:06
52953448