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
for(inti=0;i<20;i++){lbDica[i][1].addMouseListener(newMouseListener(){publicvoidmouseClicked(MouseEvente){dicas[i]=JOptionPane.showInputDialog(framePai,"Digite a dica : ");}...});}
Este não pode ser o melhor método, mas espero que ajude!
Vlw!
S
star45
É isso mesmo, funcionou, esta atribuindo o evento aos JLabels....
vlw Rummenigge ...
Este é o meu metodo:
privateJLabelgetlbDica(intr,intc){if(lbDica[r][c]==null){lbDica[r][c]=newJLabel();lbDica[r][c].setText("Dica ");lbDica[r][c].addMouseListener((MouseListener)newMouseListener(){publicvoidmouseClicked(MouseEvente){dicas[r]=JOptionPane.showInputDialog(null,"Digite a Dica :");pnlLabels.add(getlbDica(r,c),null);}publicvoidmousePressed(MouseEvente){}publicvoidmouseReleased(MouseEvente){}publicvoidmouseEntered(MouseEvente){}publicvoidmouseExited(MouseEvente){}});}returnlbDica[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
Rummenigge
/*Não precisa passar como parâmetro a coluna, já que a matriz de Jlabel's tem apenas uma.*/1.privateJLabelgetlbDica(intr){2.if(lbDica[r][1]==null){3.lbDica[r][1]=newJLabel();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(newMouseListener(){7.8.publicvoidmouseClicked(MouseEvente){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.publicvoidmousePressed(MouseEvente){15.}16.17.publicvoidmouseReleased(MouseEvente){18.}19.20.publicvoidmouseEntered(MouseEvente){21.}22.23.publicvoidmouseExited(MouseEvente){24.}25.});26.27.}28.returnlbDica[r][1];29.}
Tente fazer assim :
for(inti=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
S
star45
Este é o metodo q adiciona os lbDica no Painel
privateJPanelgtPnlLabels(){
if(pnlLabels==null){
GridLayoutgridLayout=newGridLayout();gridLayout.setRows(20);gridLayout.setColumns(1);gridLayout.setHgap(1);gridLayout.setVgap(1);pnlLabels=newJPanel();pnlLabels.setLayout(gridLayout);for(intr=0; r < 20; r++) {pnlLabels.add(getlbDica(r),null);}
}
returnpnlLabels;}
S
star45
Infelizmente o problema com o Vetor permanece:
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).
Rummenigge
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);