问题描述
以下是我想要做的截图:
Here is the screenshot of what I want to do :
正在发生的事情是JButton正确显示但是当我点击它时没有任何反应。
经过一些搜索,我发现 table.getValueAt()
返回的 Object
是一个字符串而不是JButton ...
What's happening there is the JButton shows correctly but nothing happens when I click on it.After some search, I've found that the Object
returned by table.getValueAt()
is a String instead of a JButton...
以下是代码:
tblResult = new JTable(data,cols) {
public TableCellRenderer getCellRenderer( int row, int column ) {
return new ClientsTableRenderer();
}
};
我用它在运行时填充JTable:
( tblResult
现在 Clients.rblResult
)
I use this for populating at run-time the JTable :(tblResult
is now 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));
}}
);
此处 ClientsTableRenderer
class
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;
}
}
最后, JTableButtonMouseListener():
And finaly, the 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();
}
}
}
}
我是Java新手,非常感谢帮助:)
I'm kindly new to Java, help would be very much appreciated :)
提前致谢!
推荐答案
此 Rob Camick可能会满足您的需求。
This Table Button Column from Rob Camick may fit your needs.
这篇关于在JBable中使JButton可单击的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!