GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Evento mouseClicked


#1

Tenho uma matriz de JTextField, uma matriz de JLabel, e um vetor de String

 private JTextField[][] txtFields = new JTextField[20][30];
          private JLabel[][] lbDica = new JLabel[20][1];
          private String[] dicas = new String[20];

O meu problema consiste criar um evento de clique de mouse para 1 destes JLabels criados
haja visto que foram criados por codigo;

O que pretendo fazer é o seguinte: preencher o Vetor String[] dicas ( Usando o JOptionPane.ShowInputDialog disparado pelo clique em um JLabel)
Sendo que o Indice do Vetor String[]dicas deve Coincidir com o Indice de Coluna da Matriz de JLabel

Agradeço se puderem me ajudar!




#2

    for (int i = 0; i < 20; i++) {
        lbDica[i][1].addMouseListener(new MouseListener() {
            public void mouseClicked(MouseEvent e) {
                dicas[i] = JOptionPane.showInputDialog(framePai, "Digite a dica : ");
            }
            ...
        });
    }

Este não pode ser o melhor método, mas espero que ajude!

Vlw!


#3

É isso mesmo, funcionou, esta atribuindo o evento aos JLabels....

vlw Rummenigge ...

Este é o meu metodo:

  private JLabel getlbDica(int r, int c) {
        if (lbDica[r][c] == null) {
            lbDica[r][c] = new JLabel();
            lbDica[r][c].setText("Dica  ");
            lbDica[r][c].addMouseListener((MouseListener) new MouseListener() {
                public void mouseClicked(MouseEvent e) {
                    dicas[r] = JOptionPane.showInputDialog(null, "Digite a Dica :");
                    pnlLabels.add(getlbDica(r, c), null);
                }
                public void mousePressed(MouseEvent e) {
                }
                public void mouseReleased(MouseEvent e) {
                }
                public void mouseEntered(MouseEvent e) {
                }
                public void mouseExited(MouseEvent e) {
                }
            });
        }
        return lbDica[r][c];
    }

Porem pede para tornar final os meus indices : r, c

 dicas[r] = JOptionPane.showInputDialog(null, "Digite a Dica :");
            pnlLabels.add(getlbDica(r, c), null);

O problema consiste em que estes indices nao podem ser final,
se tornar final, da estouro no meu Vetor:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 20

#4

   /*Não precisa passar como parâmetro a coluna, já que a matriz de Jlabel's tem apenas uma.*/
   1. private JLabel getlbDica(int r) {  
   2.       if (lbDica[r][1] == null) {  
   3.           lbDica[r][1] = new JLabel();  
   4.           lbDica[r][1].setText("Dica  ");  
   5.           /*Não precisa forçar a converção do Mouselistener, o método addMouseListener() já aceita um como parâmetro.*/
   6.           lbDica[r][1].addMouseListener(new MouseListener() {  
   7.   
   8.               public void mouseClicked(MouseEvent e) {  
   9.                   dicas[r] = JOptionPane.showInputDialog(null, "Digite a Dica :");  
  10.                   /*Esta linha de código não deveria estar aqui, já que você está tentando adicionar os labels em um painel.*/
                         //pnlLabels.add(lbDica[r][1], null);  
  11.   
  12.               }  
  13.   
  14.               public void mousePressed(MouseEvent e) {  
  15.               }  
  16.   
  17.               public void mouseReleased(MouseEvent e) {  
  18.               }  
  19.   
  20.               public void mouseEntered(MouseEvent e) {  
  21.               }  
  22.   
  23.               public void mouseExited(MouseEvent e) {  
  24.               }  
  25.           });  
  26.   
  27.       }  
  28.       return lbDica[r][1];  
  29.   }

Tente fazer assim :

   for (int i = 0; i < 20; i++) {
       /*Chamará o método getlbDica() passando como parâmetro o índice [b]i[/b], ele criará um JLabel, colocará um MouseListener no mesmo, irá retorná-lo e depois o adicionará no painél que você criou*/
       pnlLabels.add(getlbDica(i), null);
       /*Espero que este painél "plnLabels" tenha um BoxLayout com PAGE_AXIS*/
   }

Espero que tenha ajudado!

VLW


#5

Este é o metodo q adiciona os lbDica no Painel

private JPanel gtPnlLabels() {
        if (pnlLabels == null) {
            GridLayout gridLayout = new GridLayout();
            gridLayout.setRows(20);
            gridLayout.setColumns(1);
            gridLayout.setHgap(1);
            gridLayout.setVgap(1);
            pnlLabels = new JPanel();
            pnlLabels.setLayout(gridLayout);
            for (int r = 0; r < 20; r++) {
                 pnlLabels.add(getlbDica(r), null);
             }
        }
        return pnlLabels;
    }

#6

Infelizmente o problema com o Vetor permanece:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1

OBS: Nao estou habituado a programar desta maneira (criando td por codigo),
utilizo mais a parte grafica mesmo(arrastar componentes).
Mas neste caso em especifico de maneira alguma é viavel (arrastar componentes).


#7

Faça com que sua matriz JLabel seja um vetor

private JLabel[] lbDica = new JLabel[20];

e tente utilizar o BoxLayout no pnlLabels

BoxLayout box = new Boxlayout(pnlLabels, BoxLayout.PAGE_AXIS);
pnlLabels.setlayout(box);

#8