Pessoal, como faço para executar uma ação em uma classe após ocorrer um Listener em outra classe??? Vou tentar explicar melhor…
Da minha classe principal inicializo uma outra classe onde monta minha interface gráfica. Porém se ocorrer um clique de um botão ou um click de um menu, preciso chamar uma rotina de funções, porém essas rotinas eu quero que ocorram na minha classe principal. Conseguiram entender?
bem, naum funciona…
eu tenho que criar uma instancia da classe principal dentro da classe grafica? porque na verdade eu rcio uma instancia da classe grafica dentro da classe principal. e ai?
public static void main (String args[]) {
Principal inicio = new Principal();
}
public Principal(){
setTamanho(1000,300);
montarJanela();
setLarguraColunas(200,280,200,200,200,700);
}
public void processar(){
Cronometro crono = new Cronometro();
while(crono.getStatus(5)){
setStatusBar2("Aguardando " + crono.getTempo());
}
}
TODO To change the template for this generated type comment go to
Window - Preferences - Java - Code Style - Code Templates
*/
public class InterfaceGrafica extends javax.swing.JFrame {
public void montarJanela() {
jScrollPaneEventos = new JScrollPane();
jTableEventos = new JTable();
jPanelStatus = new JPanel();
jLabelStatus1 = new JLabel();
jLabelStatus2 = new JLabel();
jMenuBarPrincipal = new JMenuBar();
jMenuArquivo = new JMenu();
jMenuItemIniciar = new JMenuItem();
jMenuItemParar = new JMenuItem();
jMenuSeparador1 = new JSeparator();
jMenuItemSair = new JMenuItem();
setTitle("Teste");
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
System.exit(0);
}
});
jMenuItemSair.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
});
jScrollPaneEventos.setBorder(new javax.swing.border.BevelBorder(javax.swing.border.BevelBorder.LOWERED));
jTableEventos.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
"Tipo", "Data", "Origem", "Classe", "Método", "Descrição"
}
) {
Class[] types = new Class [] {
java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
};
boolean[] canEdit = new boolean [] {
false, false, false, false, false, false
};
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
});
jScrollPaneEventos.setViewportView(jTableEventos);
getContentPane().add(jScrollPaneEventos, java.awt.BorderLayout.CENTER);
jPanelStatus.setLayout(new java.awt.BorderLayout());
jLabelStatus1.setBorder(new javax.swing.border.BevelBorder(javax.swing.border.BevelBorder.LOWERED));
jLabelStatus1.setPreferredSize(new java.awt.Dimension(200, 19));
jPanelStatus.add(jLabelStatus1, java.awt.BorderLayout.WEST);
jLabelStatus2.setBorder(new javax.swing.border.BevelBorder(javax.swing.border.BevelBorder.LOWERED));
jPanelStatus.add(jLabelStatus2, java.awt.BorderLayout.CENTER);
getContentPane().add(jPanelStatus, java.awt.BorderLayout.SOUTH);
jMenuArquivo.setText("Arquivo");
jMenuItemIniciar.setText("Iniciar");
jMenuArquivo.add(jMenuItemIniciar);
jMenuItemParar.setText("Parar");
jMenuArquivo.add(jMenuItemParar);
jMenuArquivo.add(jMenuSeparador1);
jMenuItemSair.setText("Sair");
jMenuArquivo.add(jMenuItemSair);
jMenuBarPrincipal.add(jMenuArquivo);
setJMenuBar(jMenuBarPrincipal);
show();
}
public void setTamanho(int largura, int altura) {
setSize(largura, altura);
}
public void setLarguraColunas(int Coluna0, int Coluna1, int Coluna2, int Coluna3, int Coluna4, int Coluna5) {
jTableEventos.getColumnModel().getColumn(0).setPreferredWidth(Coluna0);
jTableEventos.getColumnModel().getColumn(1).setPreferredWidth(Coluna1);
jTableEventos.getColumnModel().getColumn(2).setPreferredWidth(Coluna2);
jTableEventos.getColumnModel().getColumn(3).setPreferredWidth(Coluna3);
jTableEventos.getColumnModel().getColumn(4).setPreferredWidth(Coluna4);
jTableEventos.getColumnModel().getColumn(5).setPreferredWidth(Coluna5);
}
public void inserirLinha(String Tipo, String Origem, String Classe, String Metodo, String Descricao){
Date now = new Date();
SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
String Data = formato.format(now);
if(Tipo.equals("I")){
Tipo = "Informação";
}
else if(Tipo.equals("A")) {
Tipo = "Aviso";
}
else if(Tipo.equals("E")) {
Tipo = "Erro";
}
((DefaultTableModel)jTableEventos.getModel()).addRow(new Object[]{Tipo,Data.toString(),Origem,Classe,Metodo,Descricao});
}
public void setStatusBar1(String texto){
jLabelStatus1.setText(texto);
}
public void setStatusBar2(String texto){
jLabelStatus2.setText(texto);
}
Agora preciso criar mais um Listener na classe gráfica para que quando selecione um item do menu, execute o metodo processar da classe pricipal. Outra solução seria criar o Listener na classe Principal? Tem como? valeu!
na classe que monta a interface grafica, crie uma variavel de instancia do tipo ActionListener chamada, por exemplo, ouvinteAction;
ae voce tem um botão e quer que os ActionEvents dele sejam manipulados pela classe principal: botao.addActionListener(ouvinteAction)
a sua classe principal deve implementar a interface ActionListener e definir o método public void actionPerformed(ActionEvent e);
no construtor da sua classe principal, que estende a classe que monta a interface grafica, dê um ouvinteAction = this; mas isso deve ser feito antes de montar a interface grafica
tem como postar exemplos de como criar a variavel de instancia do tipo ActionListener na classe grafica e como implementar a interface ActionListener e definir o método public void actionPerformed(ActionEvent e); na classe principal ???
Na verdade, não precisa definir um atributo ouvinteAction na InterfaceGrafica, pois o JFrame já possui métodos para lidar com escutadores:
public class Principal extends InterfaceGrafica implements ActionListener {
public Principal() {
// o JFrame já possui esse método
addActionListener(this); // adicionando a si mesmo como escutador
// agora sim monta a tela
setTamanho(1000, 300);
montarJanela();
setLarguraColunas(200, 280, 200, 200, 200, 700);
}
public void actionPerformed(ActionEvent event) {
// pegando a fonte do evento
Object source = event.getSource();
if(source == getJMenuItemSair()) {
System.exit(0);
} else if(source == getJMenuItemParar()) {
// defina aqui o quê acontece
} else if(source == getJMenuItemIniciar()) {
// defina aqui o quê acontece
}
}
public static void main (String args[]) {
Principal inicio = new Principal();
}
}
// -------------------------
public class InterfaceGrafica extends javax.swing.JFrame {
// além dos outros métodos...
protected JMenuItem getJMenuItemIniciar() {
return jMenuItemIniciar;
}
protected JMenuItem getJMenuItemParar() {
return jMenuItemParar;
}
protected JMenuItem getJMenuItemSair() {
return jMenuItemSair;
}
}
Para o esquema acima funcionar, Principal deve ter alguma maneira de acessar os componentes de InterfaceGrafica. Para isso, ou você declara os campos dele como protected ou fornece métodos de acesso. O mais recomendado é você fornecer métodos de acesso protected, para que apenas Principal e outras subclasses consigam acessar. Assumi o segundo ao escrever o código acima.
Creio que isso resolve seu problema. Se não, poste aí que a gente dá um jeito. Sem mais,
[quote=“morocos”]Na sua classe onde fica a interface grafica, use
...
ClassePrincipal.metodo();
...
flws[/quote]
Me corrija se eu estiver errado.
Para isso funcionar tem que declarar a classe pricipal como static
Aí, basta definir o MouseListener na Classe InterfaceGráfica e apontar para um método da classe principal. O ouvinte deste evento seria a propria classe InterfaceGráfica. Para chamar o método ficaria assim:
Pessoal, eu ach oque consegui, mas aconteceu um pequeno problema que ja tive antes. Bom, a classe principal ficou assim:
[code]package br;
import java.awt.event.*;
public class Principal extends InterfaceGrafica implements ActionListener {
public static void main (String args[]) {
Principal inicio = new Principal();
}
public Principal(){
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
System.exit(0);
}
});
setTamanho(1000,300);
montarJanela();
setLarguraColunas(200,280,200,200,200,700);
getJMenuItemIniciar().addActionListener(this);
}
public void actionPerformed(ActionEvent event) {
// pegando a fonte do evento
Object source = event.getSource();
if(source == getJMenuItemSair()) {
System.exit(0);
} else if(source == getJMenuItemParar()) {
// defina aqui o quê acontece
} else if(source == getJMenuItemIniciar()) {
// defina aqui o quê acontece
processar();
}
}
public void processar(){
Cronometro crono = new Cronometro();
while(crono.getStatus(5)){
setStatusBar2("Aguardando " + crono.getTempo());
}
}
}[/code]
Funcionou direitinho, ele pega o evento da classe grafica e executa o metodo processasr, porem, se vcs perceberem, no metodo processar eu mando ele mostrar o tempo do cronometro num label da classe grafica. Bem, funciona, mas só aparece o texto no label após terminar o processo. É mais ou menos assim, quando clico no menu Iniciar, é como se o programa travasse, ele fica parado por 5 segundos (tempo que eu defini na chamada da classe cronometro), e depois desse tempo ele mostra o valor final (00:00:00). É como se só reportasse o valor quando termina a rotina actionPerformed, de onde chamo o metodo processar. Ja tive problemas com isso outras vezes… e ainda naum consegui solucionar. Me aconselharam a usar uma Thread, mas não no meu outro caso não pude usar, pois tive problemas de multi-ponteiros, acabava tendo uma sobreposição de processos… e ai galera, alguem tem mais alguma super dica ???
Abraços, e obrigado pela ajuda de todos!