【发布时间】:2010-11-29 17:53:12
【问题描述】:
如何在netbeans的Jtable的单元格中添加按钮???
【问题讨论】:
标签: java swing netbeans6.7
如何在netbeans的Jtable的单元格中添加按钮???
【问题讨论】:
标签: java swing netbeans6.7
Table Button Column 显示一种方式。
【讨论】:
您需要添加自定义单元格渲染器,重新定位表格中的一些事件并在按钮状态更改时重新绘制单元格。这很邪恶,很讨厌,但可以做到。
【讨论】:
如Button Table Example 所示,我们将创建一个扩展JButton 并实现TableCellRenderer 的类。
class ButtonRenderer extends JButton implements TableCellRenderer {
public ButtonRenderer() {
setOpaque(true);
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (isSelected) {
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
} else {
setForeground(table.getForeground());
setBackground(UIManager.getColor("Button.background"));
}
setText((value == null) ? "" : value.toString());
return this;
}
}
然后您还需要为该列创建一个单元格编辑器。
class ButtonEditor extends DefaultCellEditor {
protected JButton button;
private String label;
private boolean isPushed;
public ButtonEditor(JCheckBox checkBox) {
super(checkBox);
button = new JButton();
button.setOpaque(true);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
fireEditingStopped();
}
});
}
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
if (isSelected) {
button.setForeground(table.getSelectionForeground());
button.setBackground(table.getSelectionBackground());
} else {
button.setForeground(table.getForeground());
button.setBackground(table.getBackground());
}
label = (value == null) ? "" : value.toString();
button.setText(label);
isPushed = true;
return button;
}
public Object getCellEditorValue() {
if (isPushed) {
//
//
JOptionPane.showMessageDialog(button, label + ": Ouch!");
// System.out.println(label + ": Ouch!");
}
isPushed = false;
return new String(label);
}
public boolean stopCellEditing() {
isPushed = false;
return super.stopCellEditing();
}
protected void fireEditingStopped() {
super.fireEditingStopped();
}
}
然后,我们将设置ButtonRender 的实例作为该列的单元格渲染,并将 ButtonEditor 的实例设置为单元格编辑器。
\\"Button" is the column name
table.getColumn("Button").setCellRenderer(new ButtonRenderer());
table.getColumn("Button").setCellEditor(
new ButtonEditor(new JCheckBox()));
提供的链接中的example 有完整的可运行示例。
【讨论】: