Dưới đây là ảnh chụp màn hình của những gì tôi muốn làm:Làm một nhấp được JButton bên trong một JTable
gì đang xảy ra ở đó là JButton cho thấy một cách chính xác nhưng có gì xảy ra khi tôi bấm vào nó. Sau khi một số tìm kiếm, tôi đã phát hiện ra rằng Object
trả về bởi table.getValueAt()
là một chuỗi thay vì một JButton ...
Đây là mã:
tblResult = new JTable(data,cols) {
public TableCellRenderer getCellRenderer(int row, int column) {
return new ClientsTableRenderer();
}
};
tôi sử dụng này cho Populating tại thời gian chạy các JTable: (tblResult
tại Clients.rblResult
là)
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));
}}
);
Ở đây ClientsTableRenderer
lớp
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;
}
}
và cuối cùng, các 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();
}
}
}
}
Tôi vui lòng mới cho Java, trợ giúp sẽ được rất nhiều đánh giá cao :)
Cảm ơn trước!
value.getClass()? Nó cũng trả về "java.lang.String" – noli
CellRenderer chỉ được sử dụng để "vẽ" bảng, chúng không được đặt là "Thành phần trực tiếp". getValueAt trả về một giá trị của TableModel, không phải là một thành phần, vì vậy nó có thể sẽ trả về "Consulter" –
Đó là những gì tôi nghĩ. Tuy nhiên, có cách nào để sửa chữa nó? – noli