Subpage under development, new version coming soon!
Subject: Programação
ahuahuauha... ainda se diverti fazendo isso...
@rac2: meu fi vlw!! ta perfeito o chat!!!
agora vem a sessão de dúvidas
a primeira eh: esses substrings pq um tem (6) outro (9) outro (7)? entendi isso não
@rac2: meu fi vlw!! ta perfeito o chat!!!
agora vem a sessão de dúvidas
a primeira eh: esses substrings pq um tem (6) outro (9) outro (7)? entendi isso não
ferdam: HEHEHE
eiro: texto.substring(índice i) é uma operação de java.lang.String para pegar o subtexto em texto que vem a partir de i. eu uso no nosso programinha para pegar a mensagem após um comando. ao bater, por exemplo, "/exit mensagem de saida", um cliente envia a msg pro servidor, que aceita o comando, processa, envia o broadcast para informar os outros da saída, e depois envia um /exit mensagem de saída de volta para o cliente, para que o mesmo realize as operações de desconexão (fechar socket, a frame, etc...). além disso, o cliente e os outros recebem a informação da seguinte forma: *** rac2 saiu (mensagem de saída).
para pegar apenas "mensagem de saída", vamos analisar os índices dos caracters do comando completo:
'/' - 0
'e' - 1
'x' - 2
'i' - 3
't' - 4
' ' - 5
'm' - 6
'e' - 7
'n' - 8
e por aí vai...
para pegar o texto após "/exit " (espaço incluso), eu uso substring(6), com o índice 6, que retorna "mensagem de saída". ou seja, o índice depende do comando e do que vem depois (/userlist nao pode ter nada depois, ou será um comando inválido). /exit é 6, /ERRO:COM (para processar comandos de erro) é 9, etc...
eiro: texto.substring(índice i) é uma operação de java.lang.String para pegar o subtexto em texto que vem a partir de i. eu uso no nosso programinha para pegar a mensagem após um comando. ao bater, por exemplo, "/exit mensagem de saida", um cliente envia a msg pro servidor, que aceita o comando, processa, envia o broadcast para informar os outros da saída, e depois envia um /exit mensagem de saída de volta para o cliente, para que o mesmo realize as operações de desconexão (fechar socket, a frame, etc...). além disso, o cliente e os outros recebem a informação da seguinte forma: *** rac2 saiu (mensagem de saída).
para pegar apenas "mensagem de saída", vamos analisar os índices dos caracters do comando completo:
'/' - 0
'e' - 1
'x' - 2
'i' - 3
't' - 4
' ' - 5
'm' - 6
'e' - 7
'n' - 8
e por aí vai...
para pegar o texto após "/exit " (espaço incluso), eu uso substring(6), com o índice 6, que retorna "mensagem de saída". ou seja, o índice depende do comando e do que vem depois (/userlist nao pode ter nada depois, ou será um comando inválido). /exit é 6, /ERRO:COM (para processar comandos de erro) é 9, etc...
hmmm.. entendi!!!
como faz pro programa virar um aplicativo?(pra eu usar sem ser pelo Java)
como faz pro programa virar um aplicativo?(pra eu usar sem ser pelo Java)
cara, isso o eclipse faz automaticamente... dá uma pesquisada que tu acha (como construir um .jar a partir das tuas classes).
ah, precisa fazer uma modificação no código. um dos requisitos do teu professor é que nick seja único e seja colocado no início da conexão. faz as seguintes alterações:
em Cliente.java:
.) onde tem "String fromserver", muda para:
String fromServer, nickname = JOptionPane.showInputDialog("Informe o seu nick: ");
if(nickname != null)
out.println("/nick " + nickname); //se o usuario digitou algum nick, muda o nick dele
else
out.println("/userlist"); //se não, exibe apenas a lista de usuários
em Servidor.java:
.) adiciona um novo método:
public void changeNickAttemp(ThreadConexao origem, String novoNick) {
boolean jaExiste = false;
Iterator<ThreadConexao> itOrigem;
itOrigem = listaThreads.iterator();
// TODO: validação de nick (exemplo abaixo):
boolean nickInvalido = false;
if (novoNick == null || novoNick.equals("") || novoNick.contains(" ")) {
// nick não pode ser nenhum acima espaço
nickInvalido = true;
}
if (nickInvalido) {
origem.getPrintWriterOut().println("/ERRO:COMNick '" + novoNick + "' é inválido " +
"- escolha um nick válido. Seu nick atual é: "
+ origem.getUser().getNick());
origem.getPrintWriterOut().println("/ERRO:COMDigite: /nick <novo nick> para mudar.");
} else {
while (itOrigem.hasNext()) {
if (itOrigem.next().getUser().getNick().equals(novoNick)) {
jaExiste = true;
break;
}
}
if (jaExiste) {
// nick já existente - não muda o nick
origem.getPrintWriterOut().println(
"/ERRO:COMNick '" + novoNick
+ "' já está em uso. Seu nick atual é: "
+ origem.getUser().getNick());
origem.getPrintWriterOut().println(
"/ERRO:COMDigite: /nick <novo nick> para mudar.");
} else {
// nick pode ser mudado
String oldNick = origem.getUser().getNick();
origem.getUser().setNick(novoNick);
sendBroadCast(origem, "/msg *** " + oldNick
+ " mudou de nick para: " + origem.getUser().getNick());
origem.getPrintWriterOut().println(
"/nick " + origem.getUser().getNick());
sendUserList(origem);
}
}
}
em ThreadConexão.java:
.) procura pelo "else if (inputLine.startsWith("/nick "))" e muda ele para o que está abaixo:
else if (inputLine.startsWith("/nick ")) {
parent.changeNickAttemp(this, inputLine.substring(6));
continue; //pula o laço - o servidor vai tratar a mudança de nick
}
aí todos os requisitos vão estar implementados :)
(edited)
ah, precisa fazer uma modificação no código. um dos requisitos do teu professor é que nick seja único e seja colocado no início da conexão. faz as seguintes alterações:
em Cliente.java:
.) onde tem "String fromserver", muda para:
String fromServer, nickname = JOptionPane.showInputDialog("Informe o seu nick: ");
if(nickname != null)
out.println("/nick " + nickname); //se o usuario digitou algum nick, muda o nick dele
else
out.println("/userlist"); //se não, exibe apenas a lista de usuários
em Servidor.java:
.) adiciona um novo método:
public void changeNickAttemp(ThreadConexao origem, String novoNick) {
boolean jaExiste = false;
Iterator<ThreadConexao> itOrigem;
itOrigem = listaThreads.iterator();
// TODO: validação de nick (exemplo abaixo):
boolean nickInvalido = false;
if (novoNick == null || novoNick.equals("") || novoNick.contains(" ")) {
// nick não pode ser nenhum acima espaço
nickInvalido = true;
}
if (nickInvalido) {
origem.getPrintWriterOut().println("/ERRO:COMNick '" + novoNick + "' é inválido " +
"- escolha um nick válido. Seu nick atual é: "
+ origem.getUser().getNick());
origem.getPrintWriterOut().println("/ERRO:COMDigite: /nick <novo nick> para mudar.");
} else {
while (itOrigem.hasNext()) {
if (itOrigem.next().getUser().getNick().equals(novoNick)) {
jaExiste = true;
break;
}
}
if (jaExiste) {
// nick já existente - não muda o nick
origem.getPrintWriterOut().println(
"/ERRO:COMNick '" + novoNick
+ "' já está em uso. Seu nick atual é: "
+ origem.getUser().getNick());
origem.getPrintWriterOut().println(
"/ERRO:COMDigite: /nick <novo nick> para mudar.");
} else {
// nick pode ser mudado
String oldNick = origem.getUser().getNick();
origem.getUser().setNick(novoNick);
sendBroadCast(origem, "/msg *** " + oldNick
+ " mudou de nick para: " + origem.getUser().getNick());
origem.getPrintWriterOut().println(
"/nick " + origem.getUser().getNick());
sendUserList(origem);
}
}
}
em ThreadConexão.java:
.) procura pelo "else if (inputLine.startsWith("/nick "))" e muda ele para o que está abaixo:
else if (inputLine.startsWith("/nick ")) {
parent.changeNickAttemp(this, inputLine.substring(6));
continue; //pula o laço - o servidor vai tratar a mudança de nick
}
aí todos os requisitos vão estar implementados :)
(edited)
hmm.. ok.. vou da uma pesquisada
jah ajeitei as parada ai ;D
ei.. a barra de rolagem como faz?
jah ajeitei as parada ai ;D
ei.. a barra de rolagem como faz?
em FrameCliente.java
1- cria uma variavel global "JScrollPane spArea = null;"
2- no método getJContentPane(), muda jContentPane.add(getTxfArea(), null) para jContentPane.add(getSpArea(), null);
3- adiciona o método getSpArea()
public JScrollPane getSpArea() {
if (spArea == null) {
spArea = new JScrollPane( getTxfArea() );
spArea.setBounds(new Rectangle(1, 1, 578, 338));
spArea.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
spArea.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
}
return spArea;
}
4- no método getTxfArea(), comenta a seguinte linha:
//txfArea.setBounds(new Rectangle(1, 1, 578, 338));
1- cria uma variavel global "JScrollPane spArea = null;"
2- no método getJContentPane(), muda jContentPane.add(getTxfArea(), null) para jContentPane.add(getSpArea(), null);
3- adiciona o método getSpArea()
public JScrollPane getSpArea() {
if (spArea == null) {
spArea = new JScrollPane( getTxfArea() );
spArea.setBounds(new Rectangle(1, 1, 578, 338));
spArea.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
spArea.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
}
return spArea;
}
4- no método getTxfArea(), comenta a seguinte linha:
//txfArea.setBounds(new Rectangle(1, 1, 578, 338));
aee tirei 10!! vlw!!( na verdade nao foi 10, foi 5, na outra prova escrita tirei 3,5, fikei com 8,5 entao :))
public void changeNickAttemp(ThreadConexao origem, String novoNick) {
boolean jaExiste = false;
Iterator<ThreadConexao> itOrigem;
itOrigem = listaThreads.iterator();
// TODO: validação de nick (exemplo abaixo):
boolean nickInvalido = false;
if (novoNick == null || novoNick.equals("") || novoNick.contains(" ")) {
// nick não pode ser nenhum acima espaço
nickInvalido = true;
}
if (nickInvalido) {
origem.getPrintWriterOut().println("/ERRO:COMNick '" + novoNick + "' é inválido " +
"- escolha um nick válido. Seu nick atual é: "
+ origem.getUser().getNick());
origem.getPrintWriterOut().println("/ERRO:COMDigite: /nick <novo nick> para mudar.");
} else {
while (itOrigem.hasNext()) {
if (itOrigem.next().getUser().getNick().equals(novoNick)) {
jaExiste = true;
break;
}
}
if (jaExiste) {
// nick já existente - não muda o nick
origem.getPrintWriterOut().println(
"/ERRO:COMNick '" + novoNick
+ "' já está em uso. Seu nick atual é: "
+ origem.getUser().getNick());
origem.getPrintWriterOut().println(
"/ERRO:COMDigite: /nick <novo nick> para mudar.");
} else {
// nick pode ser mudado
String oldNick = origem.getUser().getNick();
origem.getUser().setNick(novoNick);
sendBroadCast(origem, "/msg *** " + oldNick
+ " mudou de nick para: " + origem.getUser().getNick());
origem.getPrintWriterOut().println(
"/nick " + origem.getUser().getNick());
sendUserList(origem);
}
}
}
esse método não está dando certo, tu testou ai? eu tentei, tentei modificar e nada
o prof disse q ia colocar la no site dele o codigo mas nem colocou ainda
public void changeNickAttemp(ThreadConexao origem, String novoNick) {
boolean jaExiste = false;
Iterator<ThreadConexao> itOrigem;
itOrigem = listaThreads.iterator();
// TODO: validação de nick (exemplo abaixo):
boolean nickInvalido = false;
if (novoNick == null || novoNick.equals("") || novoNick.contains(" ")) {
// nick não pode ser nenhum acima espaço
nickInvalido = true;
}
if (nickInvalido) {
origem.getPrintWriterOut().println("/ERRO:COMNick '" + novoNick + "' é inválido " +
"- escolha um nick válido. Seu nick atual é: "
+ origem.getUser().getNick());
origem.getPrintWriterOut().println("/ERRO:COMDigite: /nick <novo nick> para mudar.");
} else {
while (itOrigem.hasNext()) {
if (itOrigem.next().getUser().getNick().equals(novoNick)) {
jaExiste = true;
break;
}
}
if (jaExiste) {
// nick já existente - não muda o nick
origem.getPrintWriterOut().println(
"/ERRO:COMNick '" + novoNick
+ "' já está em uso. Seu nick atual é: "
+ origem.getUser().getNick());
origem.getPrintWriterOut().println(
"/ERRO:COMDigite: /nick <novo nick> para mudar.");
} else {
// nick pode ser mudado
String oldNick = origem.getUser().getNick();
origem.getUser().setNick(novoNick);
sendBroadCast(origem, "/msg *** " + oldNick
+ " mudou de nick para: " + origem.getUser().getNick());
origem.getPrintWriterOut().println(
"/nick " + origem.getUser().getNick());
sendUserList(origem);
}
}
}
esse método não está dando certo, tu testou ai? eu tentei, tentei modificar e nada
o prof disse q ia colocar la no site dele o codigo mas nem colocou ainda
aqui funfa perfeitamente hehe
se vc quiser o workspace, manda o teu email que eu zipo e te envio
se vc quiser o workspace, manda o teu email que eu zipo e te envio
to d volta!!! o assunto agora é estrutura de dados(pilha, fila, etc)
entrou um prof novo e ele mandou um trabalho pra gente fazer todas as estruturas sem nem ensinar o codigo
bom tem essa interface q deve ser o principal: (dei uma ajeitada pra ficar menor >)
==================================================
public class GUI extends JFrame {
JLabel lbPilha = new JLabel(" Pilha"); JLabel lbFila= new JLabel(" Fila");
JLabel lbVetor = new JLabel(" Vetor"); JLabel lbLista = new JLabel(" Lista");
JLabel lbSequencia = new JLabel(" Sequência"); JTextField txPilha = new JTextField();
JTextField txFila = new JTextField(); JTextField txVetor = new JTextField();
JTextField txLista = new JTextField(); JTextField txSequencia = new JTextField();
JButton btOk = new JButton("testar");
public GUI () {
super("Estruturas de dados");
setLayout(new GridLayout(6, 2)); setSize(240, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
inicializa(); setVisible(true);
}
private void inicializa() {
add(lbPilha); add(txPilha); add(lbFila); add(txFila); add(lbVetor); add(txVetor);
add(lbLista); add(txLista); add(lbSequencia); add(txSequencia); add(new JLabel());
add(btOk);
btOk.addActionListener(new ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent arg0) {
double testes = 0;
double total = 5;
try {
if (!txPilha.getText().equals("")) {
Pilha pilha = (Pilha) Class.forName(txPilha.getText()).newInstance();
testes += Teste.testePilha(pilha);
}
if (!txFila.getText().equals("")) {
Fila fila = (Fila) Class.forName(txFila.getText()).newInstance();
testes += Teste.testeFila(fila);
}
if (!txVetor.getText().equals("")) {
Vetor vetor = (Vetor) Class.forName(txVetor.getText()).newInstance();
testes += Teste.testeVetor(vetor);
}
if (!txLista.getText().equals("")) {
Lista lista = (Lista) Class.forName(txLista.getText()).newInstance();
testes += Teste.testeLista(lista);
}
if (!txSequencia.getText().equals("")) {
Sequencia sequencia = (Sequencia) Class.forName(txSequencia.getText()).newInstance();
testes += Teste.testeSequencia(sequencia);
}
double pts = 3 * testes / total;
JOptionPane.showMessageDialog(null, "Você ganhou " + pts + " pontos");
}
catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, "Não encontrou a classe: " + e.getMessage());
}
catch (ClassCastException e) {
JOptionPane.showMessageDialog(null, "Classe incompatível: " + e.getMessage());
}
catch (Exception e) {
e.printStackTrace();
}}});}
public static void main (String[] args) {
new GUI();
} }
============================================================
criou esta interface pra ajudar mas eu nao entendi como se usa
==================================================
public interface Posicao<T> {
T get();
void set(T e);
Posicao<T> getProximo();
void setProximo(Posicao<T> p);
Posicao<T> getAnterior();
void setAnterior(Posicao<T> p);
}
=======================================
colocou essa interface nao sei pra q.. seria a principal.. mas nao tem a GUI? ai eu nao sei se eh pra implementar coisas ou nao
Todas as estruturas devem ter um método teApresenta() que deve mostrar o nome do autor e da estrutura. Ex.:
class PilhaRenato implements Pilha {
public void teApresenta() {
System.out.println("Sou uma pilha do Renato!");
}
}
=======================================
interface Estrutura {
void teApresenta();
int size();
boolean isEmpty();
}
======================================
me da uma luuuuz nao sei por onde começar :P
entrou um prof novo e ele mandou um trabalho pra gente fazer todas as estruturas sem nem ensinar o codigo
bom tem essa interface q deve ser o principal: (dei uma ajeitada pra ficar menor >)
==================================================
public class GUI extends JFrame {
JLabel lbPilha = new JLabel(" Pilha"); JLabel lbFila= new JLabel(" Fila");
JLabel lbVetor = new JLabel(" Vetor"); JLabel lbLista = new JLabel(" Lista");
JLabel lbSequencia = new JLabel(" Sequência"); JTextField txPilha = new JTextField();
JTextField txFila = new JTextField(); JTextField txVetor = new JTextField();
JTextField txLista = new JTextField(); JTextField txSequencia = new JTextField();
JButton btOk = new JButton("testar");
public GUI () {
super("Estruturas de dados");
setLayout(new GridLayout(6, 2)); setSize(240, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
inicializa(); setVisible(true);
}
private void inicializa() {
add(lbPilha); add(txPilha); add(lbFila); add(txFila); add(lbVetor); add(txVetor);
add(lbLista); add(txLista); add(lbSequencia); add(txSequencia); add(new JLabel());
add(btOk);
btOk.addActionListener(new ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent arg0) {
double testes = 0;
double total = 5;
try {
if (!txPilha.getText().equals("")) {
Pilha pilha = (Pilha) Class.forName(txPilha.getText()).newInstance();
testes += Teste.testePilha(pilha);
}
if (!txFila.getText().equals("")) {
Fila fila = (Fila) Class.forName(txFila.getText()).newInstance();
testes += Teste.testeFila(fila);
}
if (!txVetor.getText().equals("")) {
Vetor vetor = (Vetor) Class.forName(txVetor.getText()).newInstance();
testes += Teste.testeVetor(vetor);
}
if (!txLista.getText().equals("")) {
Lista lista = (Lista) Class.forName(txLista.getText()).newInstance();
testes += Teste.testeLista(lista);
}
if (!txSequencia.getText().equals("")) {
Sequencia sequencia = (Sequencia) Class.forName(txSequencia.getText()).newInstance();
testes += Teste.testeSequencia(sequencia);
}
double pts = 3 * testes / total;
JOptionPane.showMessageDialog(null, "Você ganhou " + pts + " pontos");
}
catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, "Não encontrou a classe: " + e.getMessage());
}
catch (ClassCastException e) {
JOptionPane.showMessageDialog(null, "Classe incompatível: " + e.getMessage());
}
catch (Exception e) {
e.printStackTrace();
}}});}
public static void main (String[] args) {
new GUI();
} }
============================================================
criou esta interface pra ajudar mas eu nao entendi como se usa
==================================================
public interface Posicao<T> {
T get();
void set(T e);
Posicao<T> getProximo();
void setProximo(Posicao<T> p);
Posicao<T> getAnterior();
void setAnterior(Posicao<T> p);
}
=======================================
colocou essa interface nao sei pra q.. seria a principal.. mas nao tem a GUI? ai eu nao sei se eh pra implementar coisas ou nao
Todas as estruturas devem ter um método teApresenta() que deve mostrar o nome do autor e da estrutura. Ex.:
class PilhaRenato implements Pilha {
public void teApresenta() {
System.out.println("Sou uma pilha do Renato!");
}
}
=======================================
interface Estrutura {
void teApresenta();
int size();
boolean isEmpty();
}
======================================
me da uma luuuuz nao sei por onde começar :P
public interface Lista<T> extends Estrutura {
boolean isFirst(Posicao<T> p);
boolean isLast(Posicao<T> p);
Posicao<T> first();
Posicao<T> last();
Posicao<T> before(Posicao<T> p);
Posicao<T> after(Posicao<T> p);
void swapElements(Posicao<T> p, Posicao<T> q);
T replaceElement(Posicao<T> p, T e);
void insertFirst(T e);
void insertLast(T e);
void insertBefore(Posicao<T> p, T e);
void insertAfter(Posicao<T> p, T e);
void remove(Posicao<T> p);
}
==========================================
public interface Fila<T> extends Estrutura {
void insert(T e);
T remove();
T front();
}
========================================
eh pra eu mudar alguma coisa nesses codigos? oq eu tenho q fazer???
unica coisa q eu tentei fazer foi isso(sei que viajei na maionese)
=================================================
public interface Pilha<T> extends Estrutura {
void push(T e);
T pop();
T top();
public void Inserir(int e)
{
Pilha<T> = e
T++;
}
public void pop()
{
Pilha<T> = N;
Pilha<T> = null
return N;
}
}
boolean isFirst(Posicao<T> p);
boolean isLast(Posicao<T> p);
Posicao<T> first();
Posicao<T> last();
Posicao<T> before(Posicao<T> p);
Posicao<T> after(Posicao<T> p);
void swapElements(Posicao<T> p, Posicao<T> q);
T replaceElement(Posicao<T> p, T e);
void insertFirst(T e);
void insertLast(T e);
void insertBefore(Posicao<T> p, T e);
void insertAfter(Posicao<T> p, T e);
void remove(Posicao<T> p);
}
==========================================
public interface Fila<T> extends Estrutura {
void insert(T e);
T remove();
T front();
}
========================================
eh pra eu mudar alguma coisa nesses codigos? oq eu tenho q fazer???
unica coisa q eu tentei fazer foi isso(sei que viajei na maionese)
=================================================
public interface Pilha<T> extends Estrutura {
void push(T e);
T pop();
T top();
public void Inserir(int e)
{
Pilha<T> = e
T++;
}
public void pop()
{
Pilha<T> = N;
Pilha<T> = null
return N;
}
}
Eu tenho um código de uma estrutura em pilha, tá bem diferente desse ai, se quiser é só falar. Depois vou ver como calma esse exemplo que vc passou, a principio não entendeu bem tb não :)
coloca aew, vamos juntar as idéias :P
meu professor eu acho que tem 25 anos, deve está no meio da formação, parece um rapper falando(gesticulando), ninguem gosta dele, jah fizeram um abaixo-assinado pra tirá-lo, mas não tem quem colocar
meu professor eu acho que tem 25 anos, deve está no meio da formação, parece um rapper falando(gesticulando), ninguem gosta dele, jah fizeram um abaixo-assinado pra tirá-lo, mas não tem quem colocar