Head First JAVA: 11. Chapter - Kamil-Jankowski/Learning-JAVA GitHub Wiki
Dwa przyciski:
package interfejsGraficzny;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class DwaPrzyciski {
JFrame ramka;
JLabel etykieta;
public static void main(String[] args) {
DwaPrzyciski gui = new DwaPrzyciski();
gui.doRoboty();
}
public void doRoboty() {
ramka = new JFrame();
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton przyciskEtykiety = new JButton("Zmień etykietę");
przyciskEtykiety.addActionListener(new EtykietaListener());
JButton przyciskKolor = new JButton("Zmień kolor");
przyciskKolor.addActionListener(new KolorListener());
etykieta = new JLabel("Oto etykieta");
MojPanelGraficzny panel = new MojPanelGraficzny();
ramka.getContentPane().add(BorderLayout.SOUTH, przyciskKolor);
ramka.getContentPane().add(BorderLayout.CENTER, panel);
ramka.getContentPane().add(BorderLayout.EAST, przyciskEtykiety);
ramka.getContentPane().add(BorderLayout.WEST, etykieta);
ramka.setSize(400, 300);
ramka.setVisible(true);
}
class EtykietaListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent zdarzenieEtykieta) {
etykieta.setText("Auuuuuuuu!");
}
}
class KolorListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent zdarzenieKolor) {
ramka.repaint();
}
}
}
Lista:
package interfejsGraficzny;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
public class Lista implements ListSelectionListener {
// Object[] listaOpcji = {"alfa", "beta", "gamma", "delta", "epsilon", "zeta", 7, "eta", "teta"};
String[] listaOpcji = {"alfa", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "teta"};
JList listaWyborow = new JList(listaOpcji);
public static void main(String[] args) {
Lista gui = new Lista();
gui.tworzGUI();
}
private void tworzGUI() {
JFrame ramka = new JFrame();
JPanel panel = new JPanel();
JScrollPane przewijanie = new JScrollPane(listaWyborow);
listaWyborow.setVisibleRowCount(6);
listaWyborow.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
listaWyborow.addListSelectionListener(this);
przewijanie.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
przewijanie.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
panel.add(przewijanie);
ramka.getContentPane().add(BorderLayout.NORTH, panel);
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.setBounds(900, 200, 100, 200);
ramka.setVisible(true);
}
@Override
public void valueChanged(ListSelectionEvent zdarzenie) {
if(!zdarzenie.getValueIsAdjusting()){
String opcja = (String) listaWyborow.getSelectedValue();
System.out.println("Wybrana opcja: " + opcja);
}
}
}
Mój Panel Graficzny:
package interfejsGraficzny;
import java.awt.*;
import javax.swing.*;
public class MojPanelGraficzny extends JPanel {
public static final int WARTOSCI_W_RGB = 256;
public void paintComponent(Graphics g){
// g.setColor(Color.orange);
//
// g.fillRect(20, 50, 100, 100);
//---------------------------------------------------------------------//
// String sciezkaPliku = "E:\\Documents\\_PROGRAMOWANIE_\\Java\\RuszGlowa\\11\\src\\interfejsGraficzny/R2D2.jpg";
// Image obrazek = new ImageIcon(sciezkaPliku).getImage();
// g.drawImage(obrazek, 1, 1, this);
//---------------------------------------------------------------------//
// g.fillRect(0,0, this.getWidth(), this.getHeight());
//
// int czerwony = (int)(Math.random()* WARTOSCI_W_RGB);
// int zielony = (int)(Math.random()* WARTOSCI_W_RGB);
// int niebieski = (int)(Math.random()* WARTOSCI_W_RGB);
//
// Color kolorLosowy = new Color(czerwony, zielony, niebieski);
// g.setColor(kolorLosowy);
// g.fillOval(70, 70, 100, 100);
//---------------------------------------------------------------------//
// Graphics2D g2d = (Graphics2D) g;
//
// GradientPaint gradient = new GradientPaint(70, 70, Color.blue, 150,150, Color.orange);
//
// g2d.setPaint(gradient);
// g2d.fillOval(70, 70, 100, 100);
//---------------------------------------------------------------------//
Graphics2D g2d = (Graphics2D) g;
int czerwony = (int)(Math.random()*WARTOSCI_W_RGB);
int zielony = (int)(Math.random()*WARTOSCI_W_RGB);
int niebieski = (int)(Math.random()*WARTOSCI_W_RGB);
Color kolorPoczatku = new Color(czerwony, zielony, niebieski);
czerwony = (int)(Math.random()*WARTOSCI_W_RGB);
zielony = (int)(Math.random()*WARTOSCI_W_RGB);
niebieski = (int)(Math.random()*WARTOSCI_W_RGB);
Color kolorKonca = new Color(czerwony, zielony, niebieski);
GradientPaint gradientLosowy = new GradientPaint(70, 70, kolorPoczatku, 150, 150, kolorKonca);
g2d.setPaint(gradientLosowy);
g2d.fillOval(70, 70, 100, 100);
}
}
Panel 1:
package interfejsGraficzny;
import javax.swing.*;
import java.awt.*;
public class Panel1 {
public static void main(String[] args) {
Panel1 gui = new Panel1();
gui.doRoboty();
}
private void doRoboty() {
JFrame ramka = new JFrame();
JPanel panel = new JPanel();
JButton przycisk1 = new JButton("To szok!");
JButton przycisk2 = new JButton("Trach!");
JButton przycisk3 = new JButton("Och?!");
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBackground(Color.darkGray);
panel.add(przycisk1);
panel.add(przycisk2);
panel.add(przycisk3);
ramka.getContentPane().add(BorderLayout.EAST, panel);
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.setSize(200, 200);
ramka.setVisible(true);
}
}
Pole tekstowe:
package interfejsGraficzny;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class PoleTekstowe implements ActionListener {
JFrame ramka = new JFrame();
JPanel panel = new JPanel();
JTextField poleTekstowe = new JTextField(20);
JLabel pole = new JLabel("Podaj nazwisko");
public static void main(String[] args) {
PoleTekstowe gui = new PoleTekstowe();
gui.doRoboty();
}
public void doRoboty() {
panel.add(pole);
panel.add(poleTekstowe);
poleTekstowe.requestFocus();
poleTekstowe.addActionListener(this);
poleTekstowe.setText("nazwisko");
poleTekstowe.selectAll();
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.getContentPane().add(BorderLayout.NORTH, panel);
ramka.setBounds(600, 300, 380, 300);
ramka.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent zdarzenie) {
System.out.println(poleTekstowe.getText());
poleTekstowe.setText("");
}
}
Pole tekstowe WW1:
package interfejsGraficzny;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class PoleTekstoweWW1 implements ActionListener {
JTextArea tekst;
public static void main(String[] args) {
PoleTekstoweWW1 gui = new PoleTekstoweWW1();
gui.tworzGUI();
}
public void tworzGUI() {
JFrame ramka = new JFrame();
JPanel panel = new JPanel();
JButton przycisk = new JButton("Po prostu kliknij");
tekst = new JTextArea(10, 20);
JScrollPane przewijanie = new JScrollPane(tekst);
przewijanie.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
przewijanie.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
tekst.setLineWrap(true);
tekst.setText("Not all those who wander are lost");
tekst.selectAll();
przycisk.addActionListener(this);
panel.add(przewijanie);
ramka.getContentPane().add(BorderLayout.CENTER, panel);
ramka.getContentPane().add(BorderLayout.SOUTH, przycisk);
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.setBounds(600, 300, 380, 300);
ramka.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent zdarzenie) {
tekst.append("\nPrzycisk kliknięty");
}
}
Pole wyboru:
package interfejsGraficzny;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class PoleWyboruBox implements ItemListener {
JCheckBox poleWyboru;
public static void main(String[] args) {
PoleWyboruBox gui = new PoleWyboruBox();
gui.tworzGUI();
}
private void tworzGUI() {
JFrame ramka = new JFrame();
poleWyboru = new JCheckBox("Grasz dalej?");
// poleWyboru.setSelected(true);
// poleWyboru.setSelected(false);
poleWyboru.addItemListener(this);
ramka.getContentPane().add(BorderLayout.CENTER, poleWyboru);
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.setBounds(600, 200, 100, 75);
ramka.setVisible(true);
}
@Override
public void itemStateChanged(ItemEvent zdarzenie) {
String wlaczoneCzyNie = "wyłączone";
if(poleWyboru.isSelected()) wlaczoneCzyNie = "włączone";
System.out.println("Pole jest " + wlaczoneCzyNie);
}
}
Prosta animacja:
package interfejsGraficzny;
import javax.swing.*;
import java.awt.*;
public class ProstaAnimacja {
int x = 70;
int y = 70;
public static void main(String[] args) {
ProstaAnimacja gui = new ProstaAnimacja();
gui.doRoboty();
}
public void doRoboty() {
JFrame ramka = new JFrame();
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MojPanelRysunkowy panel = new MojPanelRysunkowy();
ramka.getContentPane().add(panel);
ramka.setSize(300,300);
ramka.setVisible(true);
for (int i = 0; i<130; i++){
x++;
y++;
panel.repaint(); // lub: ramka.repaint();
try {
Thread.sleep(50);
}catch (Exception e){}
}
}
class MojPanelRysunkowy extends JPanel{
public void paintComponent(Graphics g){
g.setColor(Color.white); // wtedy ten kod
g.fillRect(0, 0, this.getWidth(), this.getHeight()); // jest niepotrzebny
g.setColor(Color.green);
g.fillOval(x, y, 40, 40);
}
}
}
Prosty GUI:
package interfejsGraficzny;
import javax.swing.*;
public class ProstyGUI1 {
public static void main(String[] args) {
JFrame ramka = new JFrame(); // Utworzenie ramki
JButton przycisk = new JButton("Kliknij mnie"); // Utworzenie przycisku
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Program zostanie zakończony bezpośrednio po zamknięciu okna
ramka.getContentPane().add(przycisk); // Dodanie przycisku do panelu znajdującego się wewnątrz stworzonej ramki
ramka.setSize(300, 300); // Określenie rozmiaru ramki
ramka.setVisible(true); // Określenie widoczności ramki
}
}
Prosty GUI 1b:
package interfejsGraficzny;
import javax.swing.*;
import java.awt.event.*;
public class ProstyGUI1b implements ActionListener{
JButton przycisk;
public static void main(String[] args) {
ProstyGUI1b apGUI = new ProstyGUI1b();
apGUI.doDziela();
}
public void doDziela() {
JFrame ramka = new JFrame();
przycisk = new JButton("Kliknij mnie");
przycisk.addActionListener(this);
ramka.getContentPane().add(przycisk);
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.setSize(300, 300);
ramka.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent zdarzenie) {
przycisk.setText("Zostałem kliknięty");
}
}
Prosty GUI 1c:
package interfejsGraficzny;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ProstyGUI1c implements ActionListener {
private static JFrame ramka;
private static JButton przycisk;
private static MojPanelGraficzny panelR;
public static void main(String[] args) {
ProstyGUI1c apGUI = new ProstyGUI1c();
apGUI.doDziela();
}
private void doDziela() {
ramka = new JFrame();
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
przycisk = new JButton("Kliknij by zmienić kolor");
przycisk.addActionListener(this);
panelR = new MojPanelGraficzny();
ramka.getContentPane().add(BorderLayout.SOUTH, przycisk);
ramka.getContentPane().add(BorderLayout.CENTER, panelR);
ramka.setSize(300, 300);
ramka.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent zdarzenie) {
ramka.repaint();
}
}
Prosty GUI rysowanie:
package interfejsGraficzny;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ProstyGUIRysowanie{
public static void main(String[] args) {
ProstyGUIRysowanie apGUI = new ProstyGUIRysowanie();
apGUI.doDziela();
}
public void doDziela() {
JFrame ramka = new JFrame();
MojPanelGraficzny panel = new MojPanelGraficzny();
ramka.getContentPane().add(panel);
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.setSize(1130, 1130);
ramka.setVisible(true);
}
}
Przycisk:
package interfejsGraficzny;
import javax.swing.*;
import javax.swing.plaf.BorderUIResource;
import java.awt.*;
public class Przycisk1 {
public static void main(String[] args) {
Przycisk1 gui = new Przycisk1();
// gui.doRobotyWsch();
// gui.doRobotyPln();
// gui.doRobotyDUZE();
gui.doRoboty();
}
private void doRoboty() {
JFrame ramka = new JFrame();
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton polnoc = new JButton("Północ");
JButton poludnie = new JButton("Południe");
JButton wschod = new JButton("Wschód");
JButton zachod = new JButton("Zachód");
JButton center = new JButton("Centrum");
ramka.getContentPane().add(BorderLayout.NORTH, polnoc);
ramka.getContentPane().add(BorderLayout.SOUTH, poludnie);
ramka.getContentPane().add(BorderLayout.EAST, wschod);
ramka.getContentPane().add(BorderLayout.WEST, zachod);
ramka.getContentPane().add(BorderLayout.CENTER, center);
ramka.setSize(300, 300);
ramka.setVisible(true);
}
private void doRobotyWsch() {
JFrame ramka = new JFrame();
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton przycisk = new JButton("Kliknij mnie jeśli chcesz");
ramka.getContentPane().add(BorderLayout.EAST, przycisk);
ramka.setSize(200, 200);
ramka.setVisible(true);
}
private void doRobotyPln() {
JFrame ramka = new JFrame();
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton przycisk = new JButton("Nie ma, nie ma wody na...");
ramka.getContentPane().add(BorderLayout.NORTH, przycisk);
ramka.setSize(200, 200);
ramka.setVisible(true);
}
private void doRobotyDUZE() {
JFrame ramka = new JFrame();
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton przycisk = new JButton("Kliknij TU!");
Font duzaCzcionka = new Font("serif", Font.BOLD, 28);
przycisk.setFont(duzaCzcionka);
ramka.getContentPane().add(BorderLayout.NORTH, przycisk);
ramka.setSize(200, 200);
ramka.setVisible(true);
}
}
Mini odtwarzacz 1:
package odtwarzacz;
import javax.sound.midi.*;
public class MiniOdtwarzacz1 {
public static void main(String[] args) {
try{
Sequencer sekwenser = MidiSystem.getSequencer();
sekwenser.open();
Sequence sekwencja = new Sequence(Sequence.PPQ, 4);
Track sciezka = sekwencja.createTrack();
for(int i = 5; i<61; i+=4){
sciezka.add(tworzZdarzenie(144, 1, i, 100, i));
sciezka.add(tworzZdarzenie(128, 1, i, 100, i+2));
}
sekwenser.setSequence(sekwencja);
sekwenser.setTempoInBPM(220);
sekwenser.start();
} catch (Exception ex){ex.printStackTrace();}
}
public static MidiEvent tworzZdarzenie(int plc, int kanal, int jeden, int dwa, int takt) {
MidiEvent zdarzenie = null;
try{
ShortMessage a = new ShortMessage();
a.setMessage(plc, kanal, jeden, dwa);
zdarzenie = new MidiEvent(a, takt);
}catch (Exception e){}
return zdarzenie;
}
}
Mini odtwarzacz 2:
package odtwarzacz;
import javax.sound.midi.*;
public class MiniOdtwarzacz2 implements ControllerEventListener{
public static void main(String[] args) {
MiniOdtwarzacz2 mini = new MiniOdtwarzacz2();
mini.doRoboty();
}
public void doRoboty(){
try{
Sequencer sekwenser = MidiSystem.getSequencer();
sekwenser.open();
int[] zdarzeniaObslugiwane = {127};
sekwenser.addControllerEventListener(this, zdarzeniaObslugiwane);
Sequence sekwencja = new Sequence(Sequence.PPQ, 4);
Track sciezka = sekwencja.createTrack();
for(int i = 5; i<61; i+=4){
sciezka.add(tworzZdarzenie(144, 1, i, 100, i));
sciezka.add(tworzZdarzenie(176, 1, 127, 0, i)); // 176 - controller event,
sciezka.add(tworzZdarzenie(128, 1, i, 100, i+2));
}
sekwenser.setSequence(sekwencja);
sekwenser.setTempoInBPM(220);
sekwenser.start();
} catch (Exception ex){ex.printStackTrace();}
}
public static MidiEvent tworzZdarzenie(int plc, int kanal, int jeden, int dwa, int takt) {
MidiEvent zdarzenie = null;
try{
ShortMessage a = new ShortMessage();
a.setMessage(plc, kanal, jeden, dwa);
zdarzenie = new MidiEvent(a, takt);
}catch (Exception e){}
return zdarzenie;
}
@Override
public void controlChange(ShortMessage event) {
System.out.println("La");
}
}
Mini odtwarzacz 3:
package odtwarzacz;
import javax.sound.midi.*;
import javax.swing.*;
import java.awt.*;
public class MiniOdtwarzacz3 {
static JFrame ramka = new JFrame("Moje pierwsze muzyczne wideo");
static MojPanelGraf panel;
public static void main(String[] args) {
MiniOdtwarzacz3 mini = new MiniOdtwarzacz3();
mini.doRoboty();
}
private void konfigurujGUI() {
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new MojPanelGraf();
ramka.setContentPane(panel);
ramka.setBounds(30, 30, 300, 300);
ramka.setVisible(true);
}
public void doRoboty() {
konfigurujGUI();
int tempo = 220;
try{
Sequencer sekwenser = MidiSystem.getSequencer();
sekwenser.open();
int[] nasluchiwaneZdarzenie = {127};
sekwenser.addControllerEventListener(panel, nasluchiwaneZdarzenie);
Sequence sekwencja = new Sequence(Sequence.PPQ, 4);
Track sciezka = sekwencja.createTrack();
int losowaNuta = 0;
for(int i=5; i<60; i+=4){
losowaNuta = (int)((Math.random()*50)+1);
sciezka.add(tworzZdarzenie(144, 1, losowaNuta, 100, i));
sciezka.add(tworzZdarzenie(176, 1, 127, 0, i));
sciezka.add(tworzZdarzenie(128, 1, losowaNuta, 100, i+2));
}
sekwenser.setSequence(sekwencja);
sekwenser.setTempoInBPM(tempo);
sekwenser.start();
}catch(Exception ex){ex.printStackTrace();}
}
public static MidiEvent tworzZdarzenie(int plc, int kanal, int jeden, int dwa, int takt){
MidiEvent zdarzenie = null;
try{
ShortMessage a = new ShortMessage();
a.setMessage(plc, kanal, jeden, dwa);
zdarzenie = new MidiEvent(a, takt);
}catch(Exception e){}
return zdarzenie;
}
public class MojPanelGraf extends JPanel implements ControllerEventListener {
private static final int WARTOSC_W_RGB = 256;
private static final int MINIMALNE_PRZESUNIECIE = 10;
private static final int MAKSYMALNE_PRZESUNIECIE = 90;
private static final int MINIMALNY_ROZMIAR = 10;
private static final int MAKSYMALNY_ROZMIAR = 190;
boolean komunikat = false;
@Override
public void controlChange(ShortMessage event) {
komunikat = true;
repaint();
}
public void paintComponent(Graphics g){
if(komunikat){
Graphics2D g2d = (Graphics2D) g;
ustawKolorLosowy(g);
// ustalamy losowe położenie i rozmiar prostokątów:
int polozenieX = (int)((Math.random()* MAKSYMALNE_PRZESUNIECIE)+ MINIMALNE_PRZESUNIECIE);
int polozenieY = (int)((Math.random()* MAKSYMALNE_PRZESUNIECIE)+ MINIMALNE_PRZESUNIECIE);
int szerokosc = (int)((Math.random()* MAKSYMALNY_ROZMIAR)+ MINIMALNY_ROZMIAR);
int wysokosc = (int)((Math.random()* MAKSYMALNY_ROZMIAR)+ MINIMALNY_ROZMIAR);
g.fillRect(polozenieX, polozenieY, szerokosc, wysokosc);
komunikat = false;
}
}
public void ustawKolorLosowy(Graphics g) {
int czerwony = (int)(Math.random()* WARTOSC_W_RGB);
int zielony = (int)(Math.random()* WARTOSC_W_RGB);
int niebieski = (int)(Math.random()* WARTOSC_W_RGB);
g.setColor(new Color(czerwony, zielony, niebieski));
}
}
}
Pranie:
package pranie;
public class Pranie {
public void zrobPranie() throws SpodnieExeption, BieliznaException{
System.out.println("Wyjątki, wyjątki!");
throw new SpodnieExeption();
// throw new pranie.BieliznaException();
}
}
Bielizna exception:
package pranie;
public class BieliznaException extends Exception {
}
Spodnie exception:
package pranie;
public class SpodnieExeption extends Exception {
}
Test:
package pranie;
public class Test {
public void doDziela(){
Pranie pranie = new Pranie();
try{
pranie.zrobPranie();
} catch(SpodnieExeption sex){
System.out.println("Spodnie exception");
} catch (BieliznaException bex){
System.out.println("Bielizna exception");
}
}
public static void main(String[] args) {
Test test = new Test();
test.doDziela();
}
}
Muzyka tester:
package muzmachina;
import javax.sound.midi.*;
public class MuzaTester1 {
public void graj(){
try{
Sequencer sekwenser = MidiSystem.getSequencer();
System.out.println("Mamy sekwenser!");
} catch(MidiUnavailableException ex){
System.out.println("Masz problem");
}
}
public static void main(String[] args) {
MuzaTester1 mt = new MuzaTester1();
mt.graj();
}
}
Mini mini music application:
package muzmachina;
import javax.sound.midi.*;
public class MiniMiniMuzaAplk {
public static void main(String[] args) {
MiniMiniMuzaAplk mini = new MiniMiniMuzaAplk();
mini.graj();
}
private void graj() {
try{
Sequencer sekwenser = MidiSystem.getSequencer();
sekwenser.open();
Sequence sekwencja = new Sequence(Sequence.PPQ, 4);
Track sciezka = sekwencja.createTrack();
ShortMessage a = new ShortMessage();
a.setMessage(144, 1, 44, 100); // co należy wykonać (typ komunikatu, {kanał, nuta do zagrania, szybkość} - zmienne w zależności od typu komunikatu)
MidiEvent nutaPoczatek = new MidiEvent(a, 1); // kiedy należy to wykonać (co zagrać, który takt)
sciezka.add(nutaPoczatek); // 144 - note on (zacznij grać)
ShortMessage b = new ShortMessage();
b.setMessage(128, 1, 44, 100); // 128 - note off (zakończ granie)
MidiEvent nutaKoniec = new MidiEvent(b, 16);
sciezka.add(nutaKoniec);
ShortMessage c = new ShortMessage();
c.setMessage(192, 1, 123, 0); // 192 - zmiana instrumentu
MidiEvent zmianaInstrumentu = new MidiEvent(c, 17);
sciezka.add(zmianaInstrumentu);
ShortMessage d = new ShortMessage();
d.setMessage(144, 1, 44, 100);
MidiEvent nuta2Poczatek = new MidiEvent(d, 17);
sciezka.add(nuta2Poczatek);
ShortMessage e = new ShortMessage();
e.setMessage(128, 1, 44, 100);
MidiEvent nuta2Koniec = new MidiEvent(e, 32);
sciezka.add(nuta2Koniec);
sekwenser.setSequence(sekwencja);
sekwenser.start();
} catch (Exception ex){ex.printStackTrace();}
}
}
Mini music application:
package muzmachina;
import javax.sound.midi.*;
public class MiniMuzaAplkWrsPlc {
public static void main(String[] args) {
MiniMuzaAplkWrsPlc mini = new MiniMuzaAplkWrsPlc();
if(args.length < 2){
System.out.println("Nie zapomnij podać argumentów określających instrument i nutę");
} else{
int instrument = Integer.parseInt(args[0]);
int nuta = Integer.parseInt(args[1]);
mini.graj(instrument, nuta);
}
}
public void graj(int instrument, int nuta) {
try{
Sequencer sekwenser = MidiSystem.getSequencer();
sekwenser.open();
Sequence sekwencja = new Sequence(Sequence.PPQ, 4);
Track sciezka = sekwencja.createTrack();
MidiEvent zdarzenie = null;
ShortMessage pierwszy = new ShortMessage();
pierwszy.setMessage(192, 1, instrument, 0);
MidiEvent zmienInstrument = new MidiEvent(pierwszy, 1);
sciezka.add(zmienInstrument);
ShortMessage a = new ShortMessage();
a.setMessage(144, 1, nuta, 100);
MidiEvent nutaPoczatek = new MidiEvent(a, 1);
sciezka.add(nutaPoczatek);
ShortMessage b = new ShortMessage();
b.setMessage(128, 1, nuta, 100);
MidiEvent nutaKoniec = new MidiEvent(b, 16);
sciezka.add(nutaKoniec);
sekwenser.setSequence(sekwencja);
sekwenser.start();
}catch(Exception ex){ex.printStackTrace();}
}
}
MuzMachina:
package muzmachina;
import javax.sound.midi.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.ArrayList;
public class MuzMachina {
JPanel panelGlowny;
ArrayList<JCheckBox> listaPolWyboru;
Sequencer sekwenser;
Sequence sekwencja;
Track sciezka;
JFrame ramkaGlowna;
String[] nazwyInstrumentow = {"Bass Drum", "Closed Hi-Hat", "Open Hi-Hat", "Acoustinc Snare", "Crash Cymbal",
"Hand Clap", "High Tom", "Hi Bongo", "Maracas", "Whistle", "Low Conga", "Cowbell",
"Vibraslap", "Low-mid Tom", "High Agogo", "Open Hi Conga"};
int[] instrumenty = {35, 42, 46, 38, 49, 39, 50, 60, 70, 72, 64, 56, 58, 47, 67, 63};
public static void main(String[] args) {
new MuzMachina().tworzGUI();
}
private void tworzGUI() {
ramkaGlowna = new JFrame("muzmachina.MuzMachina");
listaPolWyboru = new ArrayList<>();
GridLayout siatkaPolWyboru = new GridLayout(16,16);
panelGlowny = new JPanel(siatkaPolWyboru);
BorderLayout uklad = new BorderLayout();
JPanel panelTla = new JPanel(uklad);
Box obszarPrzyciskow = new Box(BoxLayout.Y_AXIS);
JButton start = new JButton("Start");
JButton stop = new JButton("Stop");
JButton tempoGora = new JButton("Szybciej");
JButton tempoDol = new JButton("Wolniej");
JButton zapisz = new JButton("Zapisz");
JButton odtworz = new JButton("Odtwórz");
Box obszarNazw = new Box(BoxLayout.Y_AXIS);
for (int i = 0; i<16; i++){
obszarNazw.add(new Label(nazwyInstrumentow[i]));
}
start.addActionListener(new MojStartListener());
stop.addActionListener(new MojStopListener());
tempoGora.addActionListener(new MojTempoGoraListener());
tempoDol.addActionListener(new MojTempoDolListener());
zapisz.addActionListener(new ZapiszListener());
odtworz.addActionListener(new OdtworzListener());
obszarPrzyciskow.add(start);
obszarPrzyciskow.add(stop);
obszarPrzyciskow.add(tempoGora);
obszarPrzyciskow.add(tempoDol);
obszarPrzyciskow.add(zapisz);
obszarPrzyciskow.add(odtworz);
siatkaPolWyboru.setVgap(1);
siatkaPolWyboru.setHgap(2);
panelTla.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
panelTla.add(BorderLayout.EAST, obszarPrzyciskow);
panelTla.add(BorderLayout.WEST, obszarNazw);
panelTla.add(BorderLayout.CENTER, panelGlowny);
for (int i=0; i<256; i++){
JCheckBox c = new JCheckBox();
c.setSelected(false);
listaPolWyboru.add(c);
panelGlowny.add(c);
}
konfigurujMidi();
ramkaGlowna.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramkaGlowna.getContentPane().add(panelTla);
ramkaGlowna.setBounds(500, 150, 300, 300);
ramkaGlowna.pack();
ramkaGlowna.setVisible(true);
}
public class MojStartListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent akcja) {
utworzSciezkeIOdtworz();
}
}
public class MojStopListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent akcja) {
sekwenser.stop();
}
}
public class MojTempoGoraListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent akcja) {
float wspTempa = sekwenser.getTempoFactor(); // wspTempa = 1.0
float szybszyWspTempa = (float)(wspTempa * 1.03); // tempo + 3%
sekwenser.setTempoFactor(szybszyWspTempa);
}
}
public class MojTempoDolListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
float wspTempa = sekwenser.getTempoFactor(); // wspTempa = 1.0
float wolniejszyWspTempa = (float)(wspTempa * 0.97); // tempo - 3%
sekwenser.setTempoFactor(wolniejszyWspTempa);
}
}
private void konfigurujMidi() {
try{
sekwenser = MidiSystem.getSequencer();
sekwenser.open();
sekwencja = new Sequence(Sequence.PPQ, 4);
sciezka = sekwencja.createTrack();
sekwenser.setTempoInBPM(120);
}catch (Exception e){e.printStackTrace();}
}
public void utworzSciezke(int[] lista){
for (int i = 0; i<16; i++){
int klucz = lista[i];
if(klucz != 0){
sciezka.add(tworzZdarzenie(144,9,klucz,100,i)); // NOTE ON
sciezka.add(tworzZdarzenie(128,9,klucz,100,i+1)); // NOTE OFF
}
}
}
private MidiEvent tworzZdarzenie(int plc, int kanal, int jeden, int dwa, int takt) {
MidiEvent zdarzenie = null;
try{
ShortMessage a = new ShortMessage();
a.setMessage(plc, kanal, jeden, dwa);
zdarzenie = new MidiEvent(a, takt);
}catch(Exception e){e.printStackTrace();}
return zdarzenie;
}
public void utworzSciezkeIOdtworz() {
int[] listaSciezki = null;
final int BRAK_NUTY = 0;
sekwencja.deleteTrack(sciezka);
sciezka = sekwencja.createTrack();
for (int i = 0; i < 16; i++) {
listaSciezki = new int[16];
int klucz = instrumenty[i];
for (int j = 0; j < 16; j++) {
JCheckBox jc = (JCheckBox) listaPolWyboru.get(j + (16 * i));
if (jc.isSelected()) {
listaSciezki[j] = klucz;
} else {
listaSciezki[j] = BRAK_NUTY;
}
}
utworzSciezke(listaSciezki);
sciezka.add(tworzZdarzenie(176, 1, 127, 0, 16)); // tworzymy zdarzenia dla danego instrumentu i wszystkich 16 taktów, po czym zapisujemy je na ścieżce
}
sciezka.add(tworzZdarzenie(192, 9, 1, 0, 15)); // upewniamy się, że w ostatnim takcie zawsze coś będzie
try {
sekwenser.setSequence(sekwencja);
sekwenser.setLoopCount(sekwenser.LOOP_CONTINUOUSLY);
sekwenser.start();
sekwenser.setTempoInBPM(120);
} catch (Exception e) {
e.printStackTrace();
}
}
public class ZapiszListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent zd) {
//tworzymy tablicę ze stanami pól wyboru
int iloscPolWyboru = 256;
boolean[] stanyPol = new boolean[iloscPolWyboru];
for(int i = 0; i < iloscPolWyboru; i++){
JCheckBox pole = (JCheckBox) listaPolWyboru.get(i);
if (pole.isSelected()) {
stanyPol[i] = true;
}
}
JFileChooser plikZapisu = new JFileChooser();
plikZapisu.showSaveDialog(ramkaGlowna);
File sciezkaZapisu = new File(String.valueOf(plikZapisu.getSelectedFile()));
try{
FileOutputStream strumienPliku = new FileOutputStream(sciezkaZapisu);
ObjectOutputStream strumienWyjsciaObiektu = new ObjectOutputStream(strumienPliku);
strumienWyjsciaObiektu.writeObject(stanyPol);
}catch(Exception ex){ex.printStackTrace();}
}
}
public class OdtworzListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent a) {
sekwenser.stop();
boolean[] stanyPol = null;
JFileChooser plikOdczytu = new JFileChooser();
plikOdczytu.showOpenDialog(ramkaGlowna);
File sciezkaOdczytu = new File(String.valueOf(plikOdczytu.getSelectedFile()));
try{
FileInputStream plikDanych = new FileInputStream(sciezkaOdczytu);
ObjectInputStream strumienWejsciaObiektu = new ObjectInputStream(plikDanych);
stanyPol = (boolean[]) strumienWejsciaObiektu.readObject();
}catch(Exception ex){ex.printStackTrace();}
int iloscPolWyboru = 256;
for (int i = 0; i < iloscPolWyboru; i++){
JCheckBox pole = (JCheckBox) listaPolWyboru.get(i);
if(stanyPol[i]) {
pole.setSelected(true);
}else {
pole.setSelected(false);
}
utworzSciezkeIOdtworz();
}
}
}
}