Oto zrzut ekranu, co chcę zrobić:Making klikalny JButton wewnątrz JTable
Co się tam dzieje jest JButton pokazuje poprawnie, ale nic się nie dzieje po kliknięciu na nim. Po pewnym poszukiwań, znalazłem, że Object
zwrócony przez table.getValueAt()
jest String zamiast JButton ...
Oto kod:
tblResult = new JTable(data,cols) {
public TableCellRenderer getCellRenderer(int row, int column) {
return new ClientsTableRenderer();
}
};
Używam tego do wypełniania w czasie wykonywania JTable: (tblResult
jest teraz Clients.rblResult
)
SwingUtilities.invokeLater(new Runnable() {
public void run() {
DefaultTableModel aModel = new DefaultTableModel() {
//setting the jtable read only
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
String[] cols = {"N°","Société", "TVA", "CP", "Ville", ""};
aModel.setColumnIdentifiers(cols);
Object[] temp = new Object[6];
for(int i=0;i<result.length;i++) {
temp[0] = result[i].custNumber;
temp[1] = result[i].name;
temp[2] = result[i].tva;
temp[3] = result[i].cp;
temp[4] = result[i].city;
temp[5] = "Consulter";
aModel.addRow(temp);
}
Clients.tblResult.setModel(aModel);
Clients.tblResult.addMouseListener(new JTableButtonMouseListener(Clients.tblResult));
}}
);
Tutaj ClientsTableRenderer
klasa
public class ClientsTableRenderer extends JPanel implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(final JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setBackground(Color.WHITE);
if(column < 5) {
JLabel label = new JLabel(value.toString());
JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER,0,9));
panel.setBackground(Color.WHITE);
panel.add(label);
this.add(panel);
} else {
JButton button = new JButton(value.toString());
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("Clicked !");
}
});
JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER,0,3));
panel.setBackground(Color.WHITE);
panel.add(button);
this.add(panel);
}
return this;
}
}
I wreszcie, JTableButtonMouseListener():
public class JTableButtonMouseListener extends MouseAdapter {
private final JTable table;
public JTableButtonMouseListener(JTable table) {
this.table = table;
}
@Override public void mouseClicked(MouseEvent e) {
int column = table.getColumnModel().getColumnIndexAtX(e.getX());
int row = e.getY()/table.getRowHeight();
System.out.println("Col :"+column + "row:"+row);
if (row < table.getRowCount() && row >= 0 && column < table.getColumnCount() && column >= 0) {
Object value = table.getValueAt(row, column);
System.out.println("Value :"+value.getClass().getName());
if (value instanceof JButton) {
((JButton)value).doClick();
}
}
}
}
jestem uprzejmie nowy Java, pomoc będzie bardzo mile widziane :)
Z góry dzięki!
value.getClass()? Zwraca również "java.lang.String" – noli
CellRenderer są używane tylko do "pomalowania" tabeli, nie są ustawione jako "Komponenty aktywne". getValueAt zwraca wartość TableModel, a nie komponentu, więc prawdopodobnie zwróci "Consulter" –
Tak właśnie myślałem. Czy istnieje jednak sposób, aby to naprawić? – noli