Fiz conforme sua dica, mas ainda continua selecionando vários itens
L
lina
Oi,
Que estranho… provavelmente esse setCellRenderer não está deixando a propriedade SINGLE_SELECTION exercer a sua função.
Comente essa linha e veja o que acontece…
Tchauzin!
L
lsmarco
Exatamente, é este renderizador que está bloqueando o SINGLE_SELECTION, mas quando eu tiro dá erro no código, pq estou usando um JList com Checkbox, vc tem algum exemplo de JList com checkbox em que eu consiga definir o SINGLE_SELECTION ou MULTIPLE?
L
lina
Oi,
Não lembro qual a fonte disso:
importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjavax.swing.border.*;publicclassEstudosextendsJFrame{JListlista;publicEstudos(){super("A classe JList");Containerc=getContentPane();c.setLayout(newFlowLayout(FlowLayout.LEFT));// Cria a JListlista=newJList();// Define o renderizador de célulaslista.setCellRenderer(newCheckBoxCellRenderer());// Define os valores da listaObject[]cbArray=newObject[4];cbArray[0]=newJCheckBox("Goiânia");cbArray[1]=newJCheckBox("Brasília");cbArray[2]=newJCheckBox("Barra do Garças");cbArray[3]=newJCheckBox("Curitiba");// Atribue os itens à listalista.setListData(cbArray);// Define a seleção única para a listalista.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);// Aqui nós permitimos que as checkboxes sejam marcadas// ou desmarcadas com a barra de espaçolista.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyCode()==KeyEvent.VK_SPACE){intindex=lista.getSelectedIndex();if(index!=-1){JCheckBoxcheckbox=(JCheckBox)lista.getModel().getElementAt(index);checkbox.setSelected(!checkbox.isSelected());repaint();}}}});// Aqui nós permitimos que as checkboxes sejam marcadas// ou desmarcadas com o mouselista.addMouseListener(newMouseAdapter(){publicvoidmousePressed(MouseEvente){intindex=lista.locationToIndex(e.getPoint());if(index!=-1){JCheckBoxcheckbox=(JCheckBox)lista.getModel().getElementAt(index);checkbox.setSelected(!checkbox.isSelected());repaint();}}});// Um botão que permite obter os itens marcadosJButtonbtn=newJButton("Obter itens marcados");btn.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){Stringitens="";for(inti=0;i<lista.getModel().getSize();i++){JCheckBoxcheckbox=(JCheckBox)lista.getModel().getElementAt(i);if(checkbox.isSelected())itens+="Item com índice "+i+" está marcado\n";elseitens+="Item com índice "+i+" está desmarcado\n";}JOptionPane.showMessageDialog(null,itens);}});// Adiciona a lista à janelac.add(newJScrollPane(lista));// Adiciona o botão à janelac.add(btn);setSize(350,250);setVisible(true);}publicstaticvoidmain(Stringargs[]){Estudosapp=newEstudos();app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}// Classe personalizada que permite que os itens// da lista sejam exibidos como JCheckBoxesclassCheckBoxCellRendererimplementsListCellRenderer{BordernoFocusBorder=newEmptyBorder(1,1,1,1);publicComponentgetListCellRendererComponent(JListlist,Objectvalue,intindex,booleanisSelected,booleancellHasFocus){JCheckBoxcheckbox=(JCheckBox)value;checkbox.setBackground(isSelected?list.getSelectionBackground():list.getBackground());checkbox.setForeground(isSelected?list.getSelectionForeground():list.getForeground());checkbox.setEnabled(list.isEnabled());checkbox.setFont(list.getFont());checkbox.setFocusPainted(false);checkbox.setBorderPainted(true);checkbox.setBorder(isSelected?UIManager.getBorder("List.focusCellHighlightBorder"):noFocusBorder);returncheckbox;}}
Mande rodar...
Tchauzin!
L
lsmarco
Foi exatamente deste exemplo que estou utilizando, execute e verá que a linha que SETA a seleção para SINGLE_SELECTION não funciona, o programa seleciona todas as opções.
L
lina
lsmarco:
Foi exatamente deste exemplo que estou utilizando, execute e verá que a linha que SETA a seleção para SINGLE_SELECTION não funciona, o programa seleciona todas as opções.
Oi,
A tá! Só agora que fui entender o que você queria. Então, o SINGLE_SELECTION não controla os checkbox marcados. E sim a quantidade de linha selecionada na lista.
Então você deverá fazer algo do tipo:
// Aqui nós permitimos que as checkboxes sejam marcadas// ou desmarcadas com o mouselista.addMouseListener(newMouseAdapter(){publicvoidmousePressed(MouseEvente){intindex=lista.locationToIndex(e.getPoint());if(index!=-1){booleantem_marcado=false;for(inti=0;i<lista.getModel().getSize()&&!tem_marcado;i++){JCheckBoxcheckbox=(JCheckBox)lista.getModel().getElementAt(i);tem_marcado=checkbox.isSelected();}if(!tem_marcado){JCheckBoxcheckbox=(JCheckBox)lista.getModel().getElementAt(index);checkbox.setSelected(!checkbox.isSelected());}repaint();}}});
Alteração no exemplo completo:
importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjavax.swing.border.*;publicclassEstudosextendsJFrame{JListlista;publicEstudos(){super("A classe JList");Containerc=getContentPane();c.setLayout(newFlowLayout(FlowLayout.LEFT));// Cria a JListlista=newJList();// Define o renderizador de célulaslista.setCellRenderer(newCheckBoxCellRenderer());// Define os valores da listaObject[]cbArray=newObject[4];cbArray[0]=newJCheckBox("Goiânia");cbArray[1]=newJCheckBox("Brasília");cbArray[2]=newJCheckBox("Barra do Garças");cbArray[3]=newJCheckBox("Curitiba");// Atribue os itens à listalista.setListData(cbArray);// Define a seleção única para a listalista.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);// Aqui nós permitimos que as checkboxes sejam marcadas// ou desmarcadas com a barra de espaçolista.addKeyListener(newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyCode()==KeyEvent.VK_SPACE){intindex=lista.getSelectedIndex();if(index!=-1){JCheckBoxcheckbox=(JCheckBox)lista.getModel().getElementAt(index);checkbox.setSelected(!checkbox.isSelected());repaint();}}}});// Aqui nós permitimos que as checkboxes sejam marcadas// ou desmarcadas com o mouselista.addMouseListener(newMouseAdapter(){publicvoidmousePressed(MouseEvente){intindex=lista.locationToIndex(e.getPoint());if(index!=-1){booleantem_marcado=false;for(inti=0;i<lista.getModel().getSize()&&!tem_marcado;i++){JCheckBoxcheckbox=(JCheckBox)lista.getModel().getElementAt(i);tem_marcado=checkbox.isSelected();}if(!tem_marcado){JCheckBoxcheckbox=(JCheckBox)lista.getModel().getElementAt(index);checkbox.setSelected(!checkbox.isSelected());}repaint();}}});// Um botão que permite obter os itens marcadosJButtonbtn=newJButton("Obter itens marcados");btn.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){Stringitens="";for(inti=0;i<lista.getModel().getSize();i++){JCheckBoxcheckbox=(JCheckBox)lista.getModel().getElementAt(i);if(checkbox.isSelected())itens+="Item com índice "+i+" está marcado\n";elseitens+="Item com índice "+i+" está desmarcado\n";}JOptionPane.showMessageDialog(null,itens);}});// Adiciona a lista à janelac.add(newJScrollPane(lista));// Adiciona o botão à janelac.add(btn);setSize(350,250);setVisible(true);}publicstaticvoidmain(Stringargs[]){Estudosapp=newEstudos();app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}// Classe personalizada que permite que os itens// da lista sejam exibidos como JCheckBoxesclassCheckBoxCellRendererimplementsListCellRenderer{BordernoFocusBorder=newEmptyBorder(1,1,1,1);publicComponentgetListCellRendererComponent(JListlist,Objectvalue,intindex,booleanisSelected,booleancellHasFocus){JCheckBoxcheckbox=(JCheckBox)value;checkbox.setBackground(isSelected?list.getSelectionBackground():list.getBackground());checkbox.setForeground(isSelected?list.getSelectionForeground():list.getForeground());checkbox.setEnabled(list.isEnabled());checkbox.setFont(list.getFont());checkbox.setFocusPainted(false);checkbox.setBorderPainted(true);checkbox.setBorder(isSelected?UIManager.getBorder("List.focusCellHighlightBorder"):noFocusBorder);returncheckbox;}}
Tchauzin!
L
lsmarco
Perfeito lina,
Isso mesmo, agora ele seleciona penas um item, apesar de não tirar a selecao se quiser, ele seleciona e fica, mas não quero ficar te azucrinando.
Se não se zangar peço humildemente como iniciante, agora que a multipla seleção foi resolvida, existe uma forma de eu poder informar:
Quando posso deixar multipla selecao e quando posso deixar unica selecao e no caso da multipla selecao eu poder definir serão no maximo 3 selecoes por exemplo?
Sei que o objetivo aqui não é dar o peixe e sim ensinar a pescar, eu programo em outras linguagens procedurais ultrapassadas e estou vendo quanto tempo perdi em não ter conhecido java antes e este exemplo se ficar resolvido da forma que estou pedindo vai me ajudar muito, pq em quase todos o programas que precisarei fazer terei que ter este controle de:
SIMPLES SELECAO, MULTIPLA SELECAO (ESCOLHER QUANTAS SELECOES).
Muito obrigado.
L
lina
Oi,
lsmarco:
Perfeito lina,
Isso mesmo, agora ele seleciona penas um item, apesar de não tirar a selecao se quiser, ele seleciona e fica, mas não quero ficar te azucrinando.
O restante deve-se pensar em colocar uma legenda acima da lista,
indicando a quantidade maxima que o usuário poderá selecionar.
A partir dai, é um simples controle com variaveis inteiras..
Tchauzin!
L
lsmarco
Perfelito Lina,
Obrigado por compartilhar seu conhecimento, sei quanto isso é importante, e pretendo pode ajudar também quando adquirir experiência.
Só pra finalizar:
Neste nosso exemplo você teve que implementar uma forma de fazer a seleção simples funcionar ao invés de utilizar o set.SINGLE_SELECTION, então acredito que também não poderei RENOVAR os items simplesmente com um comando do tipo:
listaElementos.setModel(array novos elementos);
Pra esclarecer melhor, estou fazendo esta última pergunta deste caso pelo seguinte:
Pretendo desenvolver um software que mostre um questionario na tela, sendo que cada pergunta quando eu apertar por exemplo um botão “PROXIMA PERGUNTA” ele teria que renovar os elementos.
desde já agradeço.
L
lina
lsmarco:
Perfelito Lina,
Obrigado por compartilhar seu conhecimento, sei quanto isso é importante, e pretendo pode ajudar também quando adquirir experiência.
Só pra finalizar:
Neste nosso exemplo você teve que implementar uma forma de fazer a seleção simples funcionar ao invés de utilizar o set.SINGLE_SELECTION, então acredito que também não poderei RENOVAR os items simplesmente com um comando do tipo:
listaElementos.setModel(array novos elementos);
Pra esclarecer melhor, estou fazendo esta última pergunta deste caso pelo seguinte:
Pretendo desenvolver um software que mostre um questionario na tela, sendo que cada pergunta quando eu apertar por exemplo um botão “PROXIMA PERGUNTA” ele teria que renovar os elementos.
desde já agradeço.
Oi,
Realmente… Se for dessa maneira teria que usar varias JList e para cada uma delas implementar o mouseListener.
No caso, teriamos que pensar em uma outra solução. Ou melhor, uma solução mais adequada para a sua situação (Analise de Projeto Orientado a Objeto).
Vou tentar pensar em algo, depois postarei…
Tchauzin!
L
lsmarco
Ok lina,
Ficarei no aguardo, e mais uma vez Obrigado!
L
lina
Oi,
Tenho uma solução.
Você cria uma variavel "global" dessa forma:
MouseListener
io_mouse_list_event = null;
Na ação do seu botão , você implementa o seu MouseListener para cada situação:
Actionio_ie_proximo=newAbstractAction(){publicvoidactionPerformed(ActionEventevt){intindex=lista.locationToIndex(e.getPoint());// Claro nesse ponto vc já sabe se a lista vai poder selecionar 1 ou mais itens. if(selection==1){if(index!=-1){booleantem_marcado=false;intindex_selecionado=0;for(inti=0;i<lista.getModel().getSize()&&!tem_marcado;i++){JCheckBoxcheckbox=(JCheckBox)lista.getModel().getElementAt(i);tem_marcado=checkbox.isSelected();index_selecionado=i;}if(!tem_marcado||tem_marcado&&index_selecionado==index){JCheckBoxcheckbox=(JCheckBox)lista.getModel().getElementAt(index);checkbox.setSelected(!checkbox.isSelected());}}}elseif(selection==3){// FAZ A OUTRA ACAO.}}};
E depois adiciona esse vento na sua lista:
lista.addMouseListener(io_mouse_list_event);
Tchauzin!
L
lsmarco
Hum. Ok, vou seguir sua instrução. Obrigado mesmo.
L
lsmarco
Isso resolve a alternancia entre eu poder ter uma pergunta que selecione uma resposta e outra pergunta que selecione mais de uma resposta. blz, agora só tem a questão da mudança dos elementos, estou tentando fazer ele trocar os elementos neste codigo, já consegui num outro com um JList normal se checkboxes usando o SetModel, mas neste exemplo que estamos utilizando náo funciona.
Resolvido, fiz umas modificações e já está acontecendo da forma que eu queria, apenas alguns detalhes agora que preciso implementar.
Valeu!!!
L
lsmarco
Olá Lina ou alguém on-line que possa ajudar,
Já consegui atualizar a lista conforme passar de uma pergunta pra outra, agora só está faltando uma última coisa que não consegui resolver pela minha inexperiência.
Você fez umas modificações no código abaixo que permite que eu marque/desmarque apenas uma opção, exatamente como eu queria, mas eu precisaria também optar em selecionar apenas uma opção ou mais sendo que estas “mais de uma” eu pudesse limitar, tipo apenas 6 podem ser escolhidas.
Sua instrução foi que eu criasse variáveis simples de controle, mas não consegui, se você ou alguém por gentiliza pudesse me mostrar como fazer isso, mais uma vez ficarei grato.
Sem querer justificar, mas sim explicar, o principal motivo que reabri um tópico que na verdade não reabri e sim coloquei em dois índices do fórum, mas como o Vini orientou isso causa problemas para ambas as partes e concordo com ele.
Mas voltando, é que como esse tópico ficou um pouco confuso porque foram resolvidas várias situações, achei que talvez abrindo um outro fosse melhor, mas pra entender o contexto da situação concordo com o Vini, realmente é melhor continuar este.
Gostaria apenas de reacender esta minha última solicitação que está na resposta anterior que foi é a última situação que preciso pra resolver de vez meu problema neste caso.