bom dia!
Sou iniciante em java e a cada hora descubro novas melhoras para meu codigo.
Agora encontrei um problema que nao consigo sanar:
Como pegar a descriçao de um Item do JList (contem endereço de uma imagem essa descricao) e fazer a imagem aparecer no JLabel.?
Fiz o codigo dentro de um MouseClicked, mas não fui feliz.
Ola, veja bem voce tem que usar os GET E SET do encapsulamento, ou seja, se o valor de uma variavel for do tipo texto.
label.setText() = list.getText();
obs: “label” e “list” é a sua variavel.
espero ter ajudado!
E
entanglement
Usualmente métodos de tratamento de mouse não funcionam bem com os componentes do Swing.
Evite-os porque normalmente não dão o resultado esperado.
No seu caso, por exemplo, o método correto a ser usado é um List Selection Listener, método valueChanged. Um exemplo:
packageguj;importjava.awt.BorderLayout;importjava.awt.FlowLayout;importjava.awt.event.KeyEvent;importjavax.swing.Action;importjavax.swing.DefaultListModel;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JList;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.KeyStroke;importjavax.swing.ListSelectionModel;importjavax.swing.SwingUtilities;importjavax.swing.event.ListSelectionEvent;importjavax.swing.event.ListSelectionListener;publicclassExemploJList2extendsJFrame{privatestaticfinallongserialVersionUID=1L;publicstaticvoidmain(String[]args){// TODO Auto-generated method stubSwingUtilities.invokeLater(newRunnable(){publicvoidrun(){ExemploJList2thisClass=newExemploJList2();thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);thisClass.setVisible(true);}});}privateJButtonbtnOK=null;privateJPaneljContentPane=null;privateDefaultListModellistModel;privateJListlstList=null;privateJPanelpnlBotoes=null;privateJScrollPanescpList=null;privateJLabellblTextoSelecionado;publicExemploJList2(){super();initialize();}privateJButtongetBtnOK(){if(btnOK==null){btnOK=newJButton();btnOK.setText("OK");}returnbtnOK;}privateJPanelgetJContentPane(){if(jContentPane==null){jContentPane=newJPanel();jContentPane.setLayout(newBorderLayout());jContentPane.add(getScpList(),BorderLayout.CENTER);jContentPane.add(getPnlBotoes(),BorderLayout.SOUTH);jContentPane.add(getLblTextoSelecionado(),BorderLayout.NORTH);}returnjContentPane;}privateDefaultListModelgetListModel(){if(listModel==null){listModel=newDefaultListModel();for(inti=0;i<100;++i){listModel.addElement(String.format("Elemento %02d",i));}}returnlistModel;}privateJListgetLstList(){if(lstList==null){lstList=newJList();// É em um ListSelectionListener (não em um MouseListener)// que você pega eventos de escolha de itens do JListlstList.addListSelectionListener(newListSelectionListener(){publicvoidvalueChanged(ListSelectionEvente){// Note que "e.getValueIsAdjusting" e "lstList.getSelectedValue() != null" abaixo// não são enfeite: se você não tratar essa condição, você vai tomar um NullPointerExceptionif(!e.getValueIsAdjusting()&&lstList.getSelectedValue()!=null){Stringtext=lstList.getSelectedValue().toString();getLblTextoSelecionado().setText("Elemento selecionado: "+text);}}});lstList.setModel(getListModel());lstList.setFocusCycleRoot(true);lstList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);lstList.setSelectedIndex(0);// Como exemplo, fiz com que as teclas q e w funcionem como Up e// Down, respectivamente.lstList.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_Q,0),"up");lstList.getActionMap().put("up",(Action)lstList.getActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_KP_UP,0)));lstList.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_W,0),"down");lstList.getActionMap().put("down",(Action)lstList.getActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_KP_DOWN,0)));}returnlstList;}privateJPanelgetPnlBotoes(){if(pnlBotoes==null){pnlBotoes=newJPanel();pnlBotoes.setLayout(newFlowLayout());pnlBotoes.add(getBtnOK(),null);}returnpnlBotoes;}privateJScrollPanegetScpList(){if(scpList==null){scpList=newJScrollPane();scpList.setViewportView(getLstList());}returnscpList;}privatevoidinitialize(){this.setSize(320,234);this.setContentPane(getJContentPane());this.setTitle("Exemplo de JList");}privateJLabelgetLblTextoSelecionado(){if(lblTextoSelecionado==null){lblTextoSelecionado=newJLabel("Clique em um item do JLabel");}returnlblTextoSelecionado;}}
V
veronicaveronica
Boa tarde e obrigada pelas dicas pessoal.
Seguinte tentei usar a dica anterior, mas nao apareceu a imagem no JLabel mesmo assim. Alguém pode me informar o que eu fiz de errado?
Segue o codigo:
privatevoidimagMostrar(){jList1.addListSelectionListener(newListSelectionListener(){publicvoidvalueChanged(ListSelectionEvente){if(!e.getValueIsAdjusting()&&jList1.getSelectedValue()!=null){Stringpath=(jList1.getSelectedValue().toString());// jLabel3.setText(jList1.getSelectedValue().toString());System.out.println("aquiii= "+path);//String aux = file.getPath();ImageIconimg=newImageIcon(path);JLabeljLabel3=newJLabel(img);//jLabel3.setText(path);jLabel3.setVisible(true);}}});}
Vossa Excelência criou um JLabel e o associou a algum container? Senão ele não será visualizado. Não adianta dar um setVisible (true) nesse caso - isso se chama “magia”, ou seja, fazer algo sem saber para que serve.
E
entanglement
Além disso, o lugar onde você adicionou o “listener” aparentemente está errado, já que o nome do método que você usou é “imagMostrar”.
V
veronicaveronica
Brigada pela dica, mas a excelência aqui criou sim o Label direitinho (acho…) tô usando NetBeans e apenas arrastei e comecei a usar o JLabel.
Não entendi porque estaria errado meu método de Mostrar Imagem no Label =s
Tô quase la…
Obrigada pela ajuda,
veronica!
lucasportela
Faltou posicionar seu label para aparecer algum lugar da tela, talvez também precise setar o tamanho do label para que ele apareça…
E
entanglement
Hum… maldito NetBeans
De qualquer maneira, voce ja deve ter um JLabel criado e posicionado no local adequado, nao?
Para mudar a imagem dele, voce tem de fazer algo parecido com:
jlabel.setIcon(img);
onde jlabel é o jlabel que o NetBeans criou e você posicionou na tela.
Se você ficar instanciando um novo JLabel, como você fez, ele não vai ficar associado a nenhum local na tela, portanto ele ficará invisível
E
entanglement
Eu realmente não gosto de usar o NetBeans para desenhar telas.
Um dos principais motivos é que fica o tal do “código preso” que ele gera, e que não é fácil de customizar (é possível fazer isso, mas é preciso conhecer bem o que o NetBeans faz, além de conhecer o Swing).
O outro é que o layout padrão (javax.swing.GroupLayout) é terrível para desenhar telas que precisem de ser bem organizadas. Talvez seja bom para uma prova de conceito
Prefiro usar o WindowBuilder do Eclipse (que aliás foi o que usei para montar o exemplo que postei) e o layout MigLayout (não o uso muito para dar exemplos aqui no GUJ porque aí você tem o problema de rodar seu programa, já que é um JAR separado que não vem com o JDK e como eu sei muito bem, o pessoal aqui no GUJ tem muitos problemas de rodar um programa que exija um JAR separado
lucasportela
entanglement:
Eu realmente não gosto de usar o NetBeans para desenhar telas.
Um dos principais motivos é que fica o tal do “código preso” que ele gera, e que não é fácil de customizar (é possível fazer isso, mas é preciso conhecer bem o que o NetBeans faz, além de conhecer o Swing).
O outro é que o layout padrão (javax.swing.GroupLayout) é terrível para desenhar telas que precisem de ser bem organizadas. Talvez seja bom para uma prova de conceito
Prefiro usar o WindowBuilder do Eclipse (que aliás foi o que usei para montar o exemplo que postei) e o layout MigLayout (não o uso muito para dar exemplos aqui no GUJ porque aí você tem o problema de rodar seu programa, já que é um JAR separado que não vem com o JDK e como eu sei muito bem, o pessoal aqui no GUJ tem muitos problemas de rodar um programa que exija um JAR separado
Já passei muita raiva também, mas foi com elas que aprendi e percebi que provavelmente o erro da colega é esse
V
veronicaveronica
Bom dia amigos…
Ainda nao consegui um bom resultado.
É tao complicado pegar um Item do JList (que é o endereço de uma imagem) e apresentar a imagem no JLabel?
Alguém me sugere outra coisa mais facil???
OBRIGADA,
veronica!
V
veronicaveronica
CONSEGUI GALERA!!! =D
No NetBeans adicionei o evento jList1ValueChanged e dentro dele coloquei meu método para aparecer a imagem de figura no Label.
Retirei a linha para construir um novo objeto: JLabel jLabel3 = new JLabel(img); e funcionou! Alguém me explica porque quando tirei ela o método funcionou.
Voce estava criando um novo objeto, sendo que não era isso sua real intenção.
criando um novo objeto voce nao herdou a “imagem” do objeto já criado , voce criava um objeto vazio e voce mandava mostrar no label um label VAZIO.
M
mctheus
entanglement:
Usualmente métodos de tratamento de mouse não funcionam bem com os componentes do Swing.
Evite-os porque normalmente não dão o resultado esperado.
No seu caso, por exemplo, o método correto a ser usado é um List Selection Listener, método valueChanged. Um exemplo:
packageguj;importjava.awt.BorderLayout;importjava.awt.FlowLayout;importjava.awt.event.KeyEvent;importjavax.swing.Action;importjavax.swing.DefaultListModel;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JList;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.KeyStroke;importjavax.swing.ListSelectionModel;importjavax.swing.SwingUtilities;importjavax.swing.event.ListSelectionEvent;importjavax.swing.event.ListSelectionListener;publicclassExemploJList2extendsJFrame{privatestaticfinallongserialVersionUID=1L;publicstaticvoidmain(String[]args){// TODO Auto-generated method stubSwingUtilities.invokeLater(newRunnable(){publicvoidrun(){ExemploJList2thisClass=newExemploJList2();thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);thisClass.setVisible(true);}});}privateJButtonbtnOK=null;privateJPaneljContentPane=null;privateDefaultListModellistModel;privateJListlstList=null;privateJPanelpnlBotoes=null;privateJScrollPanescpList=null;privateJLabellblTextoSelecionado;publicExemploJList2(){super();initialize();}privateJButtongetBtnOK(){if(btnOK==null){btnOK=newJButton();btnOK.setText("OK");}returnbtnOK;}privateJPanelgetJContentPane(){if(jContentPane==null){jContentPane=newJPanel();jContentPane.setLayout(newBorderLayout());jContentPane.add(getScpList(),BorderLayout.CENTER);jContentPane.add(getPnlBotoes(),BorderLayout.SOUTH);jContentPane.add(getLblTextoSelecionado(),BorderLayout.NORTH);}returnjContentPane;}privateDefaultListModelgetListModel(){if(listModel==null){listModel=newDefaultListModel();for(inti=0;i<100;++i){listModel.addElement(String.format("Elemento %02d",i));}}returnlistModel;}privateJListgetLstList(){if(lstList==null){lstList=newJList();// É em um ListSelectionListener (não em um MouseListener)// que você pega eventos de escolha de itens do JListlstList.addListSelectionListener(newListSelectionListener(){publicvoidvalueChanged(ListSelectionEvente){// Note que "e.getValueIsAdjusting" e "lstList.getSelectedValue() != null" abaixo// não são enfeite: se você não tratar essa condição, você vai tomar um NullPointerExceptionif(!e.getValueIsAdjusting()&&lstList.getSelectedValue()!=null){Stringtext=lstList.getSelectedValue().toString();getLblTextoSelecionado().setText("Elemento selecionado: "+text);}}});lstList.setModel(getListModel());lstList.setFocusCycleRoot(true);lstList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);lstList.setSelectedIndex(0);// Como exemplo, fiz com que as teclas q e w funcionem como Up e// Down, respectivamente.lstList.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_Q,0),"up");lstList.getActionMap().put("up",(Action)lstList.getActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_KP_UP,0)));lstList.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_W,0),"down");lstList.getActionMap().put("down",(Action)lstList.getActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_KP_DOWN,0)));}returnlstList;}privateJPanelgetPnlBotoes(){if(pnlBotoes==null){pnlBotoes=newJPanel();pnlBotoes.setLayout(newFlowLayout());pnlBotoes.add(getBtnOK(),null);}returnpnlBotoes;}privateJScrollPanegetScpList(){if(scpList==null){scpList=newJScrollPane();scpList.setViewportView(getLstList());}returnscpList;}privatevoidinitialize(){this.setSize(320,234);this.setContentPane(getJContentPane());this.setTitle("Exemplo de JList");}privateJLabelgetLblTextoSelecionado(){if(lblTextoSelecionado==null){lblTextoSelecionado=newJLabel("Clique em um item do JLabel");}returnlblTextoSelecionado;}}