apêndice A: Receita de Código Final
455
você está aquieste é um novo apêndice
Apêndice A
Receita de Código
Final
dance beat
Andy: groove #2
Chris: groove2
revised
Nigel: dance
beat
Sua mensagem
será enviada
para os outros
participantes, junto
com seu padrão de
batida atual, quando
você pressionar
“sendIt”.
Mensagens recebidas
dos participantes.
Clique em uma para
carregar o padrão
que veio com ela e,
em seguida, clique
em ‘Start’ para
reproduzi-lo.
Finalmente, a versão completa da BeatBox!
Ela se conectará com um objeto MusicServer simples
para que você possa enviar e receber padrões de batida
de outros clientes.
456 apêndice A
código nal da BeatBox
O programa final do cliente da Beat Box
Grande parte desse código é o mesmo das Receitas de Código dos capítulos anteriores, portanto, não
comentaremos tudo novamente. As novas partes incluem:
GUI — dois novos componentes foram adicionados à área de texto que exibe mensagens recebidas (na verdade
uma lista de rolagem) e ao campo de texto.
REDE — da mesma forma que o SimpleChatClient deste capítulo, a BeatBox agora se conecta com o servidor
e captura um uxo de entrada e saída.
SEGMENTOS — novamente, da mesma forma que o SimpleChatClient, iniciamos uma classe de ‘leitura’ que
procura continuamente mensagens recebidas no servidor. Mas em vez de apenas texto, as mensagens recebidas
incluem DOIS objetos: a mensagem em forma de String e a ArrayList serializada (o objeto que contém o estado
de todas as caixas de seleção).
import java.awt.*;
import javax.swing.*;
import java.io.*;
import javax.sound.midi.*;
import java.util.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.event.*;
public class BeatBoxFinal {
JFrame theFrame;
JPanel mainPanel;
JList incomingList;
JTextField userMessage;
ArrayList<JCheckBox> checkboxList;
int nextNum;
Vector<String>listVector=newVector<String>();
String userName;
ObjectOutputStream out;
ObjectInputStreamin;
HashMap<String,boolean[]>otherSeqsMap=newHashMap<String,boolean[]>();
Sequencer sequencer;
Sequence sequence;
SequencemySequence=null;
Track track;
String[]instrumentNames={“BassDrum”,“ClosedHi-Hat”,“OpenHi-Hat”,”AcousticSnare”,
“CrashCymbal”,“HandClap”,“HighTom”,“HiBongo”,“Maracas”,“Whistle”,“LowConga”,“Cowbell”,
“Vibraslap”,“Low-midTom”,“HighAgogo”,“OpenHiConga”};
int[]instruments={35,42,46,38,49,39,50,60,70,72,64,56,58,47,67,63};
public static void main (String[] args) {
newBeatBoxFinal().startUp(args[0]);//args[0]isyouruserID/screenname
}
publicvoidstartUp(Stringname){
userName=name;
//abreumaconexãocomoservidor
try {
Socketsock=newSocket(“127.0.0.1”,4242);
out=newObjectOutputStream(sock.getOutputStream());
in=newObjectInputStream(sock.getInputStream());
Threadremote=newThread(newRemoteReader());
remote.start();
} catch(Exception ex) {
System.out.println(“couldn’tconnect-you’llhavetoplayalone.”);
}
setUpMidi();
buildGUI();
}//fechastartUp
publicvoidbuildGUI(){
Adiciona um argumento de linha de comando
para o nome de sua tela.
Exemplo: % java BeatBoxFinal theFlash
Nada de novo...
Configura a rede, a
E/S e cria (e inicia) o
segmento de leitura.
apêndice A: Receita de Código Final
457
você está aqui
theFrame=newJFrame(“CyberBeatBox”);
BorderLayoutlayout=newBorderLayout();
JPanelbackground=newJPanel(layout);
background.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
checkboxList=newArrayList<JCheckBox>();
BoxbuttonBox=newBox(BoxLayout.Y_AXIS);
JButtonstart=newJButton(“Start”);
start.addActionListener(new MyStartListener());
buttonBox.add(start);
JButtonstop=newJButton(“Stop”);
stop.addActionListener(new MyStopListener());
buttonBox.add(stop);
JButtonupTempo=newJButton(“TempoUp”);
upTempo.addActionListener(newMyUpTempoListener());
buttonBox.add(upTempo);
JButtondownTempo=newJButton(“TempoDown”);
downTempo.addActionListener(new MyDownTempoListener());
buttonBox.add(downTempo);
JButtonsendIt=newJButton(“sendIt”);
sendIt.addActionListener(newMySendListener());
buttonBox.add(sendIt);
userMessage=newJTextField();
Código de GUI, nada de novo aqui.
buttonBox.add(userMessage);
incomingList=newJList();
incomingList.addListSelectionListener(new MyListSelectionListener());
incomingList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPanetheList=newJScrollPane(incomingList);
buttonBox.add(theList);
incomingList.setListData(listVector);//nenhumdadocomoqualiniciar
BoxnameBox=newBox(BoxLayout.Y_AXIS);
for(inti=0;i<16;i++){
nameBox.add(new Label(instrumentNames[i]));
}
background.add(BorderLayout.EAST, buttonBox);
background.add(BorderLayout.WEST,nameBox);
theFrame.getContentPane().add(background);
GridLayoutgrid=newGridLayout(16,16);
grid.setVgap(1);
grid.setHgap(2);
mainPanel=newJPanel(grid);
background.add(BorderLayout.CENTER, mainPanel);
for(inti=0;i<256;i++){
JCheckBoxc=newJCheckBox();
c.setSelected(false);
checkboxList.add(c);
mainPanel.add(c);
}//mdoloop
theFrame.setBounds(50,50,300,300);
theFrame.pack();
theFrame.setVisible(true);
}//fechabuildGUI
publicvoidsetUpMidi(){
try {
sequencer=MidiSystem.getSequencer();
sequencer.open();
sequence=newSequence(Sequence.PPQ,4);
track=sequence.createTrack();
sequencer.setTempoInBPM(120);
} catch(Exception e) {e.printStackTrace();}
}//fechasetUpMidi
JList é um componente que ainda não usamos. É
onde as mensagens recebidas serão exibidas.
Só que em vez de um bate-papo comum em que
você apenas EXAMINARIA as mensagens,
nesse aplicativo poderá SELECIONAR uma
mensagem na lista e carregar e reproduzir o
padrão de batida anexo.
Não há mais nada nessa
página que seja novidade.
Captura o objeto Sequencer,
cria um objeto Sequence e
um objeto Track.
Get Use A Cabeça Java now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.