Imprimir uma matriz através de um botão

14 respostas Resolvido
M

Prezados, poderiam ajudar a resolver está questão?
Tenho uma função que cria uma matriz.
Quero imprimir.
Mas, só quando clicar no botão para imprimir.

Ou seja, a função de criação da matriz deverá estar separada da função imprimir.

Bloco de Citação

private void mat1()

{

int M[][] = new int[4][4];

for(int i=1;i<=3;i++)

{

for(int ia=1;ia<=3;ia++)

{

M[i][ia]=ia;

}

}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

for(int i=1;i<=3;i++)

{

for(int ia=1;ia<=3;ia++)

{

System.out.print(" " + M[i][ia]);

}

System.out.println(" ");

}

}

Bloco de Citação

14 Respostas

Jothar_Aleksander

Pelo NetBeans:

package visao;

/**
 *
 * @author JFSJUNIOR
 */
public class NewJFrame extends javax.swing.JFrame {
    private int m[][] = new int[4][4];
    /**
     * Creates new form NewJFrame
     */
    public NewJFrame() {
        initComponents();
        mat1();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        btnImprimir = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        btnImprimir.setText("Imprimir");
        btnImprimir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnImprimirActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(116, 116, 116)
                .addComponent(btnImprimir)
                .addContainerGap(213, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(85, 85, 85)
                .addComponent(btnImprimir)
                .addContainerGap(192, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void mat1(){
        for(int i = 0; i < 4; i++){
            for(int ia = 0; ia < 4; ia++){
                m[i][ia] = ia;
            }
        }
    }
    
    private void imprimir(){
        for(int i = 0; i < 3; i++){
            for(int ia = 0; ia < 4; ia++){
                System.out.print(m[i][ia]);
            }
            System.out.println("\n");
        }
    }
    
    private void btnImprimirActionPerformed(java.awt.event.ActionEvent evt) {                                            
        imprimir();
    }                                           

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton btnImprimir;
    // End of variables declaration                   
}

Resultado:

run:
0123

0123

0123

CONSTRUÍDO COM SUCESSO (tempo total: 5 segundos)

Não entendi a sua dificuldade. No caso tu quer fazer na mão? É isso?

M

A dificuldade é a seguinte:
Não declarei a matriz como global.
A matriz está declarada dentro da função que gera a matriz.
Porque, tenho um campo onde o usúario digita um valor e este valor corresponde ao tamanho da linha.
EXEMPLO:

Bloco de Citação

String Campo5 = textField5.getText().replaceAll("[^0-9],\s+", “”);

int X = Integer.parseInt(Campo5);

int M[][] = new int[X+1][5];

Bloco de Citação

Assim, como fazer o botão imprimir a matriz se a matriz não é global.

staroski

Passa a matriz como parâmetro para o método responsável por imprimir.

M

E como fazer o botão executar o método responsável por imprimir?

staroski

Uma variável de instância não é uma variável global.
Em Java não existem variáveis de escopo global, o que seria parecido com um escopo global em Java é declarar uma variável como static, mas esse não é o caso para o seu problema.

Perfeito, você cria a matriz em uma variável local (ou temporária), seu método pode retornar essa matriz.

Sua matriz é gerada antes de pressionar o botão, ou é gerada ao pressionar ele?
Se for gerada antes, não tem churumelas, vai ter que armazenar a referência dela em uma variável de instância.

Se ela é gerada ao pressionar o botão, você pode chamar o método que gera a matriz em seguida o método que a imprime.

Exemplo:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    int[][] matriz = gerarMatriz();
    imprimir(matriz);
}

private int[][] gerarMatriz() {
    int[][] matriz = new int[linhas][colunas]; // instancia a matriz
    /*
     * Aqui você inicializa os valores da matriz
     */
    return matriz; // retorna a matriz pra quem chamou o método
}

private void imprimir(int[][] matriz) {
    for (int[] linha : matriz) {
        for (int valor : linha) {
            System.out.print(" " + valor);
        }
        System.out.println();
    }
}
M
SIM!!

A matriz é gerada antes de pressionar o botão;

1º Gera a matriz;

2º Clica no botão;

3º Imprime a matriz.

Como fazer isso, com matriz, armazenar a referência dela em uma variável de instância?

Jothar_Aleksander

Escreva um método que gera a matriz e depois o chame no construtor da classe. Também dá para tu fazer no próprio método do botão (como @staroski indicou), antes de chamar o método de imprimir, ma é bom deixar os métodos mais enxutos, ou seja, com poucas responsabilidades.

M

Ainda não consegui:

Bloco de Citação

public class matriz extends javax.swing.JFrame {

private int matriz [][];

public matriz() {

initComponents();

gerarMatriz();

}

public int[][] gerarMatriz()

{

int matriz[][] = new int[4][4];

for(int i=1;i<=3;i++)

{

for(int ia=1;ia<=3;ia++)

{

matriz [i][ia]=(int)Math.round(Math.random() * 10);

}

}

for(int i=1;i<=3;i++)

{

for(int ia=1;ia<=3;ia++)

{

System.out.print(" " + matriz[i][ia]);

}

System.out.println(" “);

}

return matriz;

}

// Quando clicar no botão deverá repetir a impressão da matriz.

public void imprimir(int[][] matriz)

{

for(int i=1;i<=3;i++)

{

for(int ia=1;ia<=3;ia++)

{

System.out.print(” " + matriz[i][ia]);

}

System.out.println(" “);

}

System.out.println(” ");

}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

imprimir(matriz);

}

Bloco de Citação
Jothar_Aleksander

Veja abaixo:

import java.awt.Color;
import java.awt.Insets;
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.UIManager;
import javax.swing.JTextField;

public class Matriz extends JFrame{
	public Matriz(){
		setTitle("Matriz");
		definirLayout();
	}
	
	private int[][] gerarMatriz(int linha, int coluna){
		int[][] m = new int[linha][coluna];
		
		for(int i = 0; i < linha; i++){
			for(int j = 0; j < coluna; j++){
				m[i][j] = (int) Math.round(Math.random() * 10);
			}
		}
		return m;
	}
	
	private void imprimirMatriz(int[][] matrix, int l, int c){
		System.out.println("Valores informados: ");
		
		for(int i = 0; i < l; i++){
			for(int j = 0; j < c; j++){
				System.out.println("[" + i + "]" + "[" + j + "] = " + matrix[i][j]);
			}
		}
		
		System.out.println("\n\nMatriz formada: ");
		
		for(int i = 0; i < l; i++){
			for(int j = 0; j < c; j++){
				System.out.printf("%-5d", matrix[i][j]);
			}
			System.out.println("");
		}
	}
	
	private void definirLayout(){
		setLayout(new BorderLayout());
		painelCampos = new JPanel();
		painelCampos.setBackground(new Color(240, 240, 240));
		painelCampos.setLayout(new GridLayout(1, 4, 2, 2));
		
		painelBotao = new JPanel();
		painelBotao.setBackground(new Color(240, 240, 240));
		painelBotao.setLayout(new GridLayout(1, 1, 2, 2));
		
		rotuloLinha = new JLabel("Linha:");
		
		campoLinha = new JTextField();
		campoLinha.setText("0");
		
		rotuloColuna = new JLabel("Coluna:");
		
		campoColuna = new JTextField();
		campoColuna.setText("0");
		
		painelCampos.add(rotuloLinha);
		painelCampos.add(campoLinha);
		painelCampos.add(rotuloColuna);
		painelCampos.add(campoColuna);
		
		botaoImprimir = new JButton("Imprimir");
		botaoImprimir.setBackground(Color.white);
		
		painelBotao.add(botaoImprimir);
		
		add(painelCampos, BorderLayout.NORTH);
		add(painelBotao, BorderLayout.SOUTH);
		
		botaoImprimir.addActionListener(
			new ActionListener(){
				public void actionPerformed(ActionEvent evento){
					eventoBotaoImprimir(evento);
				}
			}
		);
		
	}
	
	private void eventoBotaoImprimir(ActionEvent evento){
		int valorLinha;
		int valorColuna;
		int[][] matriz;
		
		valorLinha = Integer.parseInt(campoLinha.getText());
		valorColuna = Integer.parseInt(campoColuna.getText());
		
		/*Chama o método que gera a matriz*/
		matriz = gerarMatriz(valorLinha, valorColuna);
		
		/*Chama o método que imprime a matriz*/
		imprimirMatriz(matriz, valorLinha, valorColuna);
	}
	
	public static void main(String[] args){
		try{
			for(UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()){
				if("Nimbus".equals(info.getName())){
					UIManager.setLookAndFeel(info.getClassName());
					break;
				}
			}
		}catch(Exception excp){}
		
		Matriz matriz = new Matriz();
		matriz.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		matriz.setSize(200, 100);
		matriz.setVisible(true);
		matriz.setResizable(false);
		matriz.setLocationRelativeTo(null);
	}
	
	private JPanel painelCampos;
	private JPanel painelBotao;
	private JLabel rotuloLinha;
	private JLabel rotuloColuna;
	private JButton botaoImprimir;
	private JTextField campoLinha;
	private JTextField campoColuna;
}

M

Não é bem isso que quero fazer!

Quando clicar no botão quero que imprima a mesma matriz que foi gerada.
Ou seja, eu só quero que o botão imprima a matriz.

E no metodo gerarmatriz deverá ter definido o tamanho da matriz.

No seu exemplo quando clicar no botão estará gerando uma nova matriz.

M
Solucao aceita
Prezados,

Consegui fazer alguma coisa.

1º gera matriz;

2º clico no botão;

3º reimprime a matriz gerada.

Vejam se pode melhorar o código, simplifica-lo.

Bloco de Citação

public class Matriz1 extends javax.swing.JFrame {
            public Matriz1() {
                initComponents();
                gerarMatriz();
            }
            private static int linha;
            private static int coluna;
            private static int[][] matriz; 
           
            public Matriz1(int linha, int coluna)
            {
             this.matriz = new int[linha][coluna]; 
            }
         public void gerarMatriz(){
         linha=4;
         coluna=4;
         Matriz1 matriz2= new Matriz1(linha,coluna);
         for(int i=1;i<linha;i++)
         {
          for(int ia=1;ia<coluna;ia++)
          {
           matriz[i][ia]=(int)Math.round(Math.random() * 10);
          }
         }
         System.out.println("Matriz gerada:");
         for(int i=1;i<linha;i++)
         {
          for(int ia=1;ia<coluna;ia++)
          {
           System.out.print(" " + matriz[i][ia]);
          }
          System.out.println(" ");
         }
         System.out.println(" ");
         
        }

        public void imprimir(int linha, int coluna)
        {
          System.out.println("matriz reimpresa ");  
            
         for(int i=1;i<linha;i++)
         {
          for(int ia=1;ia<coluna;ia++)
          {
           System.out.print(" " + matriz[i][ia]);
          }
          System.out.println(" ");
         }
         System.out.println(" ");
         System.out.println(" ");
        }
        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
                imprimir(linha, coluna);
            }

Bloco de Citação

staroski

Tira o static das suas variáveis.

Jothar_Aleksander

Não é bem isso que quero fazer!

Quando clicar no botão quero que imprima a mesma matriz que foi gerada.
Ou seja, eu só quero que o botão imprima a matriz.

E no metodo gerarmatriz deverá ter definido o tamanho da matriz.

No seu exemplo quando clicar no botão estará gerando uma nova matriz.

Tudo o que você disse está contemplado no exemplo que te passei. Passei o número de linhas e colunas para o método que gera a matriz:

/*Chama o método que gera a matriz*/
		matriz = gerarMatriz(valorLinha, valorColuna);

O método que imprime a matriz recebe a matriz criada pelo método que gera a matriz;
imprimirMatriz(matriz, valorLinha, valorColuna);

Não está gerando uma nova matriz (não tem um new int[][] lá). No caso, só estou informado o tipo da variável como int[][] para o retorno do método que gera a matriz:

int[][] matriz;

Mas, se tu resolveu de outro jeito, que bom!

M

Obrigado a todos pela ajuda!

Criado 25 de julho de 2019
Ultima resposta 30 de jul. de 2019
Respostas 14
Participantes 3