Tenho uma JList que armazena diversos objetos dentro dela. Cada linha da list possue um objeto, e a string que aparece na linha é o nome do objeto.
Quero setar um tooltip para cada linha da jlist, passando o diretório do objeto que esta na linha.
Hoje estou fazendo assim:
String directory = fileChooser.getSelectedFile().getPath();
listLogs.setToolTipText(directory);
mas com isso, se eu adicionar dois arquivos a minha jlist, o tooltip ira mostrar apenas o diretorio de um dos arquivos, pois esta setado para a jlist como um todo, e nao para cada linha (objeto).
package guj;
import java.awt.event.MouseEvent;
import javax.swing.JList;
import javax.swing.ListModel;
public class JListComTooltip extends JList {
public JListComTooltip() {
// TODO Auto-generated constructor stub
}
public JListComTooltip(ListModel dataModel) {
super(dataModel);
}
@Override
public String getToolTipText(MouseEvent event) {
int index = this.locationToIndex(event.getPoint());
if (index != -1) {
Object obj = getModel().getElementAt(index);
if (obj instanceof WithTooltip) {
return ((WithTooltip) obj).getTooltipText();
} else {
return super.getToolTipText(event);
}
} else {
return super.getToolTipText(event);
}
}
}
package guj;
import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
interface WithTooltip {
String getTooltipText();
}
class Produto implements WithTooltip {
public Produto(final String nome, final int id, final String descricao) {
this.nome = nome;
this.id = id;
this.descricao = descricao;
}
private String nome;
private int id;
private String descricao;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
@Override
public String toString() {
return nome;
}
@Override
public String getTooltipText() {
return descricao;
}
}
public class ExemploJListComTooltip extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JScrollPane scpList = null;
private JListComTooltip lstExemplo = null;
/**
* This method initializes scpList
*
* @return javax.swing.JScrollPane
*/
private JScrollPane getScpList() {
if (scpList == null) {
scpList = new JScrollPane();
scpList.setViewportView(getLstExemplo());
}
return scpList;
}
private JListComTooltip getLstExemplo() {
if (lstExemplo == null) {
lstExemplo = new JListComTooltip();
lstExemplo.setModel (listModel);
for (Produto produto : produtos)
listModel.addElement(produto);
}
return lstExemplo;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ExemploJListComTooltip thisClass = new ExemploJListComTooltip();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
});
}
public ExemploJListComTooltip() {
super();
initialize();
}
private void initialize() {
produtos.add(new Produto ("MacBook", 100, "MacBook Pro 13\" Early 2011"));
produtos.add(new Produto ("PlayStation", 200, "Sony PlayStation Vita"));
produtos.add(new Produto ("Wii U", 300, "Nintendo Wii U"));
this.setSize(300, 200);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
}
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getScpList(), BorderLayout.CENTER);
}
return jContentPane;
}
private List<Produto> produtos = new ArrayList<Produto>();
private DefaultListModel listModel = new DefaultListModel();
}