JTable 中的按钮无法执行操作



我有一个JTable,我在每行中插入了两个按钮(删除,搜索)。对于每个按钮,我在构造函数中指定正确的操作,如下所示:

        Action search = new AbstractAction() {
        public void actionPerformed(ActionEvent e) {
            JTable table = (JTable) e.getSource();
            int modelRow = Integer.valueOf(e.getActionCommand());
            System.out.println("Search action for row: " + modelRow);
            // do some processing here
            // tb.searchMore(modelRow);
        }
    };

然后我指定按钮应该像这样创建到哪一列:

    // column 4 of JTable table should implement action 'search'
    ButtonColumn searchButtonColumn = new ButtonColumn(table, search, 4);
    searchButtonColumn.setMnemonic(KeyEvent.VK_D);

我有一个合适的按钮渲染器类。删除按钮(以完全相同的方式创建和初始化)工作正常。我为另一个表创建的类似保存按钮也是如此。问题出在搜索按钮上。它在表格中创建图形按钮,但永远不会实际调用其操作。我注意到当我将其放在第一列以外的列中时会发生这种情况。对这种奇怪的行为有什么想法吗?我放置它的列并没有越界。在同一行中放置两个按钮有问题吗?

下面是按钮渲染器代码:

public class ButtonColumn extends AbstractCellEditor
    implements TableCellRenderer, TableCellEditor, ActionListener, MouseListener {
private JTable table;
private Action action;
private int mnemonic;
private Border originalBorder;
private Border focusBorder;
private JButton renderButton;
private JButton editButton;
private Object editorValue;
private boolean isButtonColumnEditor;
/**
 *  Create the ButtonColumn to be used as a renderer and editor. The
 *  renderer and editor will automatically be installed on the TableColumn
 *  of the specified column.
 *
 *  @param table the table containing the button renderer/editor
 *  @param action the Action to be invoked when the button is invoked
 *  @param column the column to which the button renderer/editor is added
 */
public ButtonColumn(JTable table, Action action, int column) {
    this.table = table;
    this.action = action;
    renderButton = new JButton();
    editButton = new JButton();
    editButton.setFocusPainted(false);
    editButton.addActionListener(this);
    originalBorder = editButton.getBorder();
    setFocusBorder(new LineBorder(Color.BLUE));
    TableColumnModel columnModel = table.getColumnModel();
    columnModel.getColumn(column).setCellRenderer(this);
    columnModel.getColumn(column).setCellEditor(this);
    table.addMouseListener(this);
}
/**
 *  Get foreground color of the button when the cell has focus
 *
 *  @return the foreground color
 */
public Border getFocusBorder() {
    return focusBorder;
}
/**
 *  The foreground color of the button when the cell has focus
 *
 *  @param focusBorder the foreground color
 */
public void setFocusBorder(Border focusBorder) {
    this.focusBorder = focusBorder;
    editButton.setBorder(focusBorder);
}
public int getMnemonic() {
    return mnemonic;
}
/**
 *  The mnemonic to activate the button when the cell has focus
 *
 *  @param mnemonic the mnemonic
 */
public void setMnemonic(int mnemonic) {
    this.mnemonic = mnemonic;
    renderButton.setMnemonic(mnemonic);
    editButton.setMnemonic(mnemonic);
}
@Override
public Component getTableCellEditorComponent(
        JTable table, Object value, boolean isSelected, int row, int column) {
    if (value == null) {
        editButton.setText("");
        editButton.setIcon(null);
    } else if (value instanceof Icon) {
        editButton.setText("");
        editButton.setIcon((Icon) value);
    } else {
        editButton.setText(value.toString());
        editButton.setIcon(null);
    }
    this.editorValue = value;
    return editButton;
}
@Override
public Object getCellEditorValue() {
    return editorValue;
}
//
//  Implement TableCellRenderer interface
//
public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int  column) {
    if (isSelected) {
        renderButton.setForeground(table.getSelectionForeground());
        renderButton.setBackground(table.getSelectionBackground());
    } else {
        renderButton.setForeground(table.getForeground());
        renderButton.setBackground(UIManager.getColor("Button.background"));
    }
    if (hasFocus) {
        renderButton.setBorder(focusBorder);
    } else {
        renderButton.setBorder(originalBorder);
    }
//      renderButton.setText( (value == null) ? "" : value.toString() );
    if (value == null) {
        renderButton.setText("");
        renderButton.setIcon(null);
    } else if (value instanceof Icon) {
        renderButton.setText("");
        renderButton.setIcon((Icon) value);
    } else {
        renderButton.setText(value.toString());
        renderButton.setIcon(null);
    }
    return renderButton;
}
//
//  Implement ActionListener interface
//
/*
 *  The button has been pressed. Stop editing and invoke the custom Action
 */
public void actionPerformed(ActionEvent e) {
    int row = table.convertRowIndexToModel(table.getEditingRow());
    fireEditingStopped();
    //  Invoke the Action
    ActionEvent event = new ActionEvent(table,
            ActionEvent.ACTION_PERFORMED, "" + row);
    action.actionPerformed(event);
}
//
//  Implement MouseListener interface
//
/*
 *  When the mouse is pressed the editor is invoked. If you then then drag
 *  the mouse to another cell before releasing it, the editor is still
 *  active. Make sure editing is stopped when the mouse is released.
 */
public void mousePressed(MouseEvent e) {
    if (table.isEditing()
            && table.getCellEditor() == this) {
        isButtonColumnEditor = true;
    }
}
public void mouseReleased(MouseEvent e) {
    if (isButtonColumnEditor
            && table.isEditing()) {
        table.getCellEditor().stopCellEditing();
    }
    isButtonColumnEditor = false;
}
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
}

我猜你忘了将动作命令设置为渲染的按钮。您在操作中依赖该命令。尝试类似的东西

editButton.setActionCommand(String.valueOf(column));

在单元格渲染器中。

最新更新