Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Назначение клавиш, MouseListener 
:(
    Опции темы
Vevo
Дата 10.5.2014, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 10.5.2014

Репутация: нет
Всего: нет



Здравствуйте, пишу синтезатор и не могу на кнопки задействовать клавиатуру, хочу сделать что бы можно было играть с клавиатуры. искал много информации по этому поводу но моих навыков пока что не достаточно , буду благодарен за помощь!

Код

import javax.sound.midi.MidiChannel;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Synthesizer;
import javax.swing.*;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class poch
{
    @SuppressWarnings ("Korniyko beta")
    public static class Roll extends JLayeredPane
    {
        private MidiChannel midiChannel;

        public Roll (MidiChannel midiChannel, int startOctave, int tones)
        {
            this.midiChannel = midiChannel;
            setLayout(null);
            int pitch = startOctave * 6;

            for (int i = 0, j = 0; i < tones; i++, j = i % 7) {
                if (j != 0 && j != 3) {
                    JButton black = new JButton();
                    black.setSize(13, 50);
                    black.setLocation(i * 15 + 8, 375);
                    black.setBackground(Color.BLACK);
                    black.addMouseListener(new NotePlayerListener(pitch++));
                    add(black, 1, -1);
                }
                JButton white = new JButton();
                white.setSize(15, 80);
                white.setLocation(i * 15 + 15, 375);
                white.setBackground(Color.WHITE);
                white.addMouseListener(new NotePlayerListener(pitch++));
                add(white, 0, -1);


            }




        }

        private class NotePlayerListener extends MouseAdapter
        {
            private final int pitch;

            public NotePlayerListener (int pitch)
            {
                this.pitch = pitch;
            }

            @Override
            public void mousePressed (MouseEvent e)
            {
                midiChannel.noteOn(pitch, 100);
            }

            @Override
            public void mouseReleased (MouseEvent e)
            {
                midiChannel.noteOff(pitch, 100);
            }

            @Override
            public void mouseExited (MouseEvent e)
            {
                midiChannel.noteOff(pitch);
            }

            @Override
            public void mouseEntered (MouseEvent e)
            {
                if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0) {
                    midiChannel.noteOn(pitch, 100);
                }
                super.mouseEntered(e);
            }
        }
    }
   public static void main (String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run ()
            {
                try {
                    Synthesizer synth = MidiSystem.getSynthesizer();
                    synth.open();
                    MidiChannel[] channels = synth.getChannels();
                    JFrame jFrame = new JFrame();
                    jFrame.add(new Roll(channels[0], 4, 7 * 7 + 3 ));
                    // 7 октав + 3 (89)
                    jFrame.setVisible(true);
                    jFrame.setSize(825, 500);
                    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                }
                catch (MidiUnavailableException ex) {
                    throw new RuntimeException(ex);
                }
            }
        });
    }
}

PM MAIL   Вверх
Michael.de
Дата 12.5.2014, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 22.3.2005
Где: Deutschland

Репутация: нет
Всего: 9



Напрямую KeyEvent для JFrame не существует. Но можно извернуться, как в следующем коде:
Код

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Sample1 extends JFrame {
    private JPanel panel;
    private Color c1=new Color(0xDDDDFF), c2=new Color(0xEEEEDD);
    private String[][] letters={
        {"a","b","c","d","e","f","g","h","i","j","k","l","m"},
        {"n","o","p","q","r","s","t","u","v","w","x","y","z"}
    };

    private int width=letters[0].length, height=letters.length;
    private JButton[][] buttons=new JButton[height][width];
    public Sample1() {
        setTitle("Just test...");
        panel=new JPanel(new GridLayout(height, width, 1, 1));
        getContentPane().add(panel);
        for (int i=0; i<height; i++) {
            for (int j=0; j<width; j++) {
                buttons[i][j]=new JButton(letters[i][j]);
                buttons[i][j].setBackground(c2);
                panel.add(buttons[i][j]);
            }
        }

        setBounds(100, 100, 700, 150);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

        KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(
            new KeyEventDispatcher() {
                public boolean dispatchKeyEvent(final KeyEvent e) {
                    String keyChar=""+e.getKeyChar();
                    // replacement for: public void keyTyped(KeyEvent event)
                    if (e.getID() == KeyEvent.KEY_TYPED) {
                        for (int i=0; i<height; i++) {
                            for (int j=0; j<width; j++) {
                                if (keyChar.equalsIgnoreCase(buttons[i][j].getText())) {
                                    buttons[i][j].setBackground(c1);
                                }
                                else buttons[i][j].setBackground(c2);
                            }
                        }
                    }
                    // replacement for: public void keyPressed(KeyEvent event)
                    else if (e.getID() == KeyEvent.KEY_PRESSED) {
                        // type your code here...
                    }
                    // replacement for: public void keyReleased(KeyEvent event)
                    else {
                        // type your code here...
                    }
                    return false;
                }
            }
        );
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(
            new Runnable() {
                public void run() {
                    new Sample1();
                }
            }
        );
    }
}


Надеюсь что ответил по адресу smile
PM MAIL   Вверх
Vevo
Дата 27.5.2014, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 10.5.2014

Репутация: нет
Всего: нет



Цитата(Michael.de @ 12.5.2014,  16:41)
Напрямую KeyEvent для JFrame не существует. Но можно извернуться, как в следующем коде:
Код

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Sample1 extends JFrame {
    private JPanel panel;
    private Color c1=new Color(0xDDDDFF), c2=new Color(0xEEEEDD);
    private String[][] letters={
        {"a","b","c","d","e","f","g","h","i","j","k","l","m"},
        {"n","o","p","q","r","s","t","u","v","w","x","y","z"}
    };

    private int width=letters[0].length, height=letters.length;
    private JButton[][] buttons=new JButton[height][width];
    public Sample1() {
        setTitle("Just test...");
        panel=new JPanel(new GridLayout(height, width, 1, 1));
        getContentPane().add(panel);
        for (int i=0; i<height; i++) {
            for (int j=0; j<width; j++) {
                buttons[i][j]=new JButton(letters[i][j]);
                buttons[i][j].setBackground(c2);
                panel.add(buttons[i][j]);
            }
        }

        setBounds(100, 100, 700, 150);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

        KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(
            new KeyEventDispatcher() {
                public boolean dispatchKeyEvent(final KeyEvent e) {
                    String keyChar=""+e.getKeyChar();
                    // replacement for: public void keyTyped(KeyEvent event)
                    if (e.getID() == KeyEvent.KEY_TYPED) {
                        for (int i=0; i<height; i++) {
                            for (int j=0; j<width; j++) {
                                if (keyChar.equalsIgnoreCase(buttons[i][j].getText())) {
                                    buttons[i][j].setBackground(c1);
                                }
                                else buttons[i][j].setBackground(c2);
                            }
                        }
                    }
                    // replacement for: public void keyPressed(KeyEvent event)
                    else if (e.getID() == KeyEvent.KEY_PRESSED) {
                        // type your code here...
                    }
                    // replacement for: public void keyReleased(KeyEvent event)
                    else {
                        // type your code here...
                    }
                    return false;
                }
            }
        );
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(
            new Runnable() {
                public void run() {
                    new Sample1();
                }
            }
        );
    }
}


Надеюсь что ответил по адресу smile

Спасибо,помогло!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0789 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.