Ich hab das Problem schon seit einiger Zeit, ist auch nichts wichtiges aber es wundert mich:
Wenn ein Datenobjekt habe, z.B class Person und mir dafür einen CellRenderer schreibe kann ich nicht per setDefaultRenderer ein automatisches Mapping machen. Ich muss immer explizit die Spalte angeben, die ich Rendern möchte. Der einzige Parameter der eine Auswirkung hat, ist Object.class (und das ist ja nun nicht sehr sinnvoll).
KSKB:
Wenn ein Datenobjekt habe, z.B class Person und mir dafür einen CellRenderer schreibe kann ich nicht per setDefaultRenderer ein automatisches Mapping machen. Ich muss immer explizit die Spalte angeben, die ich Rendern möchte. Der einzige Parameter der eine Auswirkung hat, ist Object.class (und das ist ja nun nicht sehr sinnvoll).
KSKB:
Java:
import java.awt.BorderLayout;
public class RendererProblem extends JFrame
{
class Person
{
String vorname,nachname;
Person(String vn,String nn)
{
vorname=vn;
nachname=nn;
}
public String getVorname()
{
return vorname;
}
public void setVorname(String vorname)
{
this.vorname = vorname;
}
public String getNachname()
{
return nachname;
}
public void setNachname(String nachname)
{
this.nachname = nachname;
}
}
class MyPersonRenderer extends JLabel implements TableCellRenderer
{
JLabel lbl=new JLabel();
@Override
public Component getTableCellRendererComponent(JTable arg0, Object value, boolean arg2, boolean arg3, int arg4,
int arg5)
{
if(value instanceof Person)
{
Person p=(Person)value;
this.setText(p.getVorname());
return this;
}
else
{
this.setText(value.toString());
return this;
}
}
}
private JPanel contentPane;
private JTable table;
/**
* Launch the application.
*/
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
RendererProblem frame = new RendererProblem();
frame.setVisible(true);
} catch (Exception e)
{
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public RendererProblem()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JScrollPane scrollPane = new JScrollPane();
contentPane.add(scrollPane, BorderLayout.CENTER);
table = new JTable();
table.setModel(new DefaultTableModel(
new Object[][] {
{1, new Person("Sepp","Maier")},
{2, new Person("Fritz","Huber")},
{3, new Person("Helga","die Schreckliche")},
},
new String[] {
"Nr.", "Person"
}
));
MyPersonRenderer renderer=new MyPersonRenderer();
//table.setDefaultRenderer(Person.class, renderer); //Wird nicht erkannt
//table.setDefaultRenderer(Object.class, renderer); //Erkennt natürlich auch die erste Spalte
table.getColumnModel().getColumn(1).setCellRenderer(renderer); //Erzielt das gewünschte ergebnis
scrollPane.setViewportView(table);
}
}